Consul初探-集成ocelot

前言

由于 Consul 的高可用性、丰富的API、友好的 Web 控制台界面等特点,Consul 的发展非常迅猛,得益于 .NETCore 社区的快速发展和社区成员的贡献,我们现在可以非常方便快速的将 Consul 集成到 .NETCore 中,在 Ocelot 的集成方面也是非常的便捷,在 API Gateway 项目中,只需要通过引用一个包,就可以在项目中服务发现了。

今天要完成的架构图

640?wx_fmt=png

上面就是今天要完成的业务架构图,客户端、Ocelot 网关、Consul 集群、计算器服务集群,这几个模块组成了基本的分布式网关模型。

建立 APIGateway 项目

建立空项目

首先我们建立一个空的 Asp.NetCore WebApplication 程序,对于一个简单的网关程序来说,空项目足够了,因为我们写代码的地方不多

640?wx_fmt=png

Ocelot 的包引用

640?wx_fmt=png

我们只需要引用 Ocelot.Provider.Consul ,即可完成 ocelot 和 consul 的依赖引用

640?wx_fmt=png

配置网关

首先,我们需要为 ocelot 网关编写一个配置文件,ocelot 的配置功能非常丰富,具体参考:https://ocelot.readthedocs.io/en/latest/,本次我们只编写一个最简单的 ocelot.json 文件,该配置文件决定了客户端的请求该如何转发到从 Consul 发现到真正的服务实例中。

