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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值