服务注册和发现组件-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"
        }
    }
}

有几点注意:

  1. 默认的address是本机,所以这个文件中没有添加这一字段,真正使用时,一半不会是这个场景,就需要添加
  2. tag是帮助一些接口快速归类找到该服务的
  3. 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
posted @ 2020-03-31 21:05  mosakashaka  阅读(263)  评论(0编辑  收藏  举报