Blogs

一个http查询代理说明go语言context的基本用法

December 23, 2018

首先他们无视于你,而后是嘲笑你,接着是批斗你,再来就是你的胜利之日。–甘地 因为golang在创建goroutine的时候不会像C语言创建进程线程那样返回一个pid或theard_id,这样就没办法很方便的管理每个gorouting, 如果各个goroutine中还存在相互调用的情况,那么管理这些goroutine将会变的非常困难, context包就提供了一种统一管理gorouinte,以及在goroutine之间安全传递参数的方法 实例说明 查询操作通常会耗费比较长的时间,使用一个代理服务器来管理查询可以降低服务器的压力, 还可以方便的对客户端进行一些前期的管理,参考blog.golang.org上的example。 main.go func main() { log.SetFlags(log.Ltime | log.Lshortfile) router := httprouter.New() router.GET("/search", handler.Search) http.ListenAndServe(":8000", router) } 创建一个简单的http服务,提供/search路由。 userip/userip.go const userIPKey int = 1 func SetValueWithContext(ctx context.Context, userIP string) context.Context { return context.WithValue(ctx, userIPKey, userIP) } func GetValueWithContext(ctx context.Context) (string, bool) { userIP, ok := ctx.Value(userIPKey).(string) if !ok { return "", false } return userIP, true } 实现context的Get/Set方法,即通过context在goroutine间传递参数 ... Read more …

linux内核参数rp_filter对策略路由的影响

December 16, 2018

爱国主义就是积极地为了微不足道的原因杀人并被杀。——勃特兰·罗素 linux内核参数rp_filter对策略路由的影响 环境说明 vpn软件如openvpn,wireguard等,通过配置这样两条路由 0.0.0.0/1 via vpn_gateway dev tun0 128.0.0.0/1 via vpn_gateway dev tun0 来实现全局路由,这两条路由的含义如下: 0.0.0.0/128.0.0.0 = 0.0.0.0/1 = 0.0.0.0 TO 127.255.255.255 128.0.0.0/128.0.0.0 = 128.0.0.0/1 = 128.0.0.0 TO 255.255.255.255 即除了127.0.0.0这个网络外的所有流量都通过VPN出去。 如果只想特定的流量通过vpn,我们可以这样配置,例如只让8.8.8.8通过vpn //为路由表vpn_route_table添加默认路由 $ ip route add default via vpn_gateway dev tun0 table vpn_route_table //添加策略,只有fwmark为0xffff的数据包使用vpn_route_table查询路由 $ ip rule add fwmark 0xffff table vpn_route_table //在mangle表中的OUTPUT链上为目的地址为8.8.8.8的数据包打上标签 $ iptables -t mangle -A OUTPUT -d 8.8.8.8 -j MARK --set-mark 0xffff //以下配置是为了将mark设置到整个网络连接过程中 $ iptables -t mangle -A OUTPUT -j CONNMARK --save-mark $ iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark //为tun0接口设置nat $ iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE 配置完成后,发现不能正常访问8. ... Read more …

golang操作unix系统信号

December 9, 2018

你在活着的同时,也在学习着,无论如何,你活着。–道格拉斯·亚当斯 golang操作unix系统信号 什么是信号 在计算机科学中,信号(英语:Signals)是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。 它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程, 此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。 linux系统有哪些信号 $ kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1 64) SIGRTMAX 信号的产生方式 ... Read more …

使用unbound搭建DNS服务器,配置缓存以及防止DNS污染

November 25, 2018

