什么是Gateway

在微服务体系结构中,如果每个微服务通常都会公开一组精细终结点,这种情况可能会有以下问题

  1. 如果没有 API 网关模式,客户端应用将与内部微服务相耦合

  2. 在客户端应用中,单个页面/屏幕可能需要多次调用多个服务。

  3. 如果没有网关,所有微服务必定会暴露在“外部世界”中。

  4. 每个公开发布的微服务都必须处理授权和 SSL 等问题。

而Gateway可以为微服务组提供单一入口点,API 网关位于客户端应用和微服务之间。它充当反向代理,将请求从客户端路由到服务。它还可以提供其他跨领域功能,例如身份验证、SSL 终止和缓存

什么是Envoy

Envoy 是专为大型现代 SOA(面向服务架构)架构设计的 L7 代理和通信总线,它有以下优势

  1. C++11编写,原生代码高性能

  2. L3/L4 filter架构,例如TCP代理

  3. HTTP L7 filter架构,缓存,限速,路由/转发

  4. 顶级HTTP2与GRPC支持

  5. 服务发现与动态配置

  6. 健康检查

  7. 高级负载均衡

我们可以借助Envoy实现API Gateway。Envoy通过yaml配置文件来组织网关的信息。下面来说说Envoy中的核心概念

.NET网关与Gateway实战-Envoy与kong课程希望大家支持  https://ke.qq.com/course/4033027?tuin=1271860f

Listener

一个命名的网络地址,可以被下游客户端连接,它的配置样式如下:

static_resources:listeners:- name: listener_0address:socket_address:protocol: TCPaddress: 0.0.0.0port_value: 10000

此配置说明Envoy监听在10000端口,下游客户端可以通过此端口与Envoy交互

L3/L4过滤器Filter

L3/L4过滤器Filter可以帮我们实现如:HTTP连接管理,限速,TCP代理等功能,它的配置样式如下:

filter_chains:- filters:- name: envoy.filters.network.http_connection_managertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerscheme_header_transformation:scheme_to_overwrite: httpstat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match:prefix: "/"route:host_rewrite_literal: 192.168.43.94cluster: service_envoyproxy_iohttp_filters:- name: envoy.filters.http.router

此配置说明通过HttpConnectionManager这个过滤器来接受HTTP请求,并将请求通过router过滤器的配置转发到service_envoyproxy_io这个上游集群

Upstream Cluster

Envoy 的集群管理器管理所有配置的上游集群,用来真正处理Envoy接受的请求,其配置样式如下:

clusters:- name: service_envoyproxy_ioconnect_timeout: 30stype: strict_dnsdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINload_assignment:cluster_name: service_envoyproxy_ioendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.43.94port_value: 5000

此配置说明Envoy会将请求转发到192.168.43.94:5000这个地址。

调用逻辑我们总结如下,Listener接受请求,将请求交给过滤器,过滤器处理完后,根据路由规则将请求转发给上游集群,上游集群中的endpoint会真正处理请求。

运行Envoy

我们通过docker运行一个默认Envoy容器

docker run --rm -it -p 9901:9901 -p 10000:10000 envoyproxy/envoy-dev

访问http://localhost:10000/,发现其跳转到Envoy官网

我们进入容器查看其配置,发现其最终会将请求转发到www.envoyproxy.io

cat /etc/envoy/envoy.yaml
- lb_endpoints:- endpoint:address:socket_address:address: www.envoyproxy.ioport_value: 443

静态文件配置

我们现在通过Envoy来实现我们自己的网关。静态文件配置是我们把配置信息提前配置好,Envoy启动后不可修改配置内容

准备服务

我们准备两个.NET WebAPI,server1与server2,其中分别创建NameController,并新建Get方法

Server1

[HttpGet]public string Get(){_logger.LogInformation("call server1");var req = Request;return "server1";}

Server2

[HttpGet]public string Get(){_logger.LogInformation("call server2");var req = Request;return "server2";}

并将server1的启动端口指定为5000,将server2的启动端口指定为5001

Server1

webBuilder.UseUrls("http://*:5555").UseStartup<Startup>();

Server2

webBuilder.UseUrls("http://*:5001/").UseStartup<Startup>();

我们启动Server1与Server2

准备Envoy配置

我们将上节课的默认Envoy配置文件从容器中取出,并作修改如下

