因为 Consul 的高可用性、丰富的API、友好的 Web 控制台界面等特色,Consul 的发展很是迅猛,得益于 .NETCore 社区的快速发展和社区成员的贡献,咱们如今能够很是方便快速的将 Consul 集成到 .NETCore 中,在 Ocelot 的集成方面也是很是的便捷,在 API Gateway 项目中,只须要经过引用一个包,就能够在项目中服务发现了。html
上面就是今天要完成的业务架构图,客户端、Ocelot 网关、Consul 集群、计算器服务集群,这几个模块组成了基本的分布式网关模型。node
首先咱们创建一个空的 Asp.NetCore WebApplication 程序,对于一个简单的网关程序来讲,空项目足够了,由于咱们写代码的地方很少git
咱们只须要引用 Ocelot.Provider.Consul ,便可完成 ocelot 和 consul 的依赖引用github
首先,咱们须要为 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 类中进行简单的配置。json
public void ConfigureServices(IServiceCollection services) { var ocelotConfig = new ConfigurationBuilder().AddJsonFile("ocelot.json", false, true).Build(); services.AddOcelot(ocelotConfig) .AddConsul() .AddConfigStoredInConsul(); }
首先加载 ocelot.json 文件,而后将配置注入到服务中api
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseHttpsRedirection() .UseOcelot() .Wait(); }
经过上面的代码,将 ocelot 注入请求管道中,到这里,配置的工做就已经完成了服务器
为了演示网关转发和服务发现,咱们须要构建一个简单的计算器服务,我准备使用该计算器服务运行两个实例,两个实例运行于同一台服务器上,分别侦听 12008/12009 端口,在服务启动后,该计算器服务将会自动的把本身注册到 Consul 代理服务器集群中,而后 APIGateway 网关从 Consul 发现 12008/12009 服务,并使用负载均衡的机制对两个服务进行调用。架构
为了方便演示,这里的计算器服务就使用上一篇的代码
咱们须要启动两个服务实例,而后注册到 Consul 中,启动服务
服务注册正常
计算器服务(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" 发挥了做用。
经过查看 Consul Web 控制台的界面的 Key/Value 菜单,发现 ocelot 将配置文件 ocelot.json 存储到 Consul 中了,咱们能够在 Consul 中对网关进行可视化管理,修改保存便可。
从实验结果看,在 .NETCore 中集成 APIGateway 和 Consul 仍是比较简单的事情,固然,大部分的项目在项目开放进程中,大几率是不会一次性使用到这么多组件的,不过我相信,随着架构的演进,这些项目最终也不得不考虑服务注册、发现、调度、负载均衡等这些问题,引入网关,就势在必行了。
本文全部源代码已托管到 Github ,欢迎下载测试 https://github.com/lianggx/Examples/tree/master/Ron.Consul ,若是以为还行,请点击 star ,谢谢支持。