NetCore+Consul服务注册+Ocelot网关配置
Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。
Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,除了路由、请求聚合、负载均衡等功能外,还可以集成Consul做服务发现,集成Polly做服务治理等; 相关功能只需简单的配置即可实现。
1:Consul
官网下载Consul,然后启动
consul agent -dev
2:新建一个webapi项目,nuget引入consul。
新建一个类,ConsulRegister用于服务注册。
public static class RegisterHelper { public static void RegisterClient(this IConfiguration configuration, IHostApplicationLifetime lifetime) { ConsulClient client = new ConsulClient(c => { c.Address = new Uri("http://127.0.0.1:8500"); c.Datacenter = "fanlin"; }); string ip = configuration["ip"]; int port = Convert.ToInt32(configuration["port"]); string serviceName = configuration["ServiceName"]; var registerion = new AgentServiceRegistration() { Address = ip, Port = port, ID = "fanlin:" + Guid.NewGuid().ToString(), Name = serviceName }; //生命周期 //注册 lifetime.ApplicationStarted.Register(() => { client.Agent.ServiceRegister(registerion).Wait(); Console.WriteLine("注册" + registerion.Address + ":" + registerion.Port); }); //注销 lifetime.ApplicationStopping.Register(() => { client.Agent.ServiceDeregister(registerion.ID).Wait();//服务停止时取消注册 Console.WriteLine("注销" + registerion.Address + ":" + registerion.Port); }); //注销 lifetime.ApplicationStopped.Register(() => { client.Agent.ServiceDeregister(registerion.ID).Wait();//服务停止时取消注册 Console.WriteLine("注销" + registerion.Address + ":" + registerion.Port); }); } }
然后在startup里面Configure方法引用
Configuration.RegisterClient(lifetime);
3:到项目的文件夹下,通过cmd方式启动,指定端口和ip以及服务名称
dotnet ConsulRegister.dll --urls="http://*:8111" --ip =127.0.0.1 --port=8111 --ServiceName=A dotnet ConsulRegister.dll --urls="http://*:8112" --ip =127.0.0.1 --port=8112 --ServiceName=B
4:访问localhost:8500可以发现有两个我们的节点
5:ocelot
新建一个项目,nuget引入ocelot和Ocelot.Provider.Consul。然后新建一个ocelot.json,内容如下
{ "ReRoutes": [ //配置路由信息 { "UseServiceDiscovery": true, "DownstreamPathTemplate": "/{url}", //指定了下游的url及使用的通信协议,{url}是通配的意思 "DownstreamScheme": "http", //下游服务http schema "ServiceName": "A", //服务名 "LoadBalancerOptions": { "Type": "LeastConnection" }, "UpstreamPathTemplate": "/ServiceA/{url}", //上游也就是用户输入的请求Url模板 "UpstreamHttpMethod": [ "Get" ] //上游请求http方法,可使用数组 }, { "UseServiceDiscovery": true, "DownstreamPathTemplate": "/{url}", //指定了下游的url及使用的通信协议,{url}是通配的意思 "DownstreamScheme": "http", "ServiceName": "B", "LoadBalancerOptions": { "Type": "LeastConnection" }, "UpstreamPathTemplate": "/ServiceB/{url}", "UpstreamHttpMethod": [ "Get" ] } ], //网关配置 "GlobalConfiguration": { "BaseUrl": "https://localhost:44355/", //网关地址 "ServiceDiscoveryProvider": { "Host": "localhost", //请求域名 "Port": 8500, //端口 "Type": "Consul" //类型 } } }
然后启动。这时候我们
https://localhost:44355/ServiceB/api/Health/HealthCheck 就会访问到B服务的接口