微服务在当今的互联网架构中的重要性我在这里就不多说了,随着微服务的大范畴利用,服务发现这个词也变的越来越炽热。在平时的工作中,我发现当初很多人喜爱把一些很简略的事件说的很简单,比方什么BFF架构,这中台那中台的。其实服务发现也是一样,很多文章把这块内容写的过于妖魔化,导致很多人看起来云里雾里的感觉如同很浅近的样子,接下来就放弃这块了。其实服务发现是个很简略的过程,略微有点编码根底的人都能看懂。明天对此做一个总结,如果对您有用,记得点个赞点个关注,如果有问题也能够留言,我看到了会第一工夫回复。
传统的客户端和服务端的交互模式
- 服务端1 2 3 别离提供了一个服务的ip和端口号
- 这里的客户端不是咱们广义了解的客户端app或者前端,客户端也能够是一个服务端,比方你在一个golang我的项目中须要不同的服务等,那么你这个golang我的项目就是上图中的客户端,这一点尤其要留神。
- 如果说的精确一点,这里的客户端应该叫做服务消费者,服务端应该叫做服务提供者
下面这种传统的交互模式看着没什么问题,然而其实可用性并没那么好,首先比方你的服务端2挂了,然而客户端还是不晓得的,仍然会持续申请,这样可用性当然是大大的降落的,所以接下来就引发出了咱们接下来要讲的服务发现模式
服务发现模式
大略流程
其实所谓的服务发现,就是服务消费者在调用服务提供者提供的服务的时候,多了一层服务中介。服务中介中有很多key/value键值对,key是服务名称,value是服务提供者的地址列表。当你新增一个服务提供者的时候,就往服务中介中写入kv数据,这个过程叫做服务注册 当你申请一个服务的时候,间接拿着key去服务中介中取对应的value,也就是服务提供者的地址列表,而后去申请就能够了。
当服务提供者节点挂掉时,要求服务可能及时勾销注册,比便及时告诉消费者从新获取服务地址。
当服务提供者新退出时,要求服务中介能及时告知服务消费者,你要不要尝试一下新的服务。
根本过程如下图
- 步骤1:每次新减少一个服务提供者,须要先去服务注册核心注册一个key/value(服务名称/服务提供者的地址列表)
- 步骤2:服务调用者不间接调用服务提供者,而是拿着标记(也就是下面注册的key(服务名称))去服务注册核心查找对应的value(服务提供者的地址列表)
- 步骤3:服务注册核心会通知服务调用者对应的key(服务名称)是否有value(服务提供者的地址列表),有的话会把对应的value(服务提供者的地址列表)返回给服务调用者
步骤4:服务调用者会拿着返回的value(服务提供者的地址列表)去申请对应的服务
服务发现是否太过简略?
下面的过程看起来如同是有点太简略了,而且看起来也没解决什么问题呀,而且如同还徒增了复杂度。其实并不是这样的。
服务提供者过程如果被kill -9暴力杀死,服务消费者不晓得怎么办?
这个不必放心,服务发现中引入服务保活和查看机制,并更换数据结构。服务提供者须要每隔5秒左右向服务发现汇报存活,服务发现将服务地址和汇报工夫记录在kv中。服务中介须要每隔10秒左右查看kv数据结构,踢掉汇报工夫重大落后的服务地址项。这样就能够准实时地保障服务列表中服务地址的有效性。这也就是咱们说的服务健康检查
服务列表变动时如何告诉消费者?
第一种办法是轮询,消费者须要每隔几秒查问服务列表是否有扭转。如果服务很多,服务列表很大,消费者很多,那么服务发现也会有肯定的压力
第二种办法是订阅生产模式,服务消费者订阅一个音讯,服务提供者有变动间接往音讯中发送对应变动就行。
常见的服务发现计划
- DNS
- mDNS
- Zookeeper
- Etcd
- Consul
具体计划大略理解一下就行,前面咱们会具体介绍一下Consul,那么咱们下期再见吧。如果这篇文章有帮忙到你,记得点赞分享哦,咱们下期见。
本文由mdnice多平台公布