亚马逊AWS官方博客

使用 App Mesh 路由你的应用

AWS App Mesh 是一种易于监控和控制服务的服务网格。服务网格是一个专用于处理服务到服务通信的基础结构层,通常通过与应用程序代码一起部署的轻量级网络代理阵列进行处理。App Mesh 将标准化服务进行通信的方式,从而为您提供端到端可见性并有助于确保您的应用程序的高可用性。App Mesh 为您提供对应用程序中的每个服务的一致可见性和网络流量控制。
本篇,我们会就 App Mesh 的虚拟路由功能,介绍如何使用 App Mesh 以不同的方式路由你的应用。

使用 HTTP Header 路由你的应用

如果是 HTTP 的应用,你可以选择 HTTP 的路由类型。这里我部署了一些 HTTP 后端服务作为路由目标,以显示不同的结果。具体部署步骤可以参考:基于HTTP Header的路由和路由优先级
你可以同时设定多个路由规则,通过设定路由优先级来确定路由规则正确配置。


另外可以设定匹配配置,制定不同的路由规则。你可以使用基于 HTTP 方法,路径,参数和 Header 的不同规则。


这里我们紧紧以基于 Header 路由为例。这里我设定了5条路由规则:


他们有不同的匹配策略和优先级,首先是Blue,使用精准匹配,他的优先级是10,是这里面最高的:


接下来是Green,使用正则匹配,优先级20:


然后是Red,使用前缀匹配,优先级30:


接下来是Yellow,只匹配 Header 名称,优先级40:


最后是没有优先级的White,作为默认转发策略:


配置完之后,让我们看看结果:

# 请求 blue :
curl -H "color_header: blue" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;

blue

# 请求 red :
curl -H "color_header: red" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;

red

# 请求 green (color_header 中带有’green’字符串) :
curl -H "color_header: requesting.green.color" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;

green

# 请求 yellow (color_header 存在无法识别的值) :
curl -H "color_header: rainbow" front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;

yellow

# 请求 white (不携带color_header) :
curl front.howto-k8s-http-headers.svc.cluster.local:8080/; echo;

white

 

使用 gRPC 进行路由

App Mesh 同样支持基于 HTTP2 和 gRPC 的路由规则。因为 HTTP2 的匹配规则和 HTTP 一致,这里主要介绍基于 gRPC 路由规则。这里我已经部署了一个 gPRC 服务作为后端。具体部署步骤可以参考:使用App Mesh管理gRPC路由
App Mesh 支持使用 gRPC 服务名称和方法名称进行路由:


这时访问 gRPC 服务:


没有颜色的返回,这时因为我们还没有设置颜色,Color client返回的颜色可以使用 /setColor API 进行配置。

curl -i -X POST -d "blue" localhost:7000/setColor

你应该可以看到以下错误返回:

HTTP/1.1 404 Not Found
Date: Fri, 27 Sep 2019 01:27:42 GMT
Content-Type: text/plain; charset=utf-8
Content-Length: 40
Connection: keep-alive
x-content-type-options: nosniff
x-envoy-upstream-service-time: 1
server: envoy
rpc error: code = Unimplemented desc =

这是因为我们当前的Mesh仅配置为路由 gRPC 方法GetColor, 我们可以删去路由策略中方法名称的匹配。
现在尝试再次更新颜色

curl -i -X POST -d "blue" localhost:7000/setColor

你会看到返回了 HTTP/1.1 200 OK 响应, 还会在响应中看到no_color, 但这是成功更新color后, 返回先前颜色。
验证颜色确实成功更新:

curl localhost:7000/getColor

权重路由

除了基于规则的路由,App Mesh 也可以基于权重路由。
你可以给 VirtualRoute 配置多个目标,每个目标不同的权重。
这里我已经部署了一些后端服务,具体部署步骤可以参考:使用和管理HTTP2路由


这里我们配置了三个目标,每个目标相同的权重,可以看到,返回的结果近乎均匀的分布:


因为更新这些配置不需要重启应用程序,所以我们可以动态调节目标配偶,来实现金丝雀发布。

总结

使用 App Mesh 可以在对外暴露服务或在微服务之间配置灵活的路由规则。
相比于在服务内通过 Web 框架的方式实现路由,这种方式显然更加灵活且易于管理。使用 App Mesh 可以让应用专注于业务而非复杂的网络逻辑。

 

本篇作者

王逸飞

亚马逊云科技解决方案架构师,负责基于亚马逊云科技的云计算方案的咨询与架构设计,同时致力于亚马逊云科技云服务知识体系的传播与普及。在微服务,容器等领域拥有多年经验。