admin:address:socket_address:protocol: TCPaddress: 0.0.0.0port_value: 9901
static_resources:listeners:- name: listener_0address:socket_address:protocol: TCPaddress: 0.0.0.0port_value: 10000filter_chains:- filters:- name: envoy.filters.network.http_connection_managertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerscheme_header_transformation:scheme_to_overwrite: httpstat_prefix: ingress_httproute_config:name: local_routevirtual_hosts:- name: local_servicedomains: ["*"]routes:- match:prefix: "/"route:host_rewrite_literal: 192.168.43.94cluster: service_envoyproxy_iohttp_filters:- name: envoy.filters.http.routerclusters:- name: service_envoyproxy_ioconnect_timeout: 30stype: static# Comment out the following line to test on v6 networksdns_lookup_family: V4_ONLYlb_policy: ROUND_ROBINload_assignment:cluster_name: service_envoyproxy_ioendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.43.94port_value: 5000- endpoint:address:socket_address:address: 192.168.43.94port_value: 5001

我们启动Envoy,验证配置是否正确

docker run --rm -it -p 9901:9901 -p 10000:10000 -v D:/gateway/envoy/config/static/envoy.yaml:/etc/envoy/envoy.yaml -v D:/gateway/envoy/logs:/logs envoyproxy/envoy-dev  -c /etc/envoy/envoy.yaml --log-path logs/custom.log

调用api,发现其实现了负载

http://localhost:10000/Name

动态文件配置

动态文件可以帮助我们实现当文件发生更改时,Envoy 将自动更新其配置。

修改静态文件,将其中的cluster提取到cds.yaml文件中

resources:
- "@type": type.googleapis.com/envoy.config.cluster.v3.Clustername: example_proxy_clustertype: STRICT_DNStyped_extension_protocol_options:envoy.extensions.upstreams.http.v3.HttpProtocolOptions:"@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptionsexplicit_http_config:http_protocol_options: {}load_assignment:cluster_name: example_proxy_clusterendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.43.94port_value: 5000

将listener提取到lds.yaml文件中

resources:
- "@type": type.googleapis.com/envoy.config.listener.v3.Listenername: listener_0address:socket_address:address: 0.0.0.0port_value: 10000filter_chains:- filters:- name: envoy.http_connection_managertyped_config:"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManagerstat_prefix: ingress_httphttp_filters:- name: envoy.filters.http.routerroute_config:name: local_routevirtual_hosts:- name: local_servicedomains:- "*"routes:- match:prefix: "/envoyapi/"route:prefix_rewrite: "/"host_rewrite_literal: 192.168.43.94cluster: example_proxy_cluster

修改envoy.yaml让其引用lds.yaml与cds.yaml文件

admin:address:socket_address:protocol: TCPaddress: 0.0.0.0port_value: 9902
node:cluster: test-clusterid: test-id
dynamic_resources:cds_config:path: /etc/envoy/cds.yamllds_config:path: /etc/envoy/lds.yaml

启动Envoy

docker run --rm -it -p 9902:9902 -p 10000:10000 -v D:/gateway/envoy/config/dynamic/:/etc/envoy/ -v D:/gateway/envoy/logs:/logs envoyproxy/envoy-dev  -c /etc/envoy/envoy.yaml --log-path logs/custom.log

调用api,发现调用成功

http://localhost:10000/envoyapi/Name

修改动态文件配置

修改cds.yaml,将endpoint端口设置为5001

resources:
- "@type": type.googleapis.com/envoy.config.cluster.v3.Clustername: example_proxy_clustertype: STRICT_DNStyped_extension_protocol_options:envoy.extensions.upstreams.http.v3.HttpProtocolOptions:"@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptionsexplicit_http_config:http_protocol_options: {}load_assignment:cluster_name: example_proxy_clusterendpoints:- lb_endpoints:- endpoint:address:socket_address:address: 192.168.43.94port_value: 5001

进入容器内部强制更新文件

# cd /etc/envoy
# mv cds.yaml tmp
# mv tmp cds.yaml

调用api,发现在不重启Envoy的情况下,实现了配置信息的动态更新

至此,我们已经通过Envoy的静态配置与文件动态配置实现了一个网关来代理我们的.NET程序

相关文章:

  • Dapr实战(一) 基础概念与环境搭建

  • Dapr + .NET Core实战(二) 服务调用

  • Dapr + .NET Core实战(三)状态管理

  • Dapr + .NET 实战(四)发布和订阅

  • Dapr + .NET 实战(五)Actor

  • Dapr + .NET 实战(六)绑定

  • Dapr + .NET 实战(七)Secrets

  • Dapr + .NET 实战(八)服务监测

  • Dapr + .NET 实战(九)本地调试

  • Dapr + .NET 实战(十-终篇)K8S运行Dapr

  • Dapr + .NET实战(十一)单机Dapr集群负载均衡

  • Dapr + .NET 实战(十二)服务调用之GRPC

  • Dapr + .NET 实战(十三)跨语言开发

  • 为什么 Dapr 如此令人兴奋

