2.1 连接
微服务错综复杂,要完成其业务目标,连接问题是首要问题。连接存在于所有服务的整个生命周期中,用于维持服务的运行,算得上重中之重。
相对于传统的单体应用,微服务的端点数量会急剧增加,现代的应用系统在部分或者全部生命周期中,都存在同一服务的不同版本,为不同的客户、场景或者业务提供不同的服务。同时,同一服务的不同版本也可能有不同的访问要求,甚至产生了在生产环境中进行测试的新方法论。错综复杂的服务关系对所有相关分工来说都是很严峻的考验。针对目前的常见业务形态,这里画一个简单的示意图来描述Service Mesh的连接功能,如图2-1所示。
图2-1
如图2-1所示,从不同的外部用户的角度来看,他们访问的都是同一服务端口,但实际上会因为不同的用户识别,分别访问服务A的不同版本;在网格内部,服务A的版本1可能会访问服务B的两个版本,服务A的版本2则只会访问服务B的版本1;服务B的版本1需要访问外部的云服务,版本2则无此需求。
在这个简化的模型中,包含了以下诉求:
◎ 网格内部的调用(服务A→服务B);
◎ 出站连接(服务B→外部云服务);
◎ 入站连接(用户→服务A);
◎ 流量分割(服务A的版本1分别调用了服务B的版本1和版本2);
◎ 按调用方的服务版本进行路由;
◎ 按用户身份进行路由。
这里除了这些问题,还存在一些潜在需求,如下所述。
(1)在网格内部的服务之间如何根据实际需要对服务间调用进行路由,条件可能包括:
◎ 调用的源和目的服务;
◎ 调用内容;
◎ 认证身份。
(2)如何应对网络故障或者服务故障。
(3)如何处理不同服务不同版本之间的关系。
(4)怎样对出站连接进行控制。
(5)怎样接收入站连接来启动后续的整个服务链条。
这些当然不是问题的全部,其中,与流量相关的问题还引发了几个关键的功能需求,如下所述。
(1)服务注册和发现:要求能够对网格中不同的服务和不同的版本进行准确标识,不同的服务可以经由同一注册机构使用公认的方式互相查找。
(2)负载均衡策略:不同类型的服务应该由不同的策略来满足不同的需要。
(3)服务流量特征:在服务注册发现的基础之上,根据调用双方的服务身份,以及服务流量特征来对调用过程进行甄别。
(4)动态流量分配:根据对流量特征的识别,在不同的服务和版本之间对流量进行引导。
连接是服务网格应用过程中从无到有的最重要的一个环节,后续会详细说明。