服务网格设计思路

前言

在服务网格出现之前,服务的治理都是由微服务框架自己来解决的,比如spring cloud、dubbo,而服务网格的设计思想是应用只负责自己的业务逻辑,把服务治理下沉到服务网格来处理,这样做的好处就是服务治理不再受限于框架本身了,比如spring clound的服务和python的http服务就可以相互通信,不仅如此,不同协议的服务可以相互通信。另一方面因为服务网格和应用时分开的,所以升级也很方便。

 

实现原理

服务网格本质上是一个TCP代理,比如Istio的envoy组件、蚂蚁金服的mosn。一个代理的流程如下:

  • 代理收到请求后,根据协议解析请求报文。
  • 得到请求的服务信息,然后根据用户的配置(路由、故障注入、熔断、负载均衡策略等等)来决定流量的处理方式,比如用户配置了灰度策略,那代理根据路由策略来决定流量要走到上游哪个服务地址。
  • 一旦确定上游的服务地址后,再把报文根据协议编码后发送给上游服务。

 

代理要做的关键部分就是要根据不容的协议去做解码和编码流量策略部分都是通用的,所以要设计一个服务网格,需要理解服务通信的协议,只有理解了协议剩下的事情就好办多了。

 

HTTP协议解析

再以spring clound为例,它的Feign模块就是用http协议来通信的,只要我们能解析这个协议,就能实现它的服务治理。那接下来我们看看一个HTTP协议的请求报文长得是啥样子的,如下图所示:

 

 

 比如发起了一个http请求 curl -d "username=zhangsan" http://127.0.0.1:9528/hello,捕获的报文格式如下:

 

POST /hello HTTP/1.1
Host: 127.0.0.1:9528
User-Agent: curl/7.64.0
Accept: */*
Content-Length: 17
Content-Type: application/x-www-form-urlencoded

username=zhangsan

 

 

通过第一行,可以解析到请求的方法名。

通过第五行可以解析请求参数的长度,然后根据这个长度就可以拿到具体的请求参数了。

 

posted @ 2021-09-20 17:02  独揽风月  阅读(163)  评论(0编辑  收藏  举报