亚马逊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,是这里面最高的:
接下来是Yellow,只匹配 Header 名称,优先级40:
# 请求 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 服务名称和方法名称进行路由:
没有颜色的返回,这时因为我们还没有设置颜色,Color client返回的颜色可以使用 /setColor API 进行配置。
curl -i -X POST -d "blue" localhost:7000/setColor
你应该可以看到以下错误返回:
这是因为我们当前的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 可以让应用专注于业务而非复杂的网络逻辑。