.Net Core配置Consul+Ocelot

发布时间 2023-11-09 09:43:44作者: 开始狩猎---卧山虎

时代在变,技术也在更新迭代。从传统的单体应用架构到现在的分布式集群架构,在技术的学习上真的是一点都不能松懈。

网上关于微服务与Consul的话题太多了,我在这里不做过多描述。

其实就是在微服务中我们可以利用Consul可以实现服务的发现、治理、健康检查等...

IMG_256

用它先下载它:

https://www.consul.io/downloads.html

我此番在windows下操作,打开下载的Consul所在文件夹,输入 consul agent -dev -client 0.0.0.0 -ui

Consul的默认启动端口为8500,如果能正常显示页面则启动成功。

然后在API中创建一个文件夹文件夹中存放ConsulRegist类其中写一个IConfiguration的拓展代码:
public static class ConsoleRegist

{

public static void ConsulExtend(this IConfiguration configuration)

{

ConsulClient client = new ConsulClient(m =>

{

m.Address = new Uri("http://10.31.60.8/");//Consul的Ip地址

m.Datacenter = "dc1";

});

//启动的时候在consul中注册实例服务

//在consul中注册的ip,port

string ip = configuration["ip"];

int port = int.Parse(configuration["port"]);

int weight = string.IsNullOrWhiteSpace(configuration["weight"]) ? 1 : int.Parse(configuration["weight"]);

client.Agent.ServiceRegister(new AgentServiceRegistration()

{

ID = "service" + Guid.NewGuid(),//唯一的

Name = "MicroserviceAttempt",//组(服务)名称

Address = ip,

Port = port,//不同的端口=>不同的实例

Tags = new string[] { weight.ToString() },//标签

Check = new AgentServiceCheck()//服务健康检查

{

Interval = TimeSpan.FromSeconds(12),//间隔12s一次 检查

HTTP = $"http://{ip}:{port}/Api/Health/Index",

Timeout = TimeSpan.FromSeconds(5),//检测等待时间

DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(20)//失败后多久移除

}

});

Console.WriteLine($"{ip}:{port}--weight:{weight}");

}

}

在program.cs中注入:builder.Configuration.ConsulExtend();

将api项目启动

dotnet ServicesInstances.dll --urls="http://*:5726" --ip="你的IP地址" --port=5726

启动完毕后我们可以看到:

也可以在Consul中看到:

这样Console就配置好了接下来我们要配置Ocelot网关
1、Consul整合GeteWay.引入NuGet包:Ocelot、Ocelot.Provider.Consul注意版本是否适用!!!!

2、添加一个JSON文件名叫configurationJson其中信息如下:
{ //*************************单地址多实例负载均衡+Consul*****************************

"Routes": [

{

//GeteWay转发=>Downstream

"DownstreamPathTemplate": "/api/{url}", //服务地址--url变量

"DownstreamScheme": "http",

//http://localhost:6299/T5/User/GetCustomerUser

"UpstreamPathTemplate": "/T5/{url}", //网关地址--url变量 冲突的还可以加权重Priority

"UpstreamHttpMethod": [ "Get", "Post" ],

"UseServiceDiscovery": true, //使用服务发现

"ServiceName": "MicroserviceAttempt", //Consul服务名称

"LoadBalancerOptions": {

"Type": "RoundRobin" //轮询 //"LeastConnection":最少连接数服务器 "NoloadBalance":不负载均衡 "CookieStickySession":会话粘滞

}

}

],

"GlobalConfiguration": {

"BaseUrl": "http://127.0.0.1:6299",//

"ServiceDiscoveryProvider": {

"Host": "10.31.60.8",//Consul所在的IP地址

"Port": 8500,

"Type": "Consul" //由Consul提供服务发现,每次请求去Consul

}

//"ServiceDiscoveryProvider": {

// "Host": "localhost",

// "Port": 8500,

// "Type": "PollConsul", //由Consul提供服务发现,每次请求去Consul

// "PollingInterval": 1000//轮询Consul,评率毫秒--down是不知道的

//}

}

//*************************单地址多实例负载均衡+Consul*****************************

}

最后我们请看效果: