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服务的接口
posted @ 2022-05-18 13:59  游园惊梦、  阅读(135)  评论(0编辑  收藏  举报