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

使用浏览器访问:9901即可访问envoy管理页面,如下图所示:

envoy admin page

2.2. 配置简介

第一次看Envoy的配置文件,和第一次接触Nginx的配置文件一样,绝对一脸懵逼。没关系,咱们来理一理。

作为一个代理,不管是Nginx、HAProxy,还是Envoy,其处理流程都是一样的。其首先都是要监听指定端口获取请求流量,然后分析请求数据,进行请求转发。脑补完大致流程后,再来看 Envoy 是如何组织配置信息的。先来了几个核心配置:

listener : Envoy 的监听地址,用来接收请求,处理入站请求。Envoy 会暴露一个或多个 Listener 来监听客户端的请求。

filter : 过滤器是处理入站和出站流量的链式结构的一部分。在过滤器链上可以集成很多特定功能的过滤器,例如,通过集成 GZip 过滤器可以在数据发送到客户端之前压缩数据。

route_config : 路由规则配置。即将请求路由到后端的哪个集群。

cluster : 集群定义了流量的目标端点,同时还包括一些其他可选配置,如负载均衡策略等。

整体流程如下图所示:

图片来源:https://fuckcloudnative.io/envoy-handbook/docs/gettingstarted/quick-start/

2.3. 代理 ASP.NET Core WebApi

有了上面的基础,下面尝试使用Envoy代理ASP.NET Core WebApi。
首先创建两个简单API,然后创建一个Envoy配置文件,最后通过docker compose启动三个容器进行测试。由于项目文件结构简单,这里不再过多阐述,主要包含四个部分:

City Api

Weather Api

Envoy 代理配置

docker compose 配置

整体解决方案如下图所示。源码路径:K8S.NET.Envoy。

eShopOnContainers 知多少[12]:Envoy gateways

Envoy 代理配置基于第一节的基础上进行修改,如下所示:

admin: access_log_path: /tmp/admin_access.log address: socket_address: protocol: TCP address: 0.0.0.0 port_value: 9903 static_resources: listeners: - name: listener_0 address: socket_address: protocol: TCP address: 0.0.0.0 port_value: 10003 filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: local_service domains: ["*"] routes: - match: prefix: "/c" route: prefix_rewrite: "/city" cluster: city_service - match: prefix: "/w" route: prefix_rewrite: "/weather" cluster: weather_service http_filters: - name: envoy.filters.http.router clusters: - name: city_service connect_timeout: 0.25s type: LOGICAL_DNS # Comment out the following line to test on v6 networks dns_lookup_family: V4_ONLY lb_policy: ROUND_ROBIN load_assignment: cluster_name: city_service endpoints: - lb_endpoints: - endpoint: address: socket_address: address: cityapi port_value: 80 - name: weather_service connect_timeout: 0.25s type: LOGICAL_DNS # Comment out the following line to test on v6 networks dns_lookup_family: V4_ONLY lb_policy: ROUND_ROBIN load_assignment: cluster_name: weather_service endpoints: - lb_endpoints: - endpoint: address: socket_address: address: weatherapi port_value: 80

以上配置Envoy监听10003端口,通过指定prefix_rewrite重写前缀,将/c路由至cityapi的/city路径,将/w路由至weatherapi的/weather路径。

docker-compose配置如下:

version: '3' services: envoygateway: build: Envoy/ ports: - "9903:9903" - "10003:10003" volumes: - ./Envoy/envoy.yaml:/etc/envoy/envoy.yaml cityapi: build: K8S.NET.CityApi/ ports: - "8080:80" environment: ASPNETCORE_URLS: "http://+" ASPNETCORE_ENVIRONMENT: "Development" weatherapi: build: K8S.NET.WeatherApi/ ports: - "8082:80" environment: ASPNETCORE_URLS: "http://+" ASPNETCORE_ENVIRONMENT: "Development"

从上可以看到,主要用来启动三个服务:

envoy gateway:其中将项目路径下/Envoy/envoy.yaml挂载到容器目录/etc/envoy/envoy.yaml。同时暴露2个端口,9903,10003。

city api

weather api

因此最终可以通过以下路径进行访问:

:10003/c 访问city api。

:10003/w 访问weather api。

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

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