Envoy实现.NET架构的网关(一)静态配置与文件动态配置相关推荐

  1. Envoy实现.NET架构的网关(五)集成Redis实现限流

    .NET网关与Gateway实战-Envoy与kong课程 什么是限流 限流即限制并发量,限制某一段时间只有指定数量的请求进入后台服务器,遇到流量高峰期或者流量突增时,把流量速率限制在系统所能接受的合 ...

  2. Envoy实现.NET架构的网关(三)代理GRPC

    .NET网关与Gateway实战-Envoy与kong课程 Envoy实现.NET架构的网关(一)静态配置与文件动态配置 Envoy实现.NET架构的网关(二)基于控制平面的动态配置 什么是GRPC ...

  3. Envoy实现.NET架构的网关(四)集成IdentityServer4实现OAuth2认证

    .NET网关与Gateway实战-Envoy与kong课程 什么是OAuth2认证 简单说,OAuth 就是一种授权机制.数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据.系统从而产生一 ...

  4. 路由器的静态路由配置以及OSPF动态配置

    路由器的路由配置 文章目录 路由器的路由配置 路由器的静态配置 实验拓扑图 配置IP和环回IP AR1 AR2 AR3 配置PC PC1 PC2 PC3 配置路由器的静态路由 AR1 AR2 AR3 ...

  5. 微服务架构:动态配置中心搭建

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在微服务架构中,服务之间有着错综复杂的依赖关系,每个服务都有自己的依赖配置,在运行期间很多配置会根据访问流量等因素进行调整,传统的配置信息 ...

  6. 合沟微服务怎么添加_微服务架构:动态配置中心搭建

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在微服务架构中,服务之间有着错综复杂的依赖关系,每个服务都有自己的依赖配置,在运行期间很多配置会根据访问流量等因素进行调整,传统的配置信息 ...

  7. ensp华为路由器静态配置和动态配置

    #作业三# 实验一 实验环境 实验思路 1.规划并配置IP 2.静态配置 3.检验连通性 具体实施 实验二 实验环境 实验思路 1.规划并配置IP 2.动态配置 3.检验连通性 具体实施 实验总结 实 ...

  8. iOS架构-分离静态库.a文件并导出.m伪代码文件(11)

    之前合成了静态库.a, 有时候我们会拿到别人提供的静态库,但是编译报错,这时候最先要考虑的一步就是这个静态库是否支持我们编译的架构.怎么查看支持的架构?废话不多说!下面亲自实验一下 第一步: 准备一个 ...

  9. 电子电气架构车载网关系列——网关主要应用场景及相关要求

    电子电气架构车载网关系列--网关主要应用场景及相关要求 在整车电子电气架构伴随着需求不断发展,架构也在不断变化,从最初的分布式到现在域控制器式(还有说法最后会到中央处理器,其余全是传感器和执行器),另 ...

最新文章

  1. 《基于PLL分频计数的LED灯闪烁实例》实验记录
  2. MVC三层+会话层+线程安全+抽象工厂+DataBase First的基础框架
  3. NYOJ 56 阶乘因式分解(一)
  4. CKEditor上传视频(java)
  5. leetcode 622. Design Circular Queue | 622. 设计循环队列(Ring Buffer)
  6. css未生效,css不生效是什么原因
  7. 携程2019秋招面经
  8. 密码学系列 - DER编码
  9. Win10下AutoCAD2014 +VS2010 + Object2014 安装与配置环境
  10. 用开源代码如何建立网站_建立全球开源法律网络
  11. python走迷宫_Python使用Tkinter实现机器人走迷宫
  12. python cookbook 读书笔记2(字符串处理2)
  13. 服务器可以装win7或win10系统吗,win10改win7用legacy还是uefi?_网站服务器运行维护,window...
  14. Tableau 将 null 值显示在 0 处 (ZN 函数 或 显示特殊值)
  15. OvR逻辑回归多分类算法
  16. 混合波束成形| 部分连接系统 :Hybrid Precoding for mmWave Massive MIMO Systems With Partially-Connected Structure
  17. 初识MIMO(三):天线分集技术及其仿真
  18. 洪泰基金俞敏洪:创业24年,我的五点思考
  19. 七十七.ags4-1.1.15
  20. nova-week3

热门文章

  1. 3732: Network
  2. 设计模式-Factory Method Pattern
  3. python怎么编辑文件_如何使用python中的方法对文件进行修改文件名
  4. UBUNTU 用户及用户组管理 修改用户和主机名
  5. JavaScript方法
  6. LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)
  7. Oracle-逻辑体系结构
  8. Python面向对象学习 1 (什么是面向对象,面向对象的应用场景,待更新)
  9. Xmemcached学习笔记一(安装memcached)
  10. Linux下使用shell实现上传linux下某个目录下所有文件到ftp