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

什么是Gateway

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

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

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

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

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

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

f67b3f8d8d9bd175fcbfc27e15e3850a.png

什么是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

23b5ca3fe2c47dd1b80f571a0ff274a7.png

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会真正处理请求。

c171f1c455500f7c150fa7814f9f1493.png

运行Envoy

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

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

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

 b2e4eb12f7000954931e1ed437e26a97.png

 我们进入容器查看其配置,发现其最终会将请求转发到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

ae45d5256ec43d9136e770a52da18a7c.png

准备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

bdae7aacd5cc97ada48f029368588de6.png04a48afb320c53282d47f36e90fd04ca.png

动态文件配置

动态文件可以帮助我们实现当文件发生更改时,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

757998a4f1b7915d320079484230b04a.png

修改动态文件配置

修改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的情况下,实现了配置信息的动态更新

128377a4d3a3c5d0f20124001465c738.png

至此,我们已经通过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 如此令人兴奋

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/296370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

corosync和pacemaker实现httpd和mysql双集群

一、环境介绍&#xff1a;三台均为双网卡&#xff1a;openstack-control.example.com openstack-control eth0:172.16.171.100eth1:10.1.1.100 openstack-nova.example.com openstack-novaeth0:172.16.171.110eth1:10.1.1.110openstack-neutron.example.com openstack-neutrone…

25岁男生要有多少存款才能让女友满意?

1 男女观念差异这么大的吗&#xff1f;▼2 演绎人生从落魄到适应再到悠哉的三个阶段▼3 牌子大&#xff0c;了不起咯~▼4 这鬼才文案用在这里屈才了▼5 狗子&#xff1a;你就说&#xff0c;我演的哪里不像&#xff1f;▼6 7个月一点没变我觉得已经蛮厉害得了▼7 不小心跟…

查看mysql数据库历史_查看mysql数据库历史

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

IT学习--学习不一定要用在现实工作中

很多人在学习知识的时候总是说这个学了没用&#xff0c;这个学了用不上&#xff0c;所以很多人就干脆不学。今天就站在我个人观点上对这个问题进行讨论 以考CCIE为例&#xff0c;有些工作经验的考生会对自己的工作有个的认识&#xff0c;知道自己哪些知识是工作上用得上的&…

心得9--jsp设计模版

1.常用的面向对象设计模式有4种&#xff1a; Factory模式、Singleton模式、Facade模式和MVC架构模式。 SUN公司推出JSP技术后&#xff0c;同时也推荐了两种web应用程序的开发模式&#xff0c;一种是JSPJavaBean模式&#xff0c;一种是ServletJSPJavaBean(MVC)模式。 JSP设计模…

C# 泛型的使用

01—泛型概述泛型是用于处理算法、数据结构的一种编程方法。泛型的目标是采用广泛适用和可交互性的形式来表示算法和数据结构&#xff0c;以使它们能够直接用于软件构造。泛型类、结构、接口、委托和方法可以根据它们存储和操作的数据的类型来进行参数化。泛型能在编译时提供强…

80040e14 mysql_【ASP】提示错误80040e14

是的&#xff0c;提示Cls_vbsPage.asp 行164 有问题&#xff0c;整个代码如下&#xff1a;Class Cls_vbsPagePrivate oConn 连接对象Private iPagesize 每页记录数Private sPageName 地址栏页数参数名Private sDbType数据库类型,AC为access,MSSQL为SQL SERVER2000…

在数学世界,都有这些美妙的数学公式是你不认识的......

全世界只有3.14 % 的人关注了爆炸吧知识什么是数学&#xff1f;华罗庚说&#xff1a;宇宙之大&#xff0c;粒子之微&#xff0c;火箭之速&#xff0c;化工之巧&#xff0c;地球之变&#xff0c;生物之谜&#xff0c;日用之繁&#xff0c;无处不用数学......回首往昔&#xff0c…

Android MediaScanner:(一)MediaScanner总体架构

Android MediaScanner&#xff1a;&#xff08;一&#xff09;MediaScanner总体架构 分类&#xff1a; Android android.multimedia2012-05-19 18:29 5050人阅读 评论(5) 收藏 举报androidservice数据库工作interfaceinsert田海立csdn 2012-05-19 本文是笔者的分析归纳&#xf…

协变和逆变

http://msdn.microsoft.com/zh-cn/library/vstudio/dd997386.aspx转载于:https://www.cnblogs.com/mingyongcheng/archive/2012/11/15/2771568.html

报表系统FineReport通过权限控制数据访问方案

2019独角兽企业重金招聘Python工程师标准>>> 问题&#xff1a;实际应用环境中&#xff0c;不同角色的人可能对数据具有不同的访问权限&#xff0c;通过直接在SQL语句中筛选出需要的数据制作模板可以解决该需求&#xff0c;但对于角色较多的情况&#xff0c;就需要制…

SkyWalking配上告警更优秀

前言对于监控系统来说&#xff0c;不可能让人一直盯着监控看板&#xff0c;而更多的是以自动提醒的方式&#xff0c;比如邮件、短信或微信推送等&#xff0c;当达到或超出预设的告警指标时&#xff0c;就自动发送消息提醒&#xff0c;下面就来说说如何配置SkyWalking的告警。正…

python sqllite远程_Python实现Sqlite将字段当做索引进行查询的方法

本文实例讲述了Python实现Sqlite将字段当做索引进行查询的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;默认从sqlite中获取到的数据是数字索引的, 在开发阶段经常有修改数据库所以显得不太方便, 其实在python源码里就有解决方案, 直接读sqlite3的源码, 摸索了一…

神抓拍!2020搞笑野生动物摄影大赛,哈哈哈哈哈笑到头掉

全世界只有3.14 % 的人关注了爆炸吧知识图片来自CWPAs 2020小动物们到底能有多好玩让我们来看看今年的搞笑野生动物摄影大赛吧保准叫你从头笑到尾&#xff08;以下是入围作品&#xff09;“飚自行车的”猴看起来像个酷猴▲摄影&#xff1a;Yevhen Samuchenko真情实感演绎“我太…

【转载】ESFramewor使用技巧(2)-- 在插件中使用NHibernate

ESFramewor使用技巧&#xff08;2&#xff09;&#xff0d;&#xff0d; 在插件中使用NHibernate 我们来讨论一下这种情景&#xff0c;你采用基于ESFramework的4层架构进行应用开发&#xff0c;你分析用户的需求&#xff0c;并将其分类整理为几大块&#xff0c;考虑每一块使用…

如何在ashx页面获取Session值(未将对象引用设置到对象的实例) (转)

如何在ashx页面获取Session值(未将对象引用设置到对象的实例) 分类&#xff1a; .Net学习笔记 Session 2011-11-30 10:25 902人阅读 评论(1) 收藏 举报在一般事务处理页面&#xff0c;可以轻松的得到 Request,Response对象&#xff0c;从而进行相应的操作&#xff0c;如下&am…

java字符串从后截取_java 字符串截取的几种方式(转)

众所周知,java提供了很多字符串截取的方式。下面就来看看大致有几种。 1.split()+正则表达式来进行截取。 将正则传入split()。返回的是一个字符串数组类型。不过通过这种方式截取会有很大的性能损耗,因为分析正则非常耗时。 String str = "abc,12,3yy98,0"; Strin…

REST 深度进阶

最近团队人数在扩大&#xff0c;才发现&#xff0c;REST 这个出来很多年头的东西&#xff0c;居然还有人用不好。说起来&#xff0c;REST 出现已经很久了。从早期的三层架构&#xff0c;到现在的多层、微服务&#xff0c;核心内容之一就是 API --- 从非常简单的 API&#xff0c…

绝不翻车珍珠奶茶做法

1 如何在家自制珍珠奶茶▼2 儿子&#xff0c;妈妈给你烤小饼干哦▼3 放假太久了连自己哪个班都忘了▼4 想问下&#xff0c;鸟是在哪都能起窝吗&#xff1f;▼5 不到万不得已&#xff0c;绝不去做▼6 这个店名太童年阴影了▼7 小鸡做错了什么&#xff1f;▼你点的每个赞&…

margin三个值

http://www.cnblogs.com/wangkongming/p/3204734.html margin标记可以带一个、二个、三个、四个参数&#xff0c;各有不同的含义。 margin: 20px;&#xff08;上、下、左、右各20px。&#xff09;margin: 20px 40px;&#xff08;上、下20px&#xff1b;左、右40px。&#xff09…