关于Consul的使用,查看 Consul服务注册与发现
一、实现手动配置Consul中的服务发现
Program.cs中的代码,其中使用Consul服务发现,需要添加对Ocelot.Provider.Consul的支持,在Nuget上可找到Ocelot.Provider.Consul包
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
using Ocelot.Provider.Consul;
using System.IO;
namespace OcelotTest
{
public class Program
{
public static void Main(string[] args)
{
new WebHostBuilder()
.UseUrls("http://*:99")
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.ConfigureAppConfiguration((hostingContext, config) =>
{
config
.SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
.AddJsonFile("appsettings.json", true, true)
.AddJsonFile($"appsettings.{hostingContext.HostingEnvironment.EnvironmentName}.json", true, true)
.AddJsonFile("ocelot.json", false,true)//引入ocelot配置文件
.AddEnvironmentVariables();
})
.ConfigureServices(s =>
{
s.AddOcelot() //注册对ocelot的支持
.AddConsul();//注册对Consul的支持
})
.ConfigureLogging((hostingContext, logging) =>
{
//add your logging
})
.UseIISIntegration()
.Configure(app =>
{
//配置使用Ocelot
app.UseOcelot().Wait();
})
.Build()
.Run();
}
}
}
ocelot.json中的代码,负载均衡支持3种算法 LeastConnection(最小连接数),RoundRobin(轮询),CookieStickySessions(基于会话的负载,可以理解为,基于同一会话的请求,会被分发到同一台服务器上),以下代码中,使用了RoundRobin 轮询进行负载。
{
"ReRoutes": [
{
"DownstreamPathTemplate": "/api/{url}",
"UpstreamPathTemplate": "/api/{url}",
"ServiceName": "s1"
}
],
"GlobalConfiguration": {
"BaseUrl": null,
"ServiceDiscoveryProvider": {
"Host": "10.1.1.29",
"Port": 8500,
"Type": "Consul"
},
"UseServiceDiscovery": false,
"DownstreamScheme": "http",
"UpstreamHttpMethod": [ "Get", "Post" ],
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
}
}
以下Consul中的信息截图,注册了一个服务,服务名称s1
打开浏览器,输入网址,接着刷新几次,可以看到输出不同的端口
二、以上是手动配置Consul中的服务发现的结果,接下来配置自动服务发现
ocelot.json配置看起来像这样,其中ReRoutes为空,在手动配置服务与自动服务发现中,2个配置不能共存,所以ReRoutes要设置为空数组或者不设置些参数。
{
"ReRoutes": [],
"GlobalConfiguration": {
"BaseUrl": null,
"ServiceDiscoveryProvider": {
"Host": "10.1.1.29",
"Port": 8500,
"Type": "Consul"
},
"UseServiceDiscovery": false,
"DownstreamScheme": "http",
"UpstreamHttpMethod": [ "Get", "Post" ],
"LoadBalancerOptions": {
"Type": "RoundRobin"
}
}
}
在s1服务的基础上,复制并注册了一个s2服务,看下图
访问动态路由服务时,需要加服务名称前缀,如/s1/api/health,s1即服务名称,访问s2的路径则是/s2/api/health,下图是s1,s2的访问结果