微服务连载(六)服务发现技术是如何演进出来的?

428次阅读  |  发布于4年以前

催生的背景

为了提升研发效能,赋能业务规模化创新。不管是一线互联网企业还是传统互联网企业,将单块架构解耦成微服务架构,已经成为企业目前数字化转型的一个大趋势。

微服务架构下的服务少则几个,几十个,多则上百个,每个服务一般都以集群HA的方式进行部署。

这个时候就出现了两个问题:

通用解决思路~代理(proxy)

在服务发现演进过程中,先后出现了三代服务发现解决方案。这三代的核心都是代理,只不过代理在架构中出现的位置是不同的。通过在消费方和提供方中间增加一层代理,由代理来处理服务发现和负载均衡等功能,消费方通过代理间接去访问服务实例。

三代服务发现方案

第一代:传统集中式代理

第二代:客户端嵌入式代理

随着微服务和云技术的兴起,企业对服务发现的效率和灵活性提出了更高的要求,于是出现了第二代方案。

这种做法也是很多互联网公司的一个主流,相应的开源也很多。比如:

缺点:

第三代:主机独立进程方案。

随着容器和云原生技术的兴起,业界开始探索第三代的解决方案。

主机独立进程方案是上面两种方案的折中,代理既不集中部署,也不嵌入在客户的应用程序当中,而是作为独立的进程部署在每个主机上,这个主机可以是物理的或者虚拟的。一个主机上的多个消费者可以共享这个代理,实现服务发现和负载均衡。

第三代结构和第二代是类似的,也需要引入服务注册中心进行配合,三代之间只不过代理的位置发生了变化

这个方案目前有个更时髦的称谓叫ServiceMesh。

开源产品:Envoy,Linkerd,Istio对应到服务注册中心,当然K8S也内置支持服务发现机制,也是属于第三代的主机独立进程方案。

K8S服务发现机制

考虑到K8S在业界比较火,而且内部服务发现机制比较复杂,这里独立出来就进行剖析。

如上图所示,在K8S中一个服务是由一组Pod构成的服务集群。

在K8S的worker节点上,有kubelet和kube-proxy,其中后者是实现服务发现的关键,上面是简化的服务发现流程。

服务注册阶段:

  1. 其中kubelet负责启动Pod服务实例--->
  2. 启动完成后kubelet会把Pod的IP列表注册到Master节点上-->
  3. 最后通过服务Service的发布,K8S会为服务分配相应的ClusterIP,相关信息也会记录在Master上。

服务发现阶段:

比较总结和选型

三种方案各有利弊,没有绝对的好坏。他们都有大规模的成功落地的案例。架构师需要在理解这些方案优劣的基础上,根据企业的实际上下文,综合考量,做出技术选型。

出处:https://www.cnblogs.com/jackyfei/p/12078420.html

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8