.NET Core 微服务 - API 网关之 Ocelot 与 Consul 服务发现

作者:vkvi 来源:ITPOW(原创) 日期:2022-3-31

Consul

Consul 是一款开源软件,做服务发现等的,前面我们将到将路由做成配置文件,其实这是不够的,举一个例子:我怎么知道这个服务是否可用呢?能不能定时做健康检查呢?

类似软件还有:zookeeper、eureka、etcd。

官网:https://www.consul.io/

安装运行

下载后,解压,就一个 consul.exe

使用命令提示符定位到该文件夹,运行:

consul agent -dev

浏览器输入:http://localhost:8500/,就可以看到下面的界面了:

Consul

手动向 Consul 注册服务

打开 Postman

  • 网址:http://localhost:8500/v1/agent/service/register

  • 谓词:PUT

选择 raw,在文本区输入以下内容:

{
  "ID": "Service1",
  "Name": "WeatherService",
  "Tags": [
    "primary",
    "v1"
  ],
  "Address": "localhost",
  "Port": 7219,
  "EnableTagOverride": false,
  "Check": {
    "DeregisterCriticalServiceAfter": "90m",
    "HTTP": "https://localhost:7219/weatherforecast",
    "Interval": "10s"
  }
}

还记得前面章节,我们建了 2 个 Web API 么?这就是要注册其中的一个,这是天气那个,localhost、7219 就是这个天气 API 的地址和端口。

  • 注意这个 Name,我们后面会用到。

  • Check 里面有个 HTTP,这个是健康检查的网址,Consul 会定期去检查是否可用。

按照上面的格式,再将 City 那个 Web API 也添加上去。

如果弄错了,要移除,则使用:/agent/service/deregister/service_id,也是 PUT

看看刚才添加的服务

访问:http://localhost:8500/v1/catalog/service/WeatherService

更多接口请参见:Service - Agent - HTTP API | Consul by HashiCorp

再访问 http://localhost:8500/

可以看到,两个服务已经添加上了,由于我们只有一台测试机,所以这些服务都是在一个 Node 上面的。

Consul 服务

Ocelot

一、在 Ocelot 项目中,添加 Ocelot.Provider.Consul

NuGet 添加:Ocelot.Provider.Consul

二、ocelot.json 修改为

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/weatherforecast",
      "DownstreamScheme": "https",
      "UpstreamPathTemplate": "/tq",
      "UpstreamHttpMethod": [ "Get" ],

      "ServiceName": "WeatherService",
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      },
      "UseServiceDiscovery": true
    },
    {
      "DownstreamPathTemplate": "/city",
      "DownstreamScheme": "https",
      "UpstreamPathTemplate": "/cs",
      "UpstreamHttpMethod": [ "Get" ],

      "ServiceName": "CityService",
      "LoadBalancerOptions": {
        "Type": "RoundRobin"
      },
      "UseServiceDiscovery": true
    }
  ],
  
  "GlobalConfiguration": {
    "ServiceDiscoveryProvider": {
      "Host": "localhost",
      "Port": 8500,
      "Type": "Consul"
    }
  }
}

可以看出,每个路由的主机、端口不要了,增加了:ServiceNameLoadBalancerOptionsUseServiceDiscovery这里 ServiceName,就是前面说的要注意的 Name,二者要一致。

另外还增加了 GlobalConfigurationServiceDiscoveryProvider

这样 Ocelot 就知道从 Consul 去找这些地址了。

三、修改 Program.cs

我们是直接写在 Program.cs 中的,有些人是写在 Startup.cs 中的。

一是增加一个命名空间引用:

using Ocelot.Provider.Consul;

二是在 ConfigureServices 中增加 AddConsul()

.ConfigureServices(s => {
    s.AddOcelot()
    .AddConsul();
})

Ctrl + F5

我们可以发现,程序如初那样运行起来了。

相关文章