使用浏览器访问:9901即可访问envoy管理页面,如下图所示:
第一次看Envoy的配置文件,和第一次接触Nginx的配置文件一样,绝对一脸懵逼。没关系,咱们来理一理。
作为一个代理,不管是Nginx、HAProxy,还是Envoy,其处理流程都是一样的。其首先都是要监听指定端口获取请求流量,然后分析请求数据,进行请求转发。脑补完大致流程后,再来看 Envoy 是如何组织配置信息的。先来了几个核心配置:
listener : Envoy 的监听地址,用来接收请求,处理入站请求。Envoy 会暴露一个或多个 Listener 来监听客户端的请求。
filter : 过滤器是处理入站和出站流量的链式结构的一部分。在过滤器链上可以集成很多特定功能的过滤器,例如,通过集成 GZip 过滤器可以在数据发送到客户端之前压缩数据。
route_config : 路由规则配置。即将请求路由到后端的哪个集群。
cluster : 集群定义了流量的目标端点,同时还包括一些其他可选配置,如负载均衡策略等。
整体流程如下图所示:
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。
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。