干货|如何步入Service Mesh微服务架构时代

今天要和大家分享的是关于新一代微服务架构——Service Mesh的具体玩法!在微服务架构盛行的今天,作为一名互联网技术从业人员,对于微服务的概念相信大家都已经耳熟能详了!而至于像Spring Cloud这样的微服务框架,因为大部分互联网公司都在此基础上构建过第一代微服务体系,所以对于做Java 的同学来说,Spring Cloud微服务体系应该是非常熟悉了!

这里并不是说其他语言栈就没有构建微服务体系的框架,例如Go语言也有像Go-Micro这样的微服务框架,只不过目前除了像头条这样重度使用Go语言的公司外,其他绝大多数互联网公司的服务端语言依然还是Java的天下!所以对于目前大部分已经或打算采用微服务架构的公司来说,Spring Cloud框架依然是它们的首选!但如果我说,这套体系发展到今天已经快过时了,你会不会觉得我是在瞎掰呢?因为毕竟咱们现在天天玩的微服务还都是Spring Cloud这一套啊!

难道像Spring Cloud GateWay、Zuul、Eureka、Consul、Nacos、Feign/Ribbon、Hystrix、Sentinel、Spring Cloud Config、Apollo…,这些涵盖了微服务体系——服务注册与发现、限流、熔断降级、负载均衡、服务配置等服务治理各个方面的牛逼开发框架或服务组件们都快要过时了吗?

虽然这很难让人接受,毕竟这些技术才刚刚捂热!但在下一代微服务架构Service Mesh 面前,它们中的绝大部分组件确实是快要过时了,倒不是说这些开源组件在技术上不牛逼或者没有深入学习研究的价值了,而是它们所面向的微服务体系结构在设计理念上与Service Mesh已经存在代差,这种差距夸张点说就像歼-20与歼-10的差别。这听起来可能有点耸人听闻,但从目前微服务技术发展趋势和实践上看,这就是历史潮流!接下来我将从理论和实践层面对此进行分析和演示!

为什么要进入Service Mesh时代

前面我略微夸张的说到,以Spring Cloud为代表的微服务体系相比Service Mesh而言已经存在技术代差,那凭什么这么说呢?接下来,我们回顾下使用Spring Cloud构建微服务体系的大致技术流程!

要构建微服务体系,首先我们需要独立部署一款实现服务注册/发现功能的组件服务,目前可供选择的主流方案一般有Eureka、Consul、Nacos等,搞定服务注册/发现后,我们编写一个Java微服务,此时为了将该服务注册到服务注册中心,一般会引入Spring Cloud提供的支持对应注册中心接入的SDK,并在应用入口类中通过@EnableDiscoveryClient注解的方式标注,之后SDK中的逻辑就会在应用启动时执行服务注册动作,并提供给注册中心相应地探测接口,以此实现微服务与服务注册中心之间的连接。以此类推,我们可以通过这种方式将一组微服务都注册到服务注册中心!

而如果服务之间要互相调用怎么办呢?一般我们会通过编写FeignClient接口来实现微服务之间的调用,而其底层的逻辑则是通过Feign所集成的Ribbon组件去注册中心中获取目标服务的服务地址列表,之后Ribbon根据服务地址列表进行负载均衡调用。至于服务与注册中心之间如何保证连接有效性,则依赖于服务注册中心与其SDK之间的协作机制。

而高级一点,服务之间的调用除了实现负载均衡,还要实现熔断限流、那么此时可以通过部署服务网关组件(例如Zuul/Spring Cloud GateWay)来实现微服务入口的熔断限流、内部服务之间的限流熔断则通过集成Hystrix或Sentinel组件,以客户端本地配置或远程配置中心的方式来实现。

上述过程基本就是我们使用Spring Cloud构建微服务体系的大致过程了!如果仔细思考下这个过程,我们会发现在该微服务体系的构造过程中,与服务治理相关的大部分逻辑都是以SDK的方式耦合在具体的微服务应用之中!服务注册需要引入SDK、服务调用需要引入SDK、服务熔断限流也需要SDK;除此之外,为了保证这套体系的正常运行,我们还需要额外维护服务注册中心、服务网关这样的基础服务。这样的结构会导致什么弊端呢?具体有以下几点:

1、框架/SDK太多,后续升级维护困难

在这套体系中,与服务治理相关的逻辑都是以SDK代码依赖的方式嵌入在微服务之中,如果某天我们想升级下服务注册中心的SDK版本,或者熔断限流组件Hystrix或Sentinel的版本,那么需要升级改造的微服务可能会是成百上千,且由于这些组件都与业务应用绑定在一起,在升级的过程中会不会影响业务稳定,这都是需要谨慎对待的事情,所以对SDK的升级难度可想而知的!

2、多语言微服务SDK维护成本高

试想下如果构建的微服务体系,也要支持像Go、Python或者其他语言编写的微服务的话,那么上述这些微服务治理相关的SDK是不是得单独再维护几套呢?所以在这种体系结构中,对多语言微服务的支持就成了一个问题!

3、服务治理策略难以统一控制

