一、安装Consul
1、官网下载:https://www.consul.io/downloads.html
2、添加环境变量(添加解压后consul.exe在的目录)
二、运行Consul
1、cmd到Consul安装目录键入命令
consul.exe agent -dev
本地模式,将会使用127.0.0.1 的ip地址
2、浏览器运行:http://localhost:8500/ui/dc1/services
出现下面页面表示启动成功!
3、注册服务(服务定义)
在Consul安装目录下新建文件夹conf并在其文件件新建配置文件service.json,内容如下
{
"encrypt": "7TnJPB4lKtjEcCWWjN6jSA==",
"services": [
{
"id": "API001",
"name": "API001",
"tags": [ "API001" ],
"address": "localhost",
"port": 3003,
"checks": [
{
"id": "API001_Check",
"name": "API001_Check",
"http": "http://localhost:3003/health",/*服务的地址*/
"interval": "10s",
"tls_skip_verify": false,
"method": "GET",
"timeout": "1s"
}
]
},
{
"id": "API002",
"name": "API002",
"tags": [ "API002" ],
"address": "localhost",
"port": 3004,
"checks": [
{
"id": "API002_Check",
"name": "API002_Check",
"http": "http://localhost:3004/health",/*服务的地址*/
"interval": "10s",
"tls_skip_verify": false,
"method": "GET",
"timeout": "1s"
}
]
}
]
}
4、cmd到Consul安装目录使用命令行标志重新启动代理,以指定配置目录并在代理上启用脚本检查。
consul agent -dev -enable-script-checks -config-dir=./conf
浏览器在运行http://localhost:8500/ui/dc1/services,就会出现配置文件里定义的服务
如果出现错误,可能是http配置的服务地址配置错误
三、Ocelot的配置
1、NuGet安装:Ocelot.Provider.Consul
2、添加引用
using Ocelot.Provider.Consul;
Ocelot可以查看你的服务发现,并找到它应该转发下游请求的服务。它可以在这些服务之间进行负载平衡。
1、在Program中BuildWebHost的ConfigureServices方法中添加一行代码
s.AddOcelot()
.AddConsul();
2、在Ocelot.Json中GlobalConfiguration添加以下配置
"ServiceDiscoveryProvider": { //如果未指定主机和端口,将使用Consul默认值
"Host": "localhost",
"Port": 60184,
"Type": "Consul"
}
3、在Ocelot.Json中ReRoutes添加以下配置
//服务发现设置:Ocelot将从服务发现提供程序中查找下游主机和端口,并在所有可用服务中进行负载平衡请求。
"ServiceName": "product", //告诉Ocelot ReRoutes是使用服务发现提供者作为其主机和端口
"LoadBalancerOptions": {
"Type": "LeastConnection"
}
设置后,Ocelot将从服务发现提供程序中查找下游主机和端口,并在所有可用服务中进行负载平衡请求。
四、限流
ocelot 配置,在ReRoutes中加入
"RateLimitOptions": {
"ClientWhitelist": [], //客户端白名单
"EnableRateLimiting": true, //指定启用端点速率限制
"Period": "1m", //指定限制所适用的期间
"PeriodTimespan": 15, //指定可以在一定秒数后重试
"Limit": 5 //指定客户端在定义的时间内可以发出的最大请求数
}
五、最终Ocelot.json
{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 3003
}
],
"UpstreamPathTemplate": "/API001/{everything}",
"UpstreamHttpMethod": [ "Get" ],
//服务发现设置:Ocelot将从服务发现提供程序中查找下游主机和端口,并在所有可用服务中进行负载平衡请求。
"ServiceName": "API001", //告诉Ocelot ReRoutes是使用服务发现提供者作为其主机和端口
"UseServiceDiscovery": true,
"LoadBalancerOptions": { //负载均衡
"Type": "RoundRobin" //LeastConnection
},
"RateLimitOptions": {
"ClientWhitelist": [], //客户端白名单
"EnableRateLimiting": true, //指定启用端点速率限制
"Period": "1m", //指定限制所适用的期间
"PeriodTimespan": 15, //指定可以在一定秒数后重试
"Limit": 5 //指定客户端在定义的时间内可以发出的最大请求数
}
},
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 3004
}
],
"UpstreamPathTemplate": "/API002/{everything}",
"UpstreamHttpMethod": [ "Get" ],
//服务发现设置:Ocelot将从服务发现提供程序中查找下游主机和端口,并在所有可用服务中进行负载平衡请求。
"ServiceName": "API002", //告诉Ocelot ReRoutes是使用服务发现提供者作为其主机和端口
"UseServiceDiscovery": true,
"LoadBalancerOptions": { //负载均衡
"Type": "RoundRobin" //LeastConnection
},
"RateLimitOptions": {
"ClientWhitelist": [], //客户端白名单
"EnableRateLimiting": true, //指定启用端点速率限制
"Period": "1m", //指定限制所适用的期间
"PeriodTimespan": 15, //指定可以在一定秒数后重试
"Limit": 5 //指定客户端在定义的时间内可以发出的最大请求数
}
}
],
"GlobalConfiguration": {
"BaseUrl": "http://localhost:1000",
"servicediscoveryprovider": { //如果未指定主机和端口,将使用consul默认值
"host": "localhost",
"port": 8500,
"type": "consul"
},
"RateLimitOptions": { //限流
"DisableRateLimitHeaders": false, //指定是否禁用X-Rate-Limit和Retry-After标头
"QuotaExceededMessage": "操作太快!", //指定超出的消息
"HttpStatusCode": 999, //指定返回的HTTP状态代码
"ClientIdHeader": "Test" //指定应用于标识客户端的标头。默认情况下为“ ClientId”
}
}
}