乐趣区

关于后端:被妖魔化的服务发现原来这么简单

微服务在当今的互联网架构中的重要性我在这里就不多说了,随着微服务的大范畴利用,服务发现 这个词也变的越来越炽热。在平时的工作中,我发现当初很多人喜爱把一些很简略的事件说的很简单,比方什么 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 多平台公布

退出移动版