真理是时间之产物,而不是权威之产物 ——弗兰西斯·培根 使用unbound搭建DNS服务器,配置缓存以及防止DNS污染 Unbound is a validating, recursive, caching DNS resolver. It is designed to be fast and lean and incorporates modern features based on open standards. 搭建环境 ubuntu_server16.04 1Core, 1G 能够通过代理访问国外DNS服务器(8.8.8.8,1.1.1.1等),因为如果直接通过国内路线访问上述DNS,某些域名会得到错误的ip地址。 安装unbound 源码安装:下载unbound,更具官方教程安装 仓库安装: $ sudo apt-get update $ sudo apt-get install unbound 配置unbound unbound安装完成后会在/etc/unbound目录下生成相应的配置文件 配置基本功能,在/etc/unbound/unbound.conf文件中增加如下内容: server: verbosity: 1 num-threads: 2 #线程数,设置与cpu核数相同,可提高unbound的cpu利用率 interface: 0.0.0.0 #监听地址,如果只想某一网络访问,填写该对应ip即可 interface: ::0 #ipv6配置,同上 port: 53 #端口 so-reuseport: yes #为每个线程的传入查询打开专用侦听套接字。可以更均匀地将传入查询分布到线程 cache-min-ttl: 60 #解析最小缓存时间 cache-max-ttl: 600 #解析最大缓存时间 outgoing-range: 8192 access-control: 192. ... Read more …

Nginx学习笔记之简介与编译指南

November 18, 2018

身为一个中国人,最大的痛苦是忍受别人“推己及人”的次数,比世界上任何地方的人都要多。–王小波 nginx主要应用场景 nginx一般作为网络的边缘节点,主要有以下三个应用场景 静态资源服务器 使用nginx提供本地文件的网络访问服务 反向代理服务器 缓存:缓存上游服务的不常改变的内容,直接由nginx提供,减少用户访问时延。 负载均衡服务器:方便动态扩容,和容灾,提高服务的可用和可靠性。 高性能API服务器:当应用服务的性能达到瓶颈,可使用nginx和nginx支持动态语言(如JavaScript,Lua),由nginx直接访问缓存服务和数据库服务,直接提供API功能,或者作为web防火墙,如OpenResty等。 nginx的四个主要的组成部分 nginx二进制可执行文件:nginx与其模块编译生成的文件 nginx.conf配置文件:控制nginx的行为 access.log访问日志:记录每一条http请求信息 error.log错误日志:定位错误发生位置 版本选择 官方开源版本:推荐使用的版本,源代码开放,可根据业务需求灵活配置。 官方商业版本:在整合第三方模块,运营监控,技术支持上有很多优点,缺点就是不开源。 Tengine:阿里巴巴出品,虽然很多特性领先于官方版本,但无法与nginx同步升级,如无特定需求,不推荐使用。 OpenResty开源版:使用lua语言开发第三方模块,兼具高性能和高开发效率。 OpenResty商业版:OpenResty的商业版本,开箱即用。 编译指南 为了方便添加第三方模块,编译安装的方式比从直接软件仓库安装更常用。 源代码下载:从nginx.org下载nginx源代码 源代码目录结构 total 764 drwxr-xr-x 8 ubuntu ubuntu 4096 Nov 6 21:52 ./ drwxrwxr-x 3 ubuntu ubuntu 4096 Nov 18 18:13 ../ drwxr-xr-x 6 ubuntu ubuntu 4096 Nov 18 18:13 auto/ -rw-r--r-- 1 ubuntu ubuntu 287441 Nov 6 21:52 CHANGES -rw-r--r-- 1 ubuntu ubuntu 438114 Nov 6 21:52 CHANGES. ... Read more …

使用wireguard搭建VPN服务

November 11, 2018

活了一百年却只能记住30M字节是荒谬的。你知道,这比一张压缩盘还要少。人类境况正在变得日趋退。–Marvin Minsky 使用wireguard搭建VPN服务 wireguard是一款新型的,快速的,安全的VPN软件,将来可能会正式并入linux内核。wireguard搭建十分简单,不需要像strongswan,openvpn那样配置繁琐的认证证书,以及网络接口,总的配置文件也不会超过50行。 安装wireguard $ sudo add-apt-repository ppa:wireguard/wireguard $ sudo apt-get update $ sudo apt-get install wireguard 生成密钥对 wg genkey | tee privatekey | wg pubkey > publickey 命令执行完成后,将在当前目录下生成privateKey, publicKey两个文件,分别包含了公钥和私钥 开启内核转发 编辑/etc/sysctl.conf文件,找到net.ipv4.ip_forward=1,并去掉这一行的注释 配置文件编写 在/etc/wireguard/目录下,新建文件wg0.conf, 文件名字可以任意取,文件内容如下: [Interface] //本端信息 Address = 192.168.142.1/32 //本端ip SaveConfig = true PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE ListenPort = 56632 //监听端口,任意指定即可 PrivateKey = //服务端的私钥 [Peer] //对端信息 PublicKey = //对端的公钥,即客户端的公钥,每个客户端也需要生成一对公私钥。 AllowedIPs = 192. ... Read more …

