前言
基于上一篇基于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
领取专属 10元无门槛券
私享最新 技术干货