Ocelot和Consul 实现网关API 服务注册 负载均衡

摘要:
服务注册只能通过手动将其添加到配置文件来完成。}//方法生存期。应用程序已启动。注册(OnStart)以注册项目启动//方法生存期。应用程序已启动。注册(OnStopped)以注册项目关闭;

Ocelot是一个用.NET Core实现并且开源的API网关,它功能强大,包括了:路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、Butterfly Tracing集成。这些功能只都只需要简单的配置即可完成

Consul 服务发现

在Ocelot已经支持简单的负载功能,也就是当下游服务存在多个结点的时候,Ocelot能够承担起负载均衡的作用。但是它不提供健康检查,服务的注册也只能通过手动在配置文件里面添加完成。这不够灵活并且在一定程度下会有风险。这个时候我们就可以用Consul来做服务发现,它能与Ocelot完美结合。

Ocelot和Consul 实现网关API 服务注册 负载均衡第1张

Consul是什么

Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。

安装Consul:windos环境

https://www.consul.io/downloads.html 下载文件

放到D盘下

Ocelot和Consul 实现网关API 服务注册 负载均衡第2张

 打开powershell 执行 命令启动一个Agent的开发模式:

Ocelot和Consul 实现网关API 服务注册 负载均衡第3张

 启动完成:打开localhost:8500  默认端口8500 就可以看到一个可视化consul界面了,可以看到默认启动了一个consul 服务

Ocelot和Consul 实现网关API 服务注册 负载均衡第4张

下面,使用netcore通过Ocelot搭建API网关   服务注册   负载均衡

新建一个api1:nuget 添加一个consul 依赖

 startup 添加代码

 public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime lifetime)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }


            //注册项目启动的方法
            lifetime.ApplicationStarted.Register(OnStart);
            //注册项目关闭的方法
            lifetime.ApplicationStarted.Register(OnStopped);

            app.UseMvc();
        }

        //关闭的时候在consul中移除
        private void OnStopped()
        {
            var client = new ConsulClient();
            //根据ID在consul中移除当前服务
            client.Agent.ServiceDeregister("servicename:93");
        }
        private void OnStart()
        {
            var client = new ConsulClient();
            //健康检查
            var httpCheck = new AgentServiceCheck()
            {
                //服务出错一分钟后 会自动移除
                DeregisterCriticalServiceAfter = TimeSpan.FromMinutes(1),
                //每10秒发送一次请求到 下面的这个地址 这个地址就是当前API资源的地址
                Interval = TimeSpan.FromSeconds(10),
                HTTP = $"http://localhost:93/HealthCheck"
            };

            var agentReg = new AgentServiceRegistration()
            {
                //这台资源服务的唯一ID
                ID = "servicename:93",
                Check = httpCheck,
                Address = "localhsot",
                Name = "servicename",
                Port = 93
            };
            client.Agent.ServiceRegister(agentReg).ConfigureAwait(false);
        }

  添加一个健康检查接口

 [Route("HealthCheck")]
    [ApiController]
    public class HealthCheckController : ControllerBase
    {
        // GET: api/HealthCheck
        [HttpGet]
        [HttpHead]
        public IActionResult Ping()
        {
            return Ok();
        }

    }

  修改ValuesController

 [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        // GET api/values
        [HttpGet]
        public string Get()
        {
            return "这是1资源服务器API";
        }
    }

然后 copy 一份api1 为api2,,我们启用端口为92 ,细节........

添加项目  Api.Gateway(Ocelot网关服务器) 添加Ocelot包   添加Ocelot.Json配置  Ocelot服务器端口为91

Ocelot,Json