基于该套体系构建的微服务体系,在对像熔断、限流、负载均衡等服务治理相关的策略管理上,都是比较分散的,可能有人会写到自己的本地配置文件,有人会硬编码到代码逻辑中,也可能有人会将其配置到远程配置中心,总之对于服务治理策略逻辑都是由对应的开发人员自己控制,这样就很难形成统一的控制体系!

4、服务治理逻辑嵌入业务应用,占有业务服务资源

在这套微服务体系中,服务治理相关的逻辑都是在微服务应用进程中寄生运行的,这多少会占有宝贵的业务服务器资源,影响应用性能的发挥!

5、额外的服务治理组件的维护成本

无论是服务注册中心、还是服务网关,这些除了微服务应用本身之外服务治理组件,都需要我们以中间件基础服务的方式进行维护,需要额外的人力、额外的服务器成本!

以上就是以Spring Cloud为代表的传统微服务体系的弊端,如果我说在Service Mesh体系下,以上几点都不再是问题,甚至都不需要研发人员再进行任何关注!我们只需要写一个普通的Spring Boot服务,也不需要引入服务注册SDK、熔断限流SDK组件,总之你写一个普普通通的服务,就能实现像之前Spring Cloud微服务体系所能支持的大部分服务治理功能,你会相信吗?你会不会觉得这跟之前写单体应用没啥差别了呢?

不管你怎么想,这些就是Service Mesh要干的事情!**Service Mesh的目标就是要将微服务治理体系下沉为一套与业务无关的基础设施。**从这个角度看,如果咱们不认真学习下Service Mesh,那么以后将变得越来越低智,因为Spring Cloud好歹还能让我们感知下微服务的存在,而在Service Mesh中,微服务治理体系作为基础设施的一部分,对普通研发人员将越来越透明!

Service Mesh的解决方案是什么

在前面我们说到,Service Mesh的目标是要将微服务治理体系下沉为与业务无关的基础设施。这句话怎么理解呢?实际上Service Mesh微服务治理技术的诞生也不是凭空产生的,而是在以Kubernetes为代表的容器编排技术逐步成为软件运行主流基础环境的背景下,以及以Spring Cloud框架为代表的传统微服务技术体系弊端逐步显现的情况下技术自然迭代发展的结果。总之,就是有点万事具备,只欠东风的感觉!

所以,我们看到目前落地的Service Mesh方案中大多都是与Kubernetes深度结合的方案,例如最受瞩目的**Istio!**接下来我们具体看看在Service Mesh中微服务治理的核心逻辑是怎么实现的(以Istio+Envoy为例)!

要理解在Service Mesh中的微服务治理逻辑的具体实现,就不得不上一张关于服务网格概念很经典但刚开始看着又很难理解的图,如下:

如果你之前大致了解过Service Mesh的概念,那么这张图相信你一定见过。其中绿色的正方形表示正常部署的微服务,而蓝色的正方形表示一个网络代理,也就是大家通常所说的SideCar。在Service Mesh架构下,每部署一个微服务,都需要部署一个与之相对应的代理服务,所有与微服务本身的交互都通过SideCar代理,而SideCar之间会形成一张形似网格的交互链路,这就是服务网格名称的来由!

在Service Mesh中,当我们将一个服务部署在Kubernetes之后,安装在Kubernetes中的Service Mesh组件(例如Istio)就会自动在该微服务的同一个Pod之中启动一个与之对应的代理进程(例如istio-proxy),这个保姆式的代理进程会代替微服务本身去实现原先在Spring Cloud体系中需要微服务自身完成的服务注册、负载均衡、熔断限流等微服务治理功能。并且,这些代理进程并不是孤军奋战,而是会通过像xDS协议(Service Mesh中数据面与控制面通信的通用协议)与Service Mesh控制组件保持连接。

这也就引出了Service Mesh架构中关键的两个概念:控制面与数据面。前面我们所示的Sidecar(例如istio-proxy,实际上是envoy)就是数据面,与微服务治理逻辑相关的信息都存储在数据面中,而控制面则是Service Mesh的中心控制组件(例如Istio中的Pilot组件),控制面可以通过xDS协议(具体又分为LDS、CDS…)向数据面下发各种服务治理相关的规则,例如限流规则、路由规则、服务节点更新信息等等。

这种设计方式就是Service Mesh最核心的设计逻辑——通过Sidecar的方式代理微服务进行服务治理逻辑(数据面),通过控制面感知外界环境的变化并通过xDS协议支持各种微服务治理策略规则的集中管理和下发,而这里的控制面和数据面都会被融合进像Kubernetes这样的基础架构环境中,对于普通微服务的开发,研发人员要做的只是将一个应用以编排的方式部署进k8s集群即可!而所有与微服务治理相关的逻辑都由代理数据面与控制面协作完成。

这里我们以Service Mesh最著名的开源方案Istio的架构图来解释上面所说的逻辑,具体如下:

其中服务注册发现可以直接利用Kubernetes的内部发现机制,通过监听Kubernetes Pod的变化来实现,具体示意图如下:

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值