使用Ocelot构建GateWay

添加Nuget包:Ocelot

添加配置文件Ocelot.json 具体配置可以看另一篇 Ocelot配置

Json配置文件主要包含两个根节点:

ReRoutes:路由重定向配置 都是数组结构 可以配置多个

GlobalConfigrations:全局配置

ReRoutes 主要包含了上下游的路径、方式、限流、负载等设置

我们先配置一个最简单的设置:

这里我做了一个负载,把api部署了2份做了一个简单的分布式,当我访问test的时候会被转发到 9381或者 9384上

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/values/getuser",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 20001
        },
        {
          "Host": "localhost",
          "Port": 20002
        }
      ],
      "UpstreamPathTemplate": "/test",
      "UpstreamHttpMethod": [ "Get" ],
      "LoadBalancer": "LeastConnection",
      "ServiceName": "userservices",
      "UseServiceDiscovery": true
    }
  ],

  "GlobalConfiguration": {
  "BaseUrl": "http://localhost:20000",
    "ServiceDiscoveryProvider": {
      "Host": "localhost",
      "Port": 8500

    }

  }
}

这里我结合了Consul来实现,关于Consul的使用可以看官方文档:

需要下载consul.exe程序并将其启动起来 这是一个服务发现健康检查的组件 如果没有添加系统path设置就直接进入consul.exe目录启动起来

httpServer的默认地址是8500,访问下会进入consul的ui

 访问 :http://localhost:20000/test

访问:http://localhost:20001/api/values/getuser

得到一样的结果,这里已经被转发了,因为我们配置负载均衡及健康监测

从而保证了在服务器宕机后或者在高QPS下的正常访问

 在APIGateWay网关里添加对Ocelot的设置

 public static IWebHost BuildWebHost(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, builder) =>
            {
                builder
                .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                .AddJsonFile("Ocelot.json");
            })
                .UseStartup<Startup>()
            .UseUrls("http://localhost:20000")
                .Build();

添加相关服务注册及configure

 services.AddOcelot();

 app.UseOcelot().Wait();

网关配置好后,需要对业务接口服务实现健康检查,设置好先关的参数处理consul的频率

DeregisterCriticalServiceAfter 失败多久后注销服务的
Interval 检查发送的评率
HTTP 检查的地址
 
 applicationLifetime.ApplicationStarted.Register(() =>
            {

                //自动获取当前接口服务地址

                var features = app.Properties["server.Features"] as FeatureCollection;
                var addessess = features.Get<IServerAddressesFeature>().Addresses.Select(url => new Uri(url));

                foreach (var address in addessess)
                {
                  
                    var httpcheck = new AgentServiceCheck()
                    {
                        DeregisterCriticalServiceAfter = TimeSpan.FromMinutes(userappsetting.Value.DeregisterCriticalServiceAfter),
                        Interval = TimeSpan.FromSeconds(userappsetting.Value.Interval),
                        HTTP = new Uri(address, "/api/Check").OriginalString,
                       

                    };
                    //这里可以注入配置
                    var agentReg = new AgentServiceRegistration()
                    {
                        ID = $"{userappsetting.Value.ServiceName}_{address.Host}_{address.Port}",
                        Check = httpcheck,
                        Name = userappsetting.Value.ServiceName,
                        Address = address.Host,
                        Port = address.Port
                      
                    };
                    client.Agent.ServiceRegister(agentReg).ConfigureAwait(false);
                }


            });
            applicationLifetime.ApplicationStopped.Register(() =>
            {
                var features = app.Properties["server.Features"] as FeatureCollection;
                var addessess = features.Get<IServerAddressesFeature>().Addresses.Select(url => new Uri(url));
                foreach (var address in addessess)
                {
                    client.Agent.ServiceDeregister($"{userappsetting.Value.ServiceName}_{address.Host}_{address.Port}").GetAwaiter().GetResult();
                }
            });

猜你喜欢

转载自www.cnblogs.com/liyouming/p/9020556.html