在微服务架构实践中,一个难点是服务发现。每一个服务采用分布式部署,保证了拓展性和容错性,但带来了一个难点是如何监控这些服务,如何找到这些服务。
服务发现的种类有两种:客户端发现和服务端发现
客服端发现 -客户端或者API网关查询注册中心获取服务的位置信息。支持服务注册的软件有Etcd
,Zookeeper
,Consul
等
服务端发现 -客户端或API网关通过路由(比如负载均衡器)来代理到服务
本文将配置简单的服务端服务发现系统。其中涉及软件有:
Consul
一个服务注册和配置共享的软件,支持服务健康检查,支持Dns和Http两种形式调用
Bind
用于搭建本地Dns服务器,这里用来将service.local域名指向Nginx
Nginx
Web服务器,作为负载均衡,代理到各个微服务
Consul-Template
Consul的一个拓展工具,通过监听Consul中数据来动态修改一些配置数据。这里用来动态生成Nginx虚拟主机配置
架构图如下:
Consul
配置两个微服务,地址都是本地地址,端口分别是4000和4300
配置文档: Multiple Service Definitions 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 { "services" :[ { "id" : "1" , "name" :"blog" , "tags" :["production" ,"micro service" ], "address" :"127.0.0.1" , "port" :4000 , "checks" :[ { "http" :"http://localhost:4000/" , "interval" :"10s" } ] }, { "id" : "2" , "name" :"blog" , "tags" :["production" ,"micro service" ], "address" :"127.0.0.1" , "port" :4300 , "checks" :[ { "http" :"http://localhost:4300/" , "interval" :"10s" } ] } ] }
启动Consul
1 consul agent -server -bootstrap-expect 1 -bind=10.211.55.3 -data-dir /tmp/consul -node=centos1 -config-dir /etc/consul.d -client 0.0.0.0 -ui
consul ui界面地址:http://localhost:8500
Bind
编辑/etc/named.rfc1912.zones
,添加:
1 2 3 4 5 zone "service.local" IN { type master; file "service.local.zone"; allow-update { none; }; };
在/var/named
目录下添加service.local.zone
文件
内容如下:
1 2 3 4 5 6 7 8 9 10 $TTL 1D @ IN SOA service.local. admin.com. ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS ns.service.local. ns IN A 127.0.0.1 blog IN A 127.0.0.1
启动Dns服务器
1 /usr/sbin/named -u named -c /etc/named.conf
通过命令dig @localhost blog.service.local
查看其A记录地址是否指向了本地
Consul-Template
添加模板配置文件/etc/consul-template/nginx.ctmpl
内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 {{range services}} {{ if .Tags | contains "production"}} {{ if .Tags | contains "micro service"}} upstream {{.Name}}_gw { ip_hash; {{range service .Name}} server {{.Address}}:{{.Port}}; {{else}}server 127.0.0.1:11111; {{end}} keepalive 64; } server { listen 80; server_name {{.Name}}.dev; location / { client_max_body_size 0; proxy_connect_timeout 300s; proxy_send_timeout 900; proxy_read_timeout 900; proxy_buffer_size 32k; proxy_buffers 32k; proxy_busy_buffers_size 64k; proxy_redirect off; proxy_hide_header Vary; proxy_set_header Accept-Encoding ''; proxy_set_header Host $host; proxy_set_header Referer $http_referer; proxy_set_header Cookie $http_cookie; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_size 6400; proxy_pass http://{{.Name}}_gw; } } {{ end }} {{ end }} {{ end }}
启动Consul-Template之后,查看/usr/local/nginx/conf.d/micro_services.conf
是否生成成功
1 consul-template -template /etc/consul-template/nginx.ctmpl:/usr/local/nginx/conf.d/micro_services.conf:"/usr/local/nginx/sbin/nginx -s reload"