概述
前面我们把服务发现和dtab规则从linkerd放到了namerd中。然而在namerd中我们所用的服务发现都是基于文件系统的io.l5d.fs。接下来我们把服务注册和发现放到consul中,实现动态服务注册和发现机制。
安装consul
1、下载对应操作系统的consul版本
2、解压
$ unzip
consul_1.0.7_linux_amd64.zip
3、添加可执行权限
$ chomod u+x consul
4、启动consul,作为示例,我们以agent方式启动
$ ./consul agent -dev -ui -node=consul-dev -client=127.0.0.1
5、访问consul admin控制台
打开浏览器,访问:http://127.0.0.1:8500

在consul中注册服务
还记得我们之前用ngnix搭建了一个基本的服务提供者,接下来我们要把这个服务注册到consul中。在consul中注册服务有多种方式,可以使用配置文件,也可以使用http api。注册的内容格式如下:
{"service":{"id": "test","name": "test","address": "127.0.0.1","port": 80,"tags": ["dev"]}}
上述json描述了我们要注册一个id为test,名字为test的服务,提供了它的ip地址和端口。并且为这个服务打了tag “dev”。
在consul里面我们可以注册多个同名的服务,但是id要确保是唯一的,否则配置将会被覆盖。
1、配置文件方式注册服务,先关闭之前启动的consul
$ ./consul leave
2、创建配置文件目录
$ mkdir consul.d
3、创建服务注册配置
$ vi test.json
{"service":{"id": "test","name": "test","address": "127.0.0.1","port": 80,"tags": ["dev"]}}
4、指定参数:-config-dir 方式启动consul
$ ./consul agent -dev -ui -node=consul-dev -client=127.0.0.1
-config-dir consul.d
5、查看consul admin
我们看到test服务成功注册到了consul。

我们还可以直接使用consul 提供的http api,通过curl快捷的注册服务。
$ curl -X PUT -d '{"id": "test2","name": "test","address": "127.0.0.1","port": 80,
"tags": ["dev"]}'
http://127.0.0.1:8500/v1/agent/service/register
同样可以把服务注册到consul。
Namerd配置consul服务发现
修改namerd.yaml配置文件,将之前的namers配置io.l5d.fs改为io.l5d.consul
$ vi config\namerd.yaml
namers:
- kind: io.l5d.consul
host: 127.0.0.1
port: 8500
然后重启namerd服务,并使用namerctl添加dtab规则:
/svc => /#/io.l5d.consul/dc1;
其中dc1为consul默认的数据中心名称,只要跟consul保持一致即可。具体操作如下:
1、创建配置文件
$ vi config/dtab-consul-config
/svc => /#/io.l5d.consul/dc1;
2、将规则配置到namerd
$./namerctl dtab create web config/dtab-consul-config --base-url http://127.0.0.1:4180
Created web
3、通过namerd 控制台看到,规则被添加了。

执行
最后我们访问服务:
$ curl -H "Host:test" http://127.0.0.1:4140
It works!
consul服务发现配置详解
基本配置
namers:- kind: io.l5d.consul host: 127.0.0.1 port: 8500 includeTag: true useHealthCheck: false healthStatuses: - "passing" - "warning" setHost: true consistencyMode: stale
配置属性说明:
属性
|
默认值
|
说明
|
prefix
|
io.l5d.consul
|
解析前缀 /#/<prefix>.
|
host
|
localhost
|
consul 主机名
|
port
|
8500
|
consul 端口
|
includeTag
|
false
|
如设置true,会从path中读取tag信息
|
useHealthCheck
|
false
|
如设置true,healthStatuses不满足的服务会过滤。
|
healthStatuses
|
passing
|
consul用来过滤服务的状态,可选 passing, warning, critical, maintenance.
如果配置多个,则按最优先级(maintenance > critical > warning > passing).
如 useHealthCheck 为 false 则不起效。
|
token
|
no authentication
|
请求consul api的token
|
setHost
|
false
|
如设置 true, 由Consul 解析的HTTP 请求头Host为${serviceName}.service.${datacenter}.${domain}。
$domain 获取自 Consul.
|
consistencyMode
|
default
|
可选 default, stale and consistent.
|
failFast
|
false
|
如设置 false,禁用failfast,增加Consul Client的错误。在agent模式下设置 false,直接访问高可用集群API设置 true
|
preferServiceAddress
|
true
|
如设置 true 则优先使用service定义的地址,其次使用node地址。
如设置false默认使用node地址
|
weights
|
none
|
tag权重列表, 当一个node匹配了多个tag将取最大的权重。默认为1.0
|
tls
|
no tls
|
Consul Path 参数
includeTag : false 时的Dtab Path模板
/#/<prefix>/<datacenter>/<serviceName>
includeTag : true时的Dtab Path模板
/#/<prefix>/<datacenter>/<tag>/<serviceName>
占位符
|
是否必须
|
说明
|
prefix
|
yes
|
标识让linkerd使用consul解析的前缀,默认io.l5d.consul
|
datacenter
|
yes
|
consul dc的名称
|
tag
|
yes if includeTag is
true
|
请求中的consul tag信息
|
serviceName
|
yes
|
consul服务名
|