{
  "ReRoutes": [
    {
      //暴露出去的地址
      "UpstreamPathTemplate": "/api/{controller}",
      "UpstreamHttpMethod": [ "Get" ],

      //转发到下面这个地址
      "DownstreamPathTemplate": "/api/{controller}",
      "DownstreamScheme": "http",
      //资源服务器列表
      "DownstreamHostAndPorts": [
        {
          "host": "localhost",
          "port": 92
        },
        {
          "host": "localhost",
          "port": 93
        }
      ],
      //决定负载均衡的算法
      "LoadBalancerOptions": {
        "Type": "LeastConnection"
      },
      "UseServiceDiscovery": true
    }
  ],
  //对外暴露的访问地址  也就是Ocelot所在的服务器地址
  "GlobalConfiguration": {
    "BaseUrl": "http://localhost:91"
  }
}

  Startup 修改

      public void ConfigureServices(IServiceCollection services)
        {


            services.AddOcelot();
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseOcelot().Wait();
            app.UseMvc();
        }

  Program 修改

 public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                      .ConfigureAppConfiguration((hostingContext, builder) =>
                      {
                          builder
                          .SetBasePath(hostingContext.HostingEnvironment.ContentRootPath)
                          .AddJsonFile("Ocelot.json");
                      })
              .UseUrls("http://+:91")
              .UseStartup<Startup>();
    }

  

启动 api3 和api2

Ocelot和Consul 实现网关API 服务注册 负载均衡第5张

再启动Api.Gateway

执行 http://localhost:91/api/values

Ocelot和Consul 实现网关API 服务注册 负载均衡第6张

 再执行

Ocelot和Consul 实现网关API 服务注册 负载均衡第7张

 我们这里负载均衡算法是:LeastConnection

当然还可以选择其他的:

  • RoundRobin - 轮询,挨着来
  • LeastConnection - 最小连接数,谁的任务最少谁来
  • NoLoadBalance - 不要负载均衡

如果api1 我们关掉 ,那么就只会请求到api2 ,api1的服务自动断开

免责声明:文章转载自《Ocelot和Consul 实现网关API 服务注册 负载均衡》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C获取系统中CPU核数【改进】用Log4net建立日志记录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL常用操作笔记[转]

一、用户创建、权限、删除1、连接MySql操作连接:mysql -h 主机地址 -u 用户名 -p 用户密码 (注:u与root可以不用加空格,其它也一样)断开:exit (回车)终端输入mysql -h 127.0.0.1 -u root -p 然后输入密码。就可以连接到本地的MySql数据库了。 2、 创建用户:命令: CREATE USER 'us...

iOS UI-线程(NSThread)及其安全隐患与通信

一、基本使用 1.多线程的优缺点 多线程的优点 能适当提高程序的执行效率 能适当提高资源利用率(CPU、内存利用率) 多线程的缺点 开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能 线程越多,CPU在调度线程上的开销就越大 程序设计更加复杂:比如线程之间的通信、多线...

JS最新技术ES6,结合Vue全局注册,实现Axios封装配置插件!

接下来,带来js全新技术ES6,结合Vue install全局组件实现Axios封装,以代码形式讲解。 1、请求封装 //file:src/api/http/http.js import axios from 'axios' axios.create(); axios.interceptors.request.use((config)=>{ //...

Java解析word,获取文档中图片位置

前言(背景介绍): Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word、excel、ppt格式的文档。 其中对word文档的处理有两个技术,分别是HWPF(.doc)和XWPF(.docx)。如果你对这两个技术熟悉的话,就应该能明白使用java解析word文档的痛楚所在。 其中两个最大的问题在于...

WordPress版微信小程序开发系列(一):WordPress REST API

自动我发布开源程序WordPress版微信小程序以来,很多WordPress站长在搭建微信小程序的过程中会碰到各种问题来咨询我,有些问题其实很简单,只要仔细看看我写的文章,就可以自己解决。不过这些文章里无法涵盖所有的技术点,因为涉及Wordpress和微信小程序两套程序系统,有些技术点对于小白用户来说确实有些难度,因此我考虑写一个系列文章介绍WordPre...

NetCore项目发布对前端项目进行打包合并发布

在某个小项目中, api使用asp.net core 3.x 编写, UI页面则使用Vuejs. 正常情况下, 项目右键的发布只会发布api项目,而不会管Vuejs的项目. 所以通过简单的改造,在发布该项目时不光发布api本身, 同时也编译和发布Vuejs写的页面. 这样子就可以2个项目一起部署了. 当然我们也可以通过CI/CD来解决问题. 项目结构: *...