继续对之前的项目进行修改
对Gateway项目中的ocelot.json配置文件进行修改,对于负载均衡的轮询模式还是在Ocelot的配置文件中配置的
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
其实只需要Ocelot配置的服务名对应在Consul中有多个服务实例就行了。
{
"ReRoutes": [
{
"UpstreamPathTemplate": "/Service2/{url}",
"UpstreamHttpMethod": [ "Get", "Post" ],
"UseServiceDiscovery": true,
"ServiceName": "demoName",
"DownstreamPathTemplate": "/api/{url}",
"DownstreamScheme": "http",
//"DownstreamHostAndPorts": [
// {
// "Host": "localhost",
// "Port": 5001
// }
//],
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
//缓存
//"FileCacheOptions": {
// "TtlSeconds": 30, //缓存时间(秒)
// "Region": "CacheArea" //缓存区(名称自定义),表示改配置缓存放到哪个区域,可以在配置管理中进行维护
//}
}
],
"GlobalConfiguration": {
"ServiceDiscoveryProvider": {
"Host": "127.0.0.1",
"Port": 8500,
"Type": "Consul" //PollConsul
}
}
}
修改Consul中的配置文件
服务名都是demoName但是有两个服务实例
{
"services": [
{
"id": "consul-service-demo1",
"name": "demoName",
"tags": [ "demo" ],
"address": "127.0.0.1",
"port": 5001,
"checks": [
{
"id": "ApiServiceA_Check",
"name": "ApiServiceA_Check",
"http": "http://127.0.0.1:5001/api/Health/Index",
"interval": "10s",
"tls_skip_verify": false,
"method": "GET",
"timeout": "1s"
}
]
},
{
"id": "consul-service-demo2",
"name": "demoName",
"tags": [ "demo" ],
"address": "127.0.0.1",
"port": 5002,
"checks": [
{
"id": "ApiServiceB_Check",
"name": "ApiServiceB_Check",
"http": "http://127.0.0.1:5002/api/Health/Index",
"interval": "10s",
"tls_skip_verify": false,
"method": "GET",
"timeout": "1s"
}
]
}
]
}
通过命令consul agent -dev -config-dir=D:\Soft\consul_1.8.5_windows_amd64启动Consul
然后对Service1的webapi项目分别运行在5001和5002端口处
通过http://localhost:8500可以看到
服务demoName就是我们刚才配置的,可以看到有2个实例
点击进去看可以看到,就是我们刚才配置文件上设置的demoName的两个实例
现在我们启动网关程序Gateway,可以通过http://localhost:5000/Service2/values/GetById?id=123访问得到数据,此时我们随便关掉一个实例
但是通过http://localhost:5000/Service2/values/GetById?id=123刚开始可能会有几次访问不通,到Consul界面总出现上面的画面时就又可以访问到数据了。这是因为Consul设置的
为每10s进行一次健康检查,因此10s内访问的话还会去访问到其中刚关掉的某个实例,当Consul通过健康检查检测到某个服务停掉后就会剔除,接下来就会去访问正常的服务了,
所以之后访问又可正常了。