confd+etcd+nginx 实现简单服务发现

一。项目背景#

随着微服务的兴起,大量接口服务化。当新的微服务加入或微服务的信息发生变更时,服务方如何通知周边系统、使用方如何知道这些变更呢?

这时就需要服务的注册配置和发现功能。

服务注册配置 —— 存储的信息至少包括正在运行的服务的主机和端口信息
服务发现 —— 允许其他用户可以发现在服务注册配置阶段存储的信息

二. Confd 简介#

Confd 是一个轻量级的配置管理工具。Confd 通过读取后端存储的配置信息来动态更新对应的配置文件,对应的后端存储可以是 etcd、consul、vault、environment variables、redis、zookeeper、dynamodb、stackengine、rancher 等,其中 etcd 的 v3 版本对应的存储后端为 etcdv3。目前常用的存储是 etcd。

三. etcd 简介#

etcd 是 CoreOS 团队于 2013 年 6 月发起的开源项目,它的目标是构建一个高可用的分布式键值 (key-value) 数据库。etcd 内部采用 raft 协议作为一致性算法,etcd 基于 Go 语言实现。

etcd 作为服务发现系统,有以下的特点:

简单:安装配置简单,而且提供了 HTTP API 进行交互,使用也很简单
安全:支持 SSL 证书验证
快速:根据官方提供的 benchmark 数据,单实例支持每秒 2k + 读操作
可靠:采用 raft 算法,实现分布式系统数据的可用性和一致性
etcd 项目地址:https://github.com/coreos/etcd/

四. etcd+conf+nginx 架构图#

confd+etcd+nginx 实现简单服务发现

五。环境安装(自己需要启动 etcd 与 nginx)#

1.etcd#

brew install etcd

2.nginx#

brew install nginx

3.confd#

请先在下载地址下载 confd-0.16.0-darwin-amd64 文件 并添加执行权限

六。使用教程#

编辑 confd 配置文件

mkdir -p /etc/confd/{conf.d,templates}
touch /etc/confd/conf.d/myconfig.toml 

编辑 myconfig.toml 文件

[template]
//模板文件
src = "nginx.tmpl"
//生成nginx的配置目录文件
dest = "/usr/local/nginx/conf/conf.d/upstream.conf"

//监控KEY的改变,改变会自动重新生成nginx配置并重启
keys = [ 
        "/portal",
        "/portal-upstream", 
        "/openapi",
        "/openapi-upstream", 
        "/gateway",
        "/gateway-upstream", 
]

owner = "root"//当前用户
mode = "0644"

check_cmd = "nginx -t"//执行命令
reload_cmd = "nginx -s reload"//执行命令

配置用于生成 upstream 的模板文件

upstream {{getv "/portal"}} {
 {{range getvs "/portal-upstream/*"}}
    server {{.}};
 {{end}}
}
upstream {{getv "/openapi"}} {
 {{range getvs "/openapi-upstream/*"}}
    server {{.}};
 {{end}}
}
upstream {{getv "/gateway"}} {
 {{range getvs "/gateway-upstream/*"}}
    server {{.}};
 {{end}}
}

修改 nginx 的配置文件

include /usr/local/nginx/conf/conf.d/*.conf

增加 etcd 数据

etcdctl set /portal portal
etcdctl set /portal-upstream/portal01 192.168.81.11:30400
etcdctl set /openapi openapi
etcdctl set /openapi-upstream/openapi01 192.168.81.11:30600
etcdctl set /gateway gateway
etcdctl set /gateway-upstream/gateway01 192.168.81.11:30000

启动 confd 监控 etcd
confd 支持两种运行方式,即 daemon 和 onetime。在守护程序模式下,confd 轮询后端以进行更改,并在必要时更新目标配置文件。

confd -onetime -backend etcd -node http://127.0.0.1:2379

查看 nginx 是否生成配置文件

cat /usr/local/nginx/conf/conf.d/upstream.conf
upstream portal {
    server 192.168.81.11:30400
}
upstream openapi {
    server 192.168.81.11:30600
}
upstream gateway {
    server 192.168.81.11:30000
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。