前言
由于 Consul 的高可用性、丰富的API、友好的 Web 控制台界面等特点,Consul 的发展非常迅猛,得益于 .NETCore 社区的快速发展和社区成员的贡献,我们现在可以非常方便快速的将 Consul 集成到 .NETCore 中,在 Ocelot 的集成方面也是非常的便捷,在 API Gateway 项目中,只需要通过引用一个包,就可以在项目中服务发现了。
今天要完成的架构图
上面就是今天要完成的业务架构图,客户端、Ocelot 网关、Consul 集群、计算器服务集群,这几个模块组成了基本的分布式网关模型。
建立 APIGateway 项目
建立空项目
首先我们建立一个空的 Asp.NetCore WebApplication 程序,对于一个简单的网关程序来说,空项目足够了,因为我们写代码的地方不多
Ocelot 的包引用
我们只需要引用 Ocelot.Provider.Consul ,即可完成 ocelot 和 consul 的依赖引用
配置网关
首先,我们需要为 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 类中进行简单的配置。
进行服务注入
public void ConfigureServices(IServiceCollection services)
{
var ocelotConfig = new ConfigurationBuilder().AddJsonFile("ocelot.json", false, true).Build();
services.AddOcelot(ocelotConfig)
.AddConsul()
.AddConfigStoredInConsul();
}
首先加载 ocelot.json 文件,然后将配置注入到服务中
设置路由转发
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseHttpsRedirection()
.UseOcelot()
.Wait();
}
通过上面的代码,将 ocelot 注入请求管道中,到这里,配置的工作就已经完成了
创建一个计算器服务
为了演示网关转发和服务发现,我们需要构建一个简单的计算器服务,我准备使用该计算器服务运行两个实例,两个实例运行于同一台服务器上,分别侦听 12008/12009 端口,在服务启动后,该计算器服务将会自动的把自己注册到 Consul 代理服务器集群中,然后 APIGateway 网关从 Consul 发现 12008/12009 服务,并使用负载均衡的机制对两个服务进行调用。
为了方便演示,这里的计算器服务就使用上一篇的代码 进行测试了
运行计算器服务(12008/12009)
我们需要启动两个服务实例,然后注册到 Consul 中,启动服务
查看 Consul 代理服务器集群的状态
服务注册正常
启动 ocelot 网关
访问 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
通过上面的输出,可以看到,从网关到真正的服务实例,这个环节已经打通了,通过不断的刷新网页请求,下方的两个服务实例总是一前一后的持续输出日志,这就足以证明我们在 ocelot 服务网关配置的负载均衡算法 "Type": "RoundRobin" 发挥了作用。
ocelot 配置文件管理
通过查看 Consul Web 控制台的界面的 Key/Value 菜单,发现 ocelot 将配置文件 ocelot.json 存储到 Consul 中了,我们可以在 Consul 中对网关进行可视化管理,修改保存即可。
结束语
从实验结果看,在 .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 ,谢谢支持。