{	"ReRoutes": [	{	"UseServiceDiscovery": true, // 使用服务发现	"DownstreamPathTemplate": "/{url}", // 转发路由规则	"DownstreamScheme": "http", // 协议	"ServiceName": "node-1", // 服务名称	"LoadBalancerOptions": { // 负载均衡的算法(这里使用平均)	"Type": "RoundRobin"	},	"UpstreamPathTemplate": "/{url}", //  下游请求路由	"UpstreamHttpMethod": [ "Get", "Post" ], // 支持请求方法	"ReRoutesCaseSensitive": false // 路由大小写敏感设置	}	],	"GlobalConfiguration": { // 网关全局配置	"RequestKey": "OcRequestId",	"ServiceDiscoveryProvider": { // 服务发现的配置	"Host": "172.16.1.218",	"Port": 8500,	"ConfigurationKey": "node-1"	}	}	
}

上面就是 ocelot 网关的配置,接下来,还需要在 Startup.cs 类中进行简单的配置。

进行服务注入
  1. public void ConfigureServices(IServiceCollection services)

  2. {

  3. var ocelotConfig = new ConfigurationBuilder().AddJsonFile("ocelot.json", false, true).Build();

  4. services.AddOcelot(ocelotConfig)

  5. .AddConsul()

  6. .AddConfigStoredInConsul();

  7. }

首先加载 ocelot.json 文件,然后将配置注入到服务中

设置路由转发
  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)

  2. {

  3. app.UseHttpsRedirection()

  4. .UseOcelot()

  5. .Wait();

  6. }

通过上面的代码,将 ocelot 注入请求管道中,到这里,配置的工作就已经完成了

创建一个计算器服务

为了演示网关转发和服务发现,我们需要构建一个简单的计算器服务,我准备使用该计算器服务运行两个实例,两个实例运行于同一台服务器上,分别侦听 12008/12009 端口,在服务启动后,该计算器服务将会自动的把自己注册到 Consul 代理服务器集群中,然后 APIGateway 网关从 Consul 发现 12008/12009 服务,并使用负载均衡的机制对两个服务进行调用。

为了方便演示,这里的计算器服务就使用上一篇的代码进行测试了

640?wx_fmt=png

运行计算器服务(12008/12009)

我们需要启动两个服务实例,然后注册到 Consul 中,启动服务

640?wx_fmt=gif

查看 Consul 代理服务器集群的状态

640?wx_fmt=png

服务注册正常

启动 ocelot 网关

640?wx_fmt=png

访问 Ocelot 网关

计算器服务(12008/12009) 服务实例提供的路由地址为:/home/add/{x:int}/{y:int} ,ocelot 网关的侦听地址为:http://172.16.10.227:12200 ,根据路由转发规则,ocelot 网关会把客户端的请求完整的转发到 12008/12009 服务实例上,所以我们可以通过下面的 url 请求服务,即:ocelot网关+12008/12009 路由,组合起来就是:http://172.16.10.227:12200/home/add/{x:int}/{y:int},那么真正的请求 url 为:http://172.16.10.227:12200/home/add/10/10,预期输出结果为:30

640?wx_fmt=gif

通过上面的输出,可以看到,从网关到真正的服务实例,这个环节已经打通了,通过不断的刷新网页请求,下方的两个服务实例总是一前一后的持续输出日志,这就足以证明我们在 ocelot 服务网关配置的负载均衡算法 "Type": "RoundRobin" 发挥了作用。

ocelot 配置文件管理

通过查看 Consul Web 控制台的界面的 Key/Value 菜单,发现 ocelot 将配置文件 ocelot.json 存储到 Consul 中了,我们可以在 Consul 中对网关进行可视化管理,修改保存即可。

640?wx_fmt=png

结束语

从实验结果看,在 .NETCore 中集成 APIGateway 和 Consul 还是比较简单的事情,当然,大部分的项目在项目开放进程中,大概率是不会一次性使用到这么多组件的,不过我相信,随着架构的演进,这些项目最终也不得不考虑服务注册、发现、调度、负载均衡等这些问题,引入网关,就势在必行了。

.NETCore 集成 Consul 导读

  • 1、Consul初探-在深交之前先认识

  • 2、Consul初探-从安装到运行

  • 3、Consul初探-服务注册和发现

  • 4、Consul初探-集成ocelot

源代码下载

本文所有源代码已托管到 Github ,欢迎下载测试 https://github.com/lianggx/Examples/tree/master/Ron.Consul ,如果觉得还行,请点击 star ,谢谢支持。

640?wx_fmt=jpeg


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

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

相关文章

2021年广东工业大学第十五届文远知行杯程序设计竞赛(同步赛) H.有多短 思维

传送门 文章目录题意:思路:题意: 思路: 可以发现树的直径起点和终点一定是两个度数为111的点,所以我们可以把kkk平均的分给所有度数为111的点,这样答案就为2∗kcnt\frac{2*k}{cnt}cnt2∗k​。 证如果分配给…

Identity和IdentityServer的区别及联系

关于Identity和IdentityServer初学的时候可能会有一些疑惑(虽然我也不是很精深吧),但是,这里说一下自己关于这两者的一些理解,如有错误,欢迎指正总体上,ASP.NET Core Identity提供了一个用来管理和存储用户账户的框架.IdentitySer…

C#规范整理·集合和Linq

LINQ(Language Integrated Query,语言集成查询)提供了类似于SQL的语法,能对集合进行遍历、筛选和投影。一旦掌握了LINQ,你就会发现在开发中再也离不开它。  开始!前言C#中的集合表现为数组和若干集合类。不管是数组还…

UVA - 11361 Investigating Div-Sum Property(数位dp/记忆化搜索板子)

题目:https://vjudge.net/problem/UVA-11361 思路:数位dp,用记忆化搜索写,dp[pos][i][j][limit] 代表剩余有pos位,每位上的数字和模k 等于i, 当前总数值模k等于j,limit代表限制位。 本题还要注意…

C#并发编程之异步编程(三)

写在前面本篇是异步编程系列的第三篇,本来计划第三篇的内容是介绍异步编程中常用的几个方法,但是前两篇写出来后,身边的朋友总是会有其他问题,所以决定再续写一篇,作为异步编程(一)和异步编程(二)的补充。本篇内容主要…

UVA - 10253 Series-Parallel Networks(递推式、记忆化搜索写法)

题目:UVA-10253 题目翻译(来自蓝书): 串并联网络有两个端点,一个叫源,一个叫汇,递归定义如下: (1) 一条单独的边是串并联网络。 (2)…

C#规范整理·泛型委托事件

基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用。同时,它减少了泛型类及泛型方法中的转型,确保了类型安全。委托本身是一种引用类型,它保存的也是托管堆中对象的引用,只不过这个引用比较特殊&a…

Abp v0.18.0 新版本: MVC Module 启动模板

0.18.0将于近期发布, 本文内容针对于0.18.0版本.MVC模块启动模板可用此模板开发基于模块开发最佳实践和约定的可复用 应用程序模块 . 它同样适用于开发微服务.如何开始?你可以使用ABP CLI创建基于此启动模板的新项目,或者你也可以在入门页面创建并下载项目. 在这里我们使用CLI…

Consul-template+nginx实现自动负载均衡

前言consul-template 是 Consul 的一个守护程序,使用 consul-template 可以方便快速的实现对 Consul Key/Value 存储系统的访问,可以从 KV 系统中读取数据、监视变动、同步本地文件;还可以在执行模板更新的同时,执行本地系统命令&…

Codeforces Round #613 (Div. 2) E. Delete a Segment 离散化

传送门 文章目录题意:思路:题意: 思路: 我们考虑将区间内的位置都111,之后求区间段数就可以转换成求,连续不为000的区间段数,由于范围有[−1e9,1e9][-1e9,1e9][−1e9,1e9]的级别,所…

是时候挥别 SQL Server 2008 了

微软 宣布将于 2019 年 7 月终止对 SQL Server 2008 和 2008 R2 的支持,使用 SQL Server 2008 的公司应该认真开始考虑下一步了。本文引用了一家数字化转型咨询公司高级顾问对此的分析,并提供了一些解决方案和注意事项。如果你还在使用 微软 2008 版的 S…

领域驱动设计,让程序员心中有码(八)

领域驱动是十五年前,由Eric Evans提出的解决软件工程复杂性问题的方法,作者从自己多年软件开发的角度出发,通过引入领域驱动设计的概念以及一系列战略设计模式和战术方法,为混沌的软件开发领域带来了一缕阳光。在过去的许多年&…

H - Great Cells Gym - 101194H(数学推导/思维)

VJ地址 ps:在训练时写这道题 差点被送走了 我们可以发现给出的公式可以转化这样 这个就不说了,就是k^(nm)所以排列的可能; 然后我们要重点观察这个公式,可以发现g * Ag(方案数 * good点的数量) 可以意味这组成一个…

基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体之基础

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.文档地址: https://liningit.github.io/LnskyDB/开源地址: https://github.com/liningit/LnskyDBnuget地址: https://www.nuget.org/packages/LnskyDB…

技术达人“创造营”官宣:Microsoft Learn 学习平台C位出道

真的大神敢于直面随时更新的IT技术你是要做一个平平无奇的“合格员工”?还是要做一个博古通今的“江湖百晓生”?转型变化,是时代的氛围面对日新月异的技术更新一不留神,就会沦落为“技术支持滞后人员”在微软,有这样一…

P2839 [国家集训队]middle 二分 + 主席树 在值域上建区间

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 我们先解决怎么判断中位数的问题&#xff0c;我们可以二分一个midmidmid&#xff0c;将<mid<mid<mid的值都变成−1-1−1&#xff0c;其他的数都变成111&#xff0c;那么当全部的和…

读再多书都没觉得自己变强?试试我这“5年陈”的方法

这里是Z哥的个人公众号每周五早8点 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「76」篇原创敬上4800字巨献奉上hi&#xff0c;大家好。三周过去了&#xff0c;上次教你的几个「速读」技巧练习的怎么样了&#xff1f;上周&#xff0c;已经有不少小伙们开始催…

Educational Codeforces Round 77 (Rated for Div. 2) C. Infinite Fence 数论

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 碰到这样的题肯定是先写几个找找规律了&#xff0c;随便写几个就可以发现是以lcm(a,b)lcm(a,b)lcm(a,b)为一个循环&#xff0c;所以我们只需要在一个周期lcm(a,b)lcm(a,b)lcm(a,b)中求最长…

C# 内存的理解 通俗说

一.概念堆栈是什么&#xff1f;在说堆栈之前&#xff0c;先说说内存是神马&#xff1f;内存&#xff1a;程序在运行的过程&#xff0c;电脑需要不断通过CPU进行计算&#xff0c;这个计算的过程会读取并产生运算的数据&#xff0c;这些数据需要一个存储容器存放。这个容器&#…

P3899 [湖南集训]谈笑风生 主席树解决二维数点

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 思路&#xff1a; 由于a,ba,ba,b都比ccc厉害&#xff0c;那么a,ba,ba,b一定是某个是某个的祖先。那么就分为两种情况了&#xff1a; (1)(1)(1) bbb在aaa上面&#xff0c;约定depth[1]1depth[1]1depth[1]1&am…