使用kubeadmin搭建kubernetes集群(一)

November 5, 2018

没有一个人的记性,好到可以作个成功的说谎者——林肯 想在vps上搭建一个kubernetes单节点Demo,遇到很多问题,仍未搭建完成。如果仅是用来测试的话,建议使用minikube+virtualBox安装。 使用kubeadmin搭建kubernetes集群(一) 安装环境 · Ubuntu16.04 · 2GB RAM . 能够访问google的网络环境(非常重要) master节点占用的端口: 协议 流向 端口号 用途 占用组件 TCP 入站 6443 kubernetes API server all TCP 入站 2379-2380 etcd server client API kube-apiserver, etcd TCP 入站 10250 Kubelet API Self, Control plane TCP 入站 10251 kube-scheduler self worker节点占用的端口: 协议 流向 端口号 用途 占用组件 TCP 入站 10250 Kubelet API Self, Control plane TCP 入站 30000-32767 NodePort Services** All 安装docker . ... Read more …

三种主流的云服务模式以及应用部署模式的变迁

November 5, 2018

一个人知道自己为什么而活,就可以忍受任何一种生活。——尼采 得益于虚拟化和分布式技术的发展,使得人们有能力将计算机硬件资源虚拟成软件或者服务的形式,从而提供给用户使用,并做到统一的编排管理,不但提高了计算资源的整体利用率,更极大的降低了企业的资本性成本和人力成本,随着云计算技术的应用和发展,云服务的服务模式也有了一些定义。 IaaS, PaaS, SaaS三大云服务模式 IaaS(Infrastructure-as-a-Service): 基础设施及服务:主要体现在弹性和虚拟化方面,纯粹的将硬件资源抽象成服务,提供给用户CPU,内存,硬盘,网络等硬件资源,用户需要在其之上构建自己的服务场景,并且可以根据业务运行状况进行拓展或收缩。 PaaS(Platform-as-a-Service): 平台即服务:核心是计算平台和解决方案堆。计算平台并不是指软件本身,而是指构建并运行软件的平台;解决方案堆由应用程序组成,这些应用程序有助于开发过程和应用程序部署,这些应用程序是指操作系统、运行时环境、源代码控制存储库和必需的所有其他中间件;PaaS主要的服务对象是程序开发者,提供用户使用一种程序的运行环境,比如说php,java,或者.net。从而减少开发人与维护运行环境的成本。 SaaS(Software-as-a-Service): 软件即服务:为软件提供基于网络的访问。SaaS为用户提供了一种降低软件使用成本的方法,按需求使用软件而不是购买完整的软件生命周期。提高了用户付费的体验,同时减少了用户寻求技术支持的频率(部署发布敏捷,bug可被迅速修复),降低了开发者的适配成本。 应用部署模式的变迁 物理单机(IBM,SUN ~2000): 在商用服务计算领域几乎都是以单机作为基础计算单元对计算资源进行管理和协调控制,新部署程序往往需要购买一台新的物理机器。程序直接在物理机上构建,部署,运行。 虚拟化(AWS,GCE,Azure,Aliyun 2001~2009): VMware最先发布了针对服务器市场的虚拟化技术解决方案,提高了资源的利用率,降低了使用成本。而后VMware,Xen,KVM三足鼎立,拉开了虚拟化云计算的大幕。基础计算单元变成了VM,服务的构建,部署,运行逐步迁移到VM上。 虚拟化:成熟期(OpenStack 2010~now) 部署形式:公有云,私有云,混合云。 服务模式:Iaas,PaaS,SaaS。 容器化(Docker 2013~now) Docker将已有技术整合包装,统一标准。 与VM相比,容器具有开发交付流程操作对象同步,执行效率更高,资源占用更少等优势。 计算单元从VM变成容器。 云原生(kubernetes 2015~now) 以容器为基础,借助容器自动化管理平台进行动态编排和资源优化利用。 参考资料: IBM开发者developerworks云计算服务模式

