Consul初探-集成ocelot

前言

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

今天要完成的架构图

Consul初探-集成ocelot_第1张图片

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

建立 APIGateway 项目

建立空项目

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

Consul初探-集成ocelot_第2张图片

Ocelot 的包引用

Consul初探-集成ocelot_第3张图片

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

Consul初探-集成ocelot_第4张图片

配置网关

首先,我们需要为 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_第5张图片

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

Consul初探-集成ocelot_第6张图片

服务注册正常

启动 ocelot 网关

Consul初探-集成ocelot_第7张图片

访问 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

Consul初探-集成ocelot_第8张图片

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

ocelot 配置文件管理

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

Consul初探-集成ocelot_第9张图片

结束语

从实验结果看,在 .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 ,谢谢支持。

你可能感兴趣的:(Consul初探-集成ocelot)