Consul
Consul 是一款开源软件,做服务发现等的,前面我们将到将路由做成配置文件,其实这是不够的,举一个例子:我怎么知道这个服务是否可用呢?能不能定时做健康检查呢?
类似软件还有:zookeeper、eureka、etcd。
安装运行
下载后,解压,就一个 consul.exe。
使用命令提示符定位到该文件夹,运行:
consul agent -dev
浏览器输入:http://localhost:8500/,就可以看到下面的界面了:
手动向 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 上面的。
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" } } }
可以看出,每个路由的主机、端口不要了,增加了:ServiceName、LoadBalancerOptions、UseServiceDiscovery,这里 ServiceName,就是前面说的要注意的 Name,二者要一致。
另外还增加了 GlobalConfiguration、ServiceDiscoveryProvider。
这样 Ocelot 就知道从 Consul 去找这些地址了。
三、修改 Program.cs
我们是直接写在 Program.cs 中的,有些人是写在 Startup.cs 中的。
一是增加一个命名空间引用:
using Ocelot.Provider.Consul;
二是在 ConfigureServices 中增加 AddConsul():
.ConfigureServices(s => { s.AddOcelot() .AddConsul(); })
Ctrl + F5
我们可以发现,程序如初那样运行起来了。