eShopOnContainers 知多少[12]:Envoy gateways (3)

执行以下命令,启动应用和代理,并测试:

> docker-compose up -d Starting k8snetenvoy_envoygateway_1 ... done Starting k8snetenvoy_cityapi_1 ... done Starting k8snetenvoy_weatherapi_1 ... done > docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------------------------------------------- k8snetenvoy_cityapi_1 dotnet K8S.NET.CityApi.dll Up 443/tcp, 0.0.0.0:8080->80/tcp k8snetenvoy_envoygateway_1 /docker-entrypoint.sh envo ... Up 10000/tcp, 0.0.0.0:10003->10003/tcp, 0.0.0.0:9903->9903/tcp k8snetenvoy_weatherapi_1 dotnet K8S.NET.WeatherApi.dll Up 443/tcp, 0.0.0.0:8082->80/tcp > curl :10003/c Shanghai > curl :10003/w Cool 3. eShopOnContainers 中的应用

eShopOnContainer 中主要定义了四个API 网关(BFF 模式),服务间通信方式主要有两种,一种是HTTP,一种是gRPC。如果启用Service Mesh并且部署至K8S,服务整体通信架构如下图所示:

eShopOnContainers 知多少[12]:Envoy gateways

有两点需要补充说明:

Linkerd是一种Service Mesh,其核心思想是借助Sidecar模式无侵入式对应用进行服务治理,包括服务发现、流量管理、负载均衡、路由等。

了解过Istio(目前比较流行的Service Mesh)应该知道,Envoy在Istio中作为Sidecar而存在,而在eShopOnContainers中Envoy被充当API Gateways。

基于上面的基础,再来看eShopOnContainers中的配置,其实就很明白了,主要是配置文件从Ocelot 转变到envoy.yaml,配置如下图所示。

eShopOnContainers  envoy proxy configuration

路由配置如下:

/m/ 、/marketing-api/ 路由至:marketing api

/c/、/catalog-api/ 路由至:catalog api

/o/、/ordering-api/ 路由至:ordering api

/b/、/basket-api/ 路由至:basket api

/ 路由至:web bff aggregator api

部署时,基于helm将envoy.yaml保存至ConfigMap,在基于envoyproxy/enovy镜像构建容器,将配置从ConfigMap挂载到容器中,容器内部即可基于配置启动Envoy 网关了。

eShopOnContainers 知多少[12]:Envoy gateways

4. Why Envoy

经过上面的了解发现,Envoy还是充当的网关角色,那为什么要替换呢? 先来了解下Envoy的优势:

非侵入式架构 : Envoy 基于Sidecar模式,是一个独立进程,对应用透明。(在eShopOnContainer中还是独立的网关项目,并非以Sidecar模式注入到服务中。)

eShopOnContainers 知多少[12]:Envoy gateways

基于C++开发实现:拥有强大的定制化能力和优异的性能。

L3/L4/L7 架构 : 传统的网络代理,要么在 HTTP 层工作,要么在 TCP 层工作。而Envoy 同时支持 3/4 层和 7 层代理。

顶级 HTTP/2 支持 : 它将 HTTP/2 视为一等公民,并且可以在 HTTP/2 和 HTTP/1.1 之间相互转换(双向),建议使用 HTTP/2。

gRPC 支持 : Envoy 完美支持 HTTP/2,也可以很方便地支持 gRPC (gRPC 使用 HTTP/2 作为底层多路复用传输协议)。

服务发现和动态配置 : 与 Nginx 等代理的热加载不同,Envoy 可以通过 API 接口动态更新配置,无需重启代理。

特殊协议支持 : Envoy 支持对特殊协议在 L7 进行嗅探和统计,包括:、 等。

可观测性 : Envoy 内置 stats 模块,可以集成诸如 prometheus/statsd 等监控方案。还可以集成分布式追踪系统,对请求进行追踪。

再来看下Ocelot:其本质还是ASP.NET Core中的一个请求中间件。只能进行7层代理,不支持 gRPC,不支持监控。因此总体而言,Envoy更契合云原生对网络代理的诉求。

5. 总结

本文简要梳理了Envoy的基本用法,以及其在eShopOnContainers中的运用。Envoy作为一个比肩Nginx的服务代理,其特性在Service Mesh中有着灵活的运用。本文就讲到这里了,下次有机会在和大家分享下Envoy在Service Mesh中的应用。

参考资料:

Envoy 介绍 - Envoy 中文指南

Build an API Gateway with Envoy and use with .NET Core APIs

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgsjs.html