从ServiceMesh服务网格到去中心化的SOA总线
2022-03-30 10:52:00来源:人月聊IT
对于服务网格,API网关和传统的中心化架构ESB服务总线,在我头条前面文章已经谈到多次,今天继续再谈下对三者的一些思考。
缘起还是在多年前和客户交流ESB产品的时候,客户就提出能否将ESB产品去中心化,将ESB产品的能力通过SDK代理包放到各个业务系统里面去。而这也是当前ServiceMesh服务网关和Sidecar的核心思路。
在传统的单体架构下,通过ESB总线集成已经是一种标准做法,但是ESB总线本身的集中化架构是被人诟病最多的地方。由于ESB本身中心化,导致ESB总线本身可能相处一个性能瓶颈点,同时所有服务调用请求全部经过ESB总线,那么ESB如果宕机将是一个巨大的灾难。
ESB有一个很重要的核心功能就是Proxy服务代理路由,对底层位置透明并提供统一出口,所以你可以看到类似Ngnix也可以提供这个核心能力。当前很多API网关也是基于Ngnix和OpenRestry进行二次开发。
所以到了微服务阶段。
很多人理解通过服务注册中心实现了彻底的去中心化,但是当你考虑到多个独立的微服务团队集成,一个大的微服务应用需要对外统一暴露API接口服务的时候,这些场景仍然需要使用API网关或微服务网关。
所以API网关本身也是中心化的架构,由于是中心化架构,更加容易增加各种流量拦截插件来实现安全,日志,流控,路由等各种接口管控能力。
那么有无一种去中心化架构也能够实现上述能力?
当前主流方案就演进到下发Sidecar代理,控制流和数据流分离的ServiceMesh服务网格架构模式。下图是API网格和ServiceMesh架构的一个对比。
可以看到API网关的大部分能力都可以被SericeMesh来替代。
唯一的就是上图提到的南北流量和对外统一接口暴露问题,这个仍然需要处理,即实现最基本的Proxy和南北流量分发的能力。
只要具备这个能力就可以了,这个能力可以是硬件负载均衡能力,也可以是软件集群或反向代理。如果对应到K8s集群来说,即对应到K8s的Ingress网关来提供统一对外出口。
在Docker+K8s的容器云资源调度平台下,动态扩展的弹性计算节点统一由K8s来进行管理,那么由K8s Ingress网关对外暴露统一接口是合理的。剩余的接口管控能力应该全部下沉到SreviceMesh来完成。
因此:SreviceMesh网格+Ingress网关可完全实现去中心化的ESB能力。
简单来说我们还是希望去实现一个去中心化的ESB产品,完全保留ESB总线具备的各种能力,实现数据流和控制流分离,并配合ServiceMesh的思路来进行开源实现。
服务自发现还是服务手工注册?
在基于微服务架构框架下,可以实现服务自发现。服务自发现实际是对开发态有影响,类似的开发框架,在开发阶段就需要做的开发配置,代码注解增加等。
还有一种就是还是传统的人工去注册和接入API接口。如上图,供应商微服务提供了一个查询的Rest API接口服务。
http://10.0.0.1/VendorInfo
那我们还是需要在管控平台对该接口进行注册操作。该注册还是要通过网关,仅仅使用了最基本的Proxy路由代理能力进行一次封装后暴露。如果是南北流量走网关封装后的接口暴露,如果是东西流量则直接走原始的供应商微服务提供的API接口地址即可。因此实际消费端的服务调用,仍然通过服务注册中心能力。
先在管控治理平台对供应商查询服务进行注册消费方先从注册中心查询供应商查询接口服务消费方发起接口调用消费方或提供方端的Sidecar进行拦截处理即两种流量场景不同的方式进行处理。
内部微服务间东西流量场景可以在消费端和提供端都通过Sidecar流量拦截进行各种安全,日志管控处理。如果是外部的APP或外部应用对接口调用,则只在服务提供端进行Sidecar的流量拦截和处理。
Sidecar和控制中心协同在SIdecar中的各个拦截插件实际和控制中心之间存在协同,类似鉴权处理需要访问控制中心的服务授权信息,对于日志处理需要拦截日志后将日志写入到消息中间件。对于路由处理需要访问控制中心的路由配置表等。
那么如控制中心本身也出现故障,对于接口服务调用还是存在影响,控制中心本身也需要分布式集群部署以提升高可用性。同时可以通过在Sidecar端构建一个轻缓存体系,来实现控制中心宕机下的可用性。