学习
实践
活动
工具
TVP
写文章

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

前言

基于上一篇基于Docker+Consul+Registrator+Nodejs实现服务治理(一)我们已经实现服务注册,本篇文章我们着重实现服务发现。

服务发现

根据上篇的流程图,服务发现功能包括:

服务订阅

动态获取服务列表

本地缓存

缓存服务路由表

服务调用

服务请求的负载均衡策略

变更通知

监听服务节点变化

更新服务路由表

示例

为了验证服务发现机制,api gateway对外提供 方法,用来获取service web的本地ip地址,获取service web的ip的作用有两个:

成功返回ip地址,则验证服务发现起作用

多次请求返回不同的ip地址,则验证api gateway 负载均衡起作用

先看示例部署图如下:

registratior监控service web,一旦service web 状态发生变化,通知consul cluster做出相应处理,api gateway 订阅consul cluster 的服务,根据负载均衡的策略,把请求转发到对应web处理。

获取service web本地ip的时序图如下:

下面我们开始实现我们的功能。

源码代码地址与目录

源码地址: gateway-test目录如下:

具体功能实现

下面会对上面提供的功能点依次进行实现(展示代码中只保留核心代码,详细请见代码)。

1. 服务发现,缓存服务地址

服务发现 ,代码如下:

调用 获取注册服务信息,步骤如下:

检查缓存中是否存在,如果存在,则从缓存中获取

如果不存在,则获取最新的服务列表

把从服务端的服务列表,存储到缓存中

2. 变更通知 && 更新本地服务列表

监听服务节点,一旦发生变化,立即通知对应的订阅者,更新本地服务列表。

监听服务节点 代码:

由于nodejs是单线程的,需要额外启动一个子进程来监听服务的变化,一旦服务列表有变化,则把服务列表更新到缓存中,请看 代码:

发送变更的服务列表给主进程,涉及到的代码 :

3. 服务调用

结合前面说的服务发现,我们来看服务是如何被调用的,涉及到的代码 :

部署服务

根据前面提供部署图,我们来实现服务编排,完整的 代码如下:

运行以下命令,启动服务:

验证服务功能

启动服务后,我们在注册中心发现service-web 对应的服务器ip分别为:172.21.0.6,172.21.0.7,172.21.0.9。

1. 验证服务发现

如前面时序图所述,api gateway对外暴露 来获取本地ip信息。

多次运行以下代码来验证结果:

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

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

2. 验证服务通知功能

下线某个service-web服务后,查看gateway-test日志:

发现ip为172.21.0.9的服务已经下线,且通知到订阅者。

总结 && 参考

到此为止,我们已实现了服务的注册与发现。下篇我们介绍分布式服务中的服务跟踪。

参考:

https://github.com/jasonGeng88/blog/blob/master/201704/service_discovery.md

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

扫码关注腾讯云开发者

领取腾讯云代金券