MAIL.RU百万级消息推送系统设计优化思路

October 22, 2018

过早的优化是万恶之源——Donald Knuth MAIL.RU是来自俄罗斯一家互联网公司,主要业务有电子邮件,即时通讯,和网络游戏。其工程师SergeyKamardin在habr论坛上发表了一篇名为A Million WebSockets and Go 的文章,详细的说明了该系统的设计和优化思路。 简介: MAIL.RU有很多关于用户状态的系统,其中有很多的信息需要推送给用户,他们普遍采用的是通过定期轮询的方式获取这些状态信息,这种方式会导致服务器处理很多无效的请求,从而增加服务器的负载(通常为每秒50000个请求),为了能让用户更快的接受到这些通知,他们决定从新设计实现一个publisher-subscriber服务,他们称之为Bus模式。用来接送服务状态的变化,并推送给订阅者。 传统模式与Bus模式的架构对比 传统模式 +-----------+ +-----------+ +-----------+ | | ◄-------+ | | ◄-------+ | | | Storage | | API | HTTP | Browser | | | +-------► | | +-------► | | +-----------+ +-----------+ +-----------+ 邮件存储Storage将通知传递给API模块,浏览器通过轮询的方式从API接口获取通知,这导致大部分(60%)的HTTP响应代码304,即没有新的状态变化通知。 Bus模式 +-------------+ +---------+ WebSocket +-----------+ | Storage | | API * | +-----------► | Browser | +-------------+ +---------+ (3) +-----------+ + (2) ▲ | | (1) ▼ + +---------------------------------+ | Bus | +---------------------------------+ 浏览器与API服务器建立websock连接,API服务将作为Bus的客户端,并将订阅者的信息发送给Bus(告知Bus和Storage监听哪些订阅者的状态变化),当有新的通知到达时,Storage将通知传递给Bus,Bus再将通知发送给他的订阅者即API,API决定把通知发送给那个一个连接,并通过websocket发送通知。 ... Read more …

如何使用Hugo和GithubPages搭建和管理个人博客

October 14, 2018

死会引人哭泣。虽则如此,人生的三分之一却在睡眠中打发掉了。——拜伦 Hugo是由Go语言实现的静态网站生成。 具有简单、易用、高效、易扩展、快速部署等优点。可将markdown格式的文本结合自定义的主题生成静态的html。 GithubPages是一个静态站点托管服务,旨在直接从GitHub存储库托管您的个人,组织或项目页面。 Hugo+GithubPages的方案相比于传统的博客系统有以下优点: 低成本:  无需单独购买VSP服务器或者域名空间,并且不限流量。 高度定制化:可以方便的定义网站功能模块,增加个性化功能。 方便管理:  由于不需要使用数据库,所有数据均以md形式保存,可直接使用git 行管理,对于博客系统尤其适用。 更专业:  对于开源项目的文档,可以使用git与项目版本同步。 安装Hugo: 使用yum, apt-get, brew安装 通过源码安装 安装golang,并配置$GOPATH 编译安装hugo $ git clone https://github.com/gohugoio/hugo.git $ cd hugo $ go install $ which hugo //验证安装 如何使用Hugo: 创建博客模板 $ hugo new site blog //创建一个新站点 $ cd blog $ tree blog #blog #├── archetypes #│ └── default. ... Read more …