4000-9696-28

看微服务核心技术如何演变

2023年02月10日 09:59供稿中心:北大青鸟总部

摘要: 在云计算时代有三大利器—容器技术、devops、微服务,而今天我们要介绍的是微服务架构的核心技术的辛酸演变史~

在云计算时代有三大利器—容器技术、devops、微服务,容器技术如docker、kubernetes帮助我们以最小成本快速部署应用程序。devops则是研发运维一体化思想,从管理和技术上推进产品的快速迭代。

微服务则是互联网架构经历了从单体架构—>集群架构—>分布式架构的产物,每一次的技术架构升级背后是新的设计理念,用以解决数据和业务复杂度增加带来的技术问题。

而今天我们要介绍的便是微服务架构的核心技术的辛酸演变史~


微服务架构的设计思想包括服务原子化、独立进程、轻量级通信、独立部署、基于业务能力,典型的微服务架构如下所示。



将业务拆分成了服务A、服务B、服务C,对于服务的管理使用服务配置中心,对于服务与服务之间的发现使用服务注册中心,对于服务如何与客户端通信采用服务网关来实现身份认证、路由等内容,其中微服务的核心技术无疑是服务发现与负载均衡。试想我们把原来的单体式架构从1个服务拆分成微服务(比如10个),这个时候运维人员在系统中配置10个微服务的名称,再指定这10个微服务的上下游关系(即如何从一个微服务到另外一个微服务),这个还是相对容易的。

再试想如果把1个服务拆分成100个微服务,这时候需要给100个微服务命名,还要定义好不同的微服务之间如何找寻到其它的微服务,以后如果是某个微服务挂掉了或者下线了,还需要去找到这个微服务以及解除它所带来的与其它服务之间的联系,这时候就有点挑战了。

再再试想如果把1个服务拆分成1000个微服务,要定义这1000个微服务的名称,还要定义这1000个微服务之间的道路,有个微服务挂掉了还得找到它并且解除与它相关的服务联系,这时候就是tobe or to die,that’sa question;所以微服务的核心技术是服务发现与负载均衡,你服不服?

那么微服务架构是如何来解决服务之间的配置与发现问题呢?从服务演变成微服务的规模(1—>10—>100—>1000)以及不同互联网公司的现况也有三个阶段的解决方案:


阶段1 从1—>10的proxy方案

这个阶段,微服务的数量还比较少,不需要关注微服务的名称,采用的解决方案是使用代理proxy—DNS解析&F5硬件负载均衡&Nginx服务端负载均衡。使用DNS建立域名与IP地址之间的映射关系,使用负载均衡技术将客户端请求根据配置策略引到不同的微服务上提供服务。



阶段2 从10—>100的客户端嵌入式代理

这是目前大部分互联网公司的做法,将代理(包括服务发现和负载均衡逻辑)以客户库的形式嵌入在服务中,再结合单独的服务注册中心组件进行配合使用,服务启动时自动到注册中心registry进行注册,并通过定期的心跳请求与registry保持联系,而服务的调用方(consumer)通过与registry请求获取服务地址并放在负载均衡软件中。

当下比较流行的Spring cloud框架便是这种设计模式,使用eureka来做注册中心,使用ribbon来进行客户端代理做负载均衡。



服务注册中心的逻辑流转图如下所示,服务A与服务B在启动时向服务注册中心上报自己提供的服务和IP地址,服务C告诉服务注册中心自己需要的服务,获取服务地址后进行服务A、服务B的调用,同理服务A与服务B的调用也按此进行。



服务配置中心是解决微服务数量超过一定程度时候的问题,因为在每个服务里分别维护一个服务的配置问题,实在太难了。

通过在配置中心存储服务的名字和IP地址,每次发生服务调用时从该配置中心进行获取,如果服务的IP地址有所变更,直接更新配置中心即可。



阶段3 从100—>1000的service mesh方案

因为方案1是使用负载均衡来进行代理,如果负载均衡的服务器挂掉了,那么整个业务就挂掉了,随着微服务数量的增加会产生问题。

方案2则是客户端负载,嵌入了服务负载均衡的SDK后,比较难以维护整个负载均衡,加上无法支持多语言,也比较麻烦。这时候产生的service mesh服务网格方案便可解决如上的问题。

service mesh服务网格的核心设计思想是sidecar边车模式(像下图战争时期摩托车的设计一般,主位置是战斗员,附位置是帮助主驾驶提供弹药等工作),在每个微服务(主进程)启动的时候同时再启动一个进程,为主进程提供支持,并共享生命周期。



在整个业务运行的过程中,附进程处理服务之间的通信、服务注册、负载均衡、认证鉴权、熔断限流、上报日志、监控的任务,把阶段2的服务注册eureka、服务网关zuul、服务配置中心如etcl的活全干了。目前业内也有些不错的servicemesh落地方案,如linkerd、istio等。

服务A和服务B只负责业务逻辑的处理,而所有的服务发现、负载均衡等工作全由单独的进程sidecar来进行。

因为是单独的进程,所以对于所有的开发语言都能支持,只需要主进程能与附进程保持通信即可。对于这些sidecar的管理都集中在控制面板controlplane,实现了集中治理,保障了微服务的高可靠性。



如果从服务视角来看,整个业务服务划分成微服务后就如下图所示,绿色表示微服务的业务逻辑处理,蓝色代表sidecar进程处于微服务之间的通信与负载均衡,它们链接起来后就像网格一样,这也是服务网格servicemesh的由来~



其实在我们的生活中也有类似的场景,在北京地铁刚开通运行时,每个换乘站都会有售票员,根据用户要到达的地方进行对应地铁票的售卖,这时候的售票员就像微服务第一阶段的proxy,将用户指引到目的地。

但是随着地铁出行越来越方便,大家也越来越喜欢地铁出行了,地铁的人流量开始增长,这时候售票员逐渐的忙不过来了,此时地铁站的配置升级为工作人员+自动售票机,自动售票机呈现了整个北京地铁图情况,用户根据自己的出行情况选择目的地,这时候的自动售票机就像微服务第二阶段的客户端嵌入式代理一样,用户自己选择目的地。

而到现在,随着互联网和经济的快速发展,北京各地铁口已升级为全自动售票机,再也没有人工售票窗口了,用户在自动售票机根据自己的出行情况选择目的地即可。

如果站在整个北京市地铁的宏观上看,每个地铁站全配置自动售票机,地铁站即我们的微服务,售票机即sidecar,整个配合形成了subwaymesh,在微服务里即servicemesh~

servicemesh无疑是当下微服务技术的最好诠释,它屏蔽了分布式系统的复杂性,解决了服务之间复杂的发现与调用过程,让开发团队可专注于业务逻辑的实现,聚焦真正的价值提供。

就像北京地铁全升级为自动售票机一样,屏蔽了来自全国各地人群语言不一致的复杂性,解决了购买地铁票繁琐的收钱找零充值过程,让地铁服务真正便捷的方便用户。


标签:
关于我们
公司简介
发展历程
青鸟荣誉
联系我们
加入我们
青鸟课程
BCVE视频特效课程
BCUI全链路UI设计
BCSP软件开发专业
BCNT网络工程师
启能职业教育基础课程
学习客户端下载
青鸟优师
青鸟云课堂
微信 公众号 咨询 顶部 首页
官方新版意见收集

*

官方新版意见收集

提交成功,感谢您的反馈。

我们会认真阅读和考虑每个用户的反馈。