由于辅助组件并不能单独存在,所以它们都依附在绿色的服务上面。
我们抽调服务集群的血肉(Web服务),只留下它的筋骨(sidecar),就可以获得下面这张图,这就是ServiceMesh。可以看到里面的连接线条是非常复杂的,人工不可能完成,只能依靠平台去管理。
任何东西只要一上规模了,就体现了它的复杂度。这还仅仅是只有36个服务节点的拓扑图。
不要小看这一个小小的蓝色方块。它不仅仅可以是一个辅助程序,而且可以成为基础设施。现在典型的service mesh,分为`数据平面`和`控制平面`,大多数落地的企业使用proxy方式实现了数据平面,对控制平面的实现有限。
像比较流行的Istio,通过负载均衡、服务间的身份验证、监控等方法,它可以轻松地创建一个已经部署了服务的网络,而服务的代码只需很少更改甚至无需更改。通过在整个环境中部署一个特殊的 sidecar代理,为服务添加 Istio 的支持,而代理会拦截微服务之间的所有网络通信,然后使用其控制平面的功能来配置和管理 Istio。
我们看下它官方的功能描述:
- 为 HTTP、gRPC、WebSocket 和 TCP 流量自动负载均衡。
- 通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制。
- 可插拔的策略层和配置 API,支持访问控制、速率限制和配额。
- 集群内(包括集群的入口和出口)所有流量的自动化度量、日志记录和追踪。
- 在具有强大的基于身份验证和授权的集群中实现安全的服务间通信。
可以说,ServiceMesh将业务属性剥离了出去,只剩下一张大网,涵盖了所有运维和基础服务的工作。
要用它,不能说是没有代价的。其中有两点比较重要:
- 网络包通过层层的代理和转发(Ambassador模式),效率会降低,排错会变困难。
- 需要按照这个网格的规范进行改造,也就是写一堆适配器(Adapter模式)。
说到适配器,就不禁想起了SpringCloud的Sidecar。
Java里要说玩新概念,怎么能少的了Spring家族?SpringCloud同样有一个sidecar的组件,它的maven坐标如下。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-sidecar</artifactId>
</dependency>
它做的事情,更加像一个适配器。它能把一个普通的php或者nodejs服务,伪装成一个正常的SpringCloud服务。
通过简单的配置,我们就可以让一些其他语言开发的Web应用,加入到SpringCloud体系中来。
它的使用比较简单,在此不过多介绍。
End可以看到,我们今天的这辆车,虽然简陋,但是很高级,甚至和最前沿的ServiceMesh挂钩了。在这里,我实在是佩服计算机界的名词创造能力和抽象能力。一个简单的生产者消费者,玩出了响应式编程;一个简单的边车模式,玩出了ServicemMesh。
虽然这个东西比较新,但比起什么中台概念来,能够落地不务虚,是更加有技术说服力的。因为中台搞不死程序员,但会搞死公司。
未来还会有什么奇形怪状的交通工具呢?这是个未知数。请搭上xjjdog的轻便列车,一块探索吧。
作者简介:小姐姐味道 (xjjdog),一个不允许程序员走弯路的公众号。聚焦基础架构和Linux。十年架构,日百亿流量,与你探讨高并发世界,给你不一样的味道。我的个人微信xjjdog0,欢迎添加好友,进一步交流。