基于Docker+Consul+Registrator+Nodejs实现服务治理(三)

前言

我们已实现了服务的注册与发现。不过目前还存在的问题是:

负载均衡的业务逻辑跟应用层混在一起;

采用客服端实现的方式实现,如果采用java实现,那么还需要开发一套客户端的逻辑,与具体的语言耦合在一起

缓存中的服务列表无法共享,造成每个应用都需要去获取服务列表、监控服务列表的变化。

针对上述存在的问题,引入nginx服务发现机制,在不需要人工干预的情况下,实现nginx动态更新配置。

nginx服务发现机制

对基于Docker+Consul+Registrator+Nodejs实现服务治理(二)中的部署图改造成以下这样:

registrator来监控每个service web的状态。当有新的service web启动的时候,registrator会把它注册到consul这个注册中心上。由于consultemplate已经订阅了该注册中心上的服务消息,此时consul注册中心会将新的service web信息推送给consultemplate,consul_template则会去修改nginx.conf的配置文件,然后让nginx重新载入配置以达到自动修改负载均衡的目的。同样当一个service web挂了,registrator也能感知到,进而通知consul做出响应。

整个过程不需要运维人工的干预,自动完成。

Consul-template 说明

Consul-Template是基于Consul的自动替换配置文件的应用。在Consul-Template没出现之前,大家构建服务发现系统大多采用的是Zookeeper、Etcd+Confd这样类似的系统。

Consul-Template提供了一个便捷的方式从Consul中获取存储的值,Consul-Template守护进程会查询Consul实例来更新系统上指定的任何模板。当更新完成后,模板还可以选择运行一些任意的命令。

使用场景:可以查询Consul中的服务目录、Key、Key-values等。这种强大的抽象功能和查询语言模板可以使Consul-Template特别适合动态的创建配置文件。例如:创建Apache/Nginx Proxy Balancers、Haproxy Backends、Varnish Servers、Application Configurations等。

Consul-Template特性

Quiescence:Consul-Template内置静止平衡功能,可以智能的发现Consul实例中的更改信息。这个功能可以防止频繁的更新模板而引起系统的波动。

Dry Mode:不确定当前架构的状态,担心模板的变化会破坏子系统?无须担心。因为Consul-Template还有Dry模式。在Dry模式,Consul-Template会将结果呈现在STDOUT,所以操作员可以检查输出是否正常,以决定更换模板是否安全。

CLI and Config:Consul-Template同时支持命令行和配置文件。

Verbose Debugging:即使每件事你都做的近乎完美,但是有时候还是会有失败发生。Consul-Template可以提供更详细的Debug日志信息。

示例

对第二篇文章的 改造成以下这样:

新增了lb的docker image,详细配置见:nginx-consul-template。

定义 的负载均衡配置,配置是动态从consul cluster 取得,见nginx.conf。

一旦监听的服务列表发生变化,触发nginx重加载,见consul-template.service

下面让我们运行以下命令,启动服务:

可以看到相关服务已经运行起来了:

启动服务后,进入 的容器中,运行以下命令,查看当前app.conf(生成image时,把nginx.conf更名为app.conf,具体代码见Dockerfile)的配置。

发现定义在app.conf 中 由

变成了

upstream server ip与注册到consul的servic-web ip是一致的。说明nginx的动态配置功能是已经生效了。

验证功能

1.验证服务发现

由于 暴露了 的方法,在nginx中配置文件中定义了service-web的透传方式,所以运行以下命令来验证获取远程服务器ip的功能。

多次运行的结果为以下随机一个:

说明服务发现以及负载均衡的功能验证通过。

2. 验证服务下线情况

通过 的方式,下线ip为 的 的服务。

进入 的容器中,运行以下命令,查看当前app.conf的配置。

结果如下:

发现ip为 的service-web已经从服务列表中删除了。

验证服务下线通知功能通过。

总结 && 参考

相比client 端的服务发现,nginx实现服务治理对业务的无侵入性、对运维友好性、更符合架构的设计原则的优点。

参考:https://www.jianshu.com/p/a4c04a3eeb57

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180517G1Q2Q100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券