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 @   游园惊梦、  阅读(135)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示