服务注册和发现组件-consul
主要功能
consul主要功能是服务的注册和发现功能,通过consul服务,可以配置服务信息。
consul提供了DNS和HTTP API两套接口,外界可以通过这两种接口查询服务的实际地址。
基本介绍
consul在多个平台上提供了已经编译好的包。测试时以ubuntu为例。
安装consul并不是通过apt这样的包管理程序,而是直接下载官网的zip压缩包,将可执行程序consul解压到/usr/local/bin
中使用。
consul作为一个发现服务,自带了高可用的部分,一个服务可以作为一个cluster
对外提供服务,一个cluster包含多个agent
,一个agent就是一个consul运行的进程。
每个agent可以以server
或者client
模式运行。两者不同之处在于client的信息查询自server,不同server间构成了一个高可用服务,client仅仅作为服务入口,实际查询操作在server端执行。
有一个疑问在于,consul的多个agent节点的ip,外界如何动态识别,虽然每个都可以使用,但是如果使用的节点down掉,还是起不到高可用效果。所以估计生产环境,前面可能还是需要一个反向代理。。。
功能使用
一个server+一个client
启动server:
consul agent -server -data-dir /tmp/consul -bootstrap-expect 1
-server
: server模式。cluster至少需要1个server,建议是3-5个-bootstrap-expect
: 一个cluster构成时需要至少多少个server,不加这个选项,会没有一个leading cluster
,构不成cluster
启动client:
consul agent -data-dir /tmp/consul -client 192.168.199.11 -ui -join 192.168.199.4 -config-dir config.d
-client
: client模式运行。后面紧跟ip是client监听端口,默认是只监听loopback的,所以这里要配置-ui
:加上这个参数,启动的agent会在8500端口提供一个可访问的页面,可以查看当前所有service的状态-join
: 加入一个cluster,指定cluster中任意一个agent的地址即可-config-dir
:服务配置地址,在这个目录中,所有文件会被识别并解析,文件中定义consul的服务。
服务定义
以上一个例子-config-dir
中的一个文件web.json
为例。
我在client机器上,安装了apache2这个webserver,默认开放了80端口。
通过web.json
定义该服务,名称为web server
{
"service": {
"name": "web",
"port": 80,
"tags": ["apache", "demonstration"],
"check": {
"args": ["curl", "localhost:80"],
"interval": "30s"
}
}
}
有几点注意:
- 默认的
address
是本机,所以这个文件中没有添加这一字段,真正使用时,一半不会是这个场景,就需要添加 - tag是帮助一些接口快速归类找到该服务的
- check:通过执行命令,consul定期检查服务健壮性。如果多次失败,则consul在外界询问时,不会提供该服务信息。
服务发现
HTTP API 形式
通过http请求查询服务信息,通过curl命令:
curl http://localhost:8500/v1/catalog/service/web
其中web是服务名称。
获得如下响应:
[{"ID":"f0e5f378-0689-3fb3-07ab-af6b08c3561b","Node":"mosaka2","Address":"192.168.199.11","Datacenter":"dc1","TaggedAddresses":{"lan":"192.168.199.11","wan":"192.168.199.11"},"NodeMeta":{"consul-network-segment":""},"ServiceKind":"","ServiceID":"web","ServiceName":"web","ServiceTags":["apache","demonstration"],"ServiceAddress":"","ServiceWeights":{"Passing":1,"Warning":1},"ServiceMeta":{},"ServicePort":80,"ServiceEnableTagOverride":false,"ServiceProxyDestination":"","ServiceProxy":{},"ServiceConnect":{},"CreateIndex":781,"ModifyIndex":781}]
DNS形式
通过dig命令测试:
dig @127.0.0.1 -p 8600 web.service.consul
其中web.service.consul
中,web是代表服务名,service代表查询的是服务信息,consul是查询的命名空间
可以得到类似如下的标准dns响应:
; <<>> DiG 9.11.3-1ubuntu1.5-Ubuntu <<>> @127.0.0.1 -p 8600 web.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9064
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;web.service.consul. IN A
;; ANSWER SECTION:
web.service.consul. 0 IN A 192.168.199.11
;; ADDITIONAL SECTION:
web.service.consul. 0 IN TXT "consul-network-segment="
;; Query time: 0 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Wed Feb 27 08:21:29 UTC 2019
;; MSG SIZE rcvd: 99