.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

摘要:
前言上一篇文章使用Consul完成了服务的注册和发现。在实践中,只有服务注册和发现通常是不够的。我们需要一个统一的入口来连接客户和服务。Ocelot官网:https://ocelot.readthedocs.io/Ocelot它正是为提供一个统一的入口点。Net微服务系统,称为网关。注意ocelot json是我们添加的ocelot的配置文件。设置生成时,请记住将其复制到输出目录。您应该知道Consul、Ocelot和其他组件可以独立存在。BaseUrl节点用于配置ocelot网关将运行的地址。

Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章。

前言

上一篇【.Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)】已经使用Consul完成了服务的注册与发现,实际中光有服务注册与发现往往是不够的,我们需要一个统一的入口来连接客户端与服务。

Ocelot

官网:https://ocelot.readthedocs.io/
Ocelot正是为.Net微服务体系提供一个统一的入口点,称为:Gateway(网关)。

  • 上手Ocelot:

首先创建一个空的asp.net core web项目。
.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)第1张
注意ocelot.json是我们添加的Ocelot的配置文件,记得设置生成时复制到输出目录。ocelot.json的文件名不是固定的,可以自己定义。

NuGet安装一下Ocelot:
.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)第2张

只需简单的修改几处默认代码:
Program.cs:

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

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureAppConfiguration((hostingContext, config) =>
                {
                    config.AddJsonFile("ocelot.json");
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }

Startup.cs:

    public class Startup
    {
        // This method gets called by the runtime. Use this method to add services to the container.
        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
        public void ConfigureServices(IServiceCollection services)
        {
            //添加ocelot服务
            services.AddOcelot();
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            //设置Ocelot中间件
            app.UseOcelot().Wait();
        }
    }

ocelot.json:

{
  "Routes": [
    {
      "DownstreamPathTemplate": "/products",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 9050
        },
        {
          "Host": "localhost",
          "Port": 9051
        },
        {
          "Host": "localhost",
          "Port": 9052
        }
      ],
      "UpstreamPathTemplate": "/products",
      "UpstreamHttpMethod": [
        "Get"
      ],
      "LoadBalancerOptions": {
        "Type": "RoundRobin" //负载均衡,轮询机制 LeastConnection/RoundRobin/NoLoadBalancer/CookieStickySessions
      }
    },
    {
      "DownstreamPathTemplate": "/orders",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 9060
        },
        {
          "Host": "localhost",
          "Port": 9061
        },
        {
          "Host": "localhost",
          "Port": 9062
        }
      ],
      "UpstreamPathTemplate": "/orders",
      "UpstreamHttpMethod": [
        "Get"
      ],
      "LoadBalancerOptions": {
        "Type": "RoundRobin" //负载均衡,轮询机制 LeastConnection/RoundRobin/NoLoadBalancer/CookieStickySessions
      }
    }
  ],
  "GlobalConfiguration": {
    "BaseUrl": "http://localhost:9070"
  }
}

我们先暂时忽略Consul,将服务实例的地址都写在配置文件中。要知道Consul、Ocelot等组件都是可以独立存在的。
配置文件中的Routes节点用来配置路由,Downstream代表下游,也就是服务实例,Upstream代表上游,也就是客户端。我们的路径比较简单,只有/products、/orders,路径中如果有不固定参数则使用{}匹配。我们这个配置的意思呢就是客户端访问网关的/orders、/products,网关会转发给服务实例的/orders、/products,注意这个上游的路径不一定要和下游一致,比如上游路径可以配置成/api/orders,/xxx都可以。
LoadBalancerOptions节点用来配置负载均衡,Ocelot内置了 LeastConnection、RoundRobin、NoLoadBalancer、CookieStickySessions 4种负载均衡策略。
BaseUrl节点就是配置我们ocelot网关将要运行的地址。

  • 运行gateway:

目前不考虑网关集群,就不放在docker里了。直接控制台执行:`dotnet Ocelot.APIGateway.dll --urls="http://*:9070"
.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)第3张

用浏览器测试一下:
.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)第4张
.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)第5张
测试正常,我们通过网关可以正常的访问到服务实例。

  • 接下来继续改造客户端代码:

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)第6张
因为改动太多就直接新建一个GatewayServiceHelper来做。
GatewayServiceHelper:

    /// <summary>
    /// 通过gateway调用服务
    /// </summary>
    public class GatewayServiceHelper : IServiceHelper
    {
        public async Task<string> GetOrder()
        {
            var Client = new RestClient("http://localhost:9070");
            var request = new RestRequest("/orders", Method.GET);

            var response = await Client.ExecuteAsync(request);
            return response.Content;
        }

        public async Task<string> GetProduct()
        {
            var Client = new RestClient("http://localhost:9070");
            var request = new RestRequest("/products", Method.GET);

            var response = await Client.ExecuteAsync(request);
            return response.Content;
        }

        public void GetServices()
        {
            throw new NotImplementedException();
        }
    }

然后在Startup中修改一下注入的类型,别的就不用改了,这就是依赖注入的好处之一。。。
Startup.ConfigureServices():

//注入IServiceHelper
//services.AddSingleton<IServiceHelper, ServiceHelper>();
            
//注入IServiceHelper
services.AddSingleton<IServiceHelper, GatewayServiceHelper>();

Startup.Configure():

//程序启动时 获取服务列表
//serviceHelper.GetServices();

运行客户端测试:
.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)第7张

好了,现在客户端对服务的调用都通过网关进行中转,客户端再也不用去关心那一堆服务实例的地址,只需要知道网关地址就可以了。另外,服务端也避免了服务地址直接暴露给客户端。这样做对客户端,服务都非常友好。

至于我们的api网关呢,又要说到服务发现的问题了。目前我们的服务地址是写在ocelot.json配置文件里的,当然这种做法在服务实例不经常变化的情况下是没有问题的,一旦服务变化,需要人为的修改配置文件,这又显得不太合理了。

当然,强大的Ocelot为我们提供了服务发现的方案。

代码放在:https://github.com/xiajingren/NetCoreMicroserviceDemo

未完待续...

免责声明:文章转载自《.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇javscript---Bom 和DomIE6浏览器常见的bug及其修复方法下篇

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

相关文章

linux上kafka搭建小结

1、安装java yum -y list java 可以查看java的版本,然后选1.8的64位那个安装 yum install java_1.8.0_openjdk.x86_64 或者从网站下载安装 tar -zxvf jre-8u271-linux-x64.tar.gzmkdir /usr/lib/jvmmv jre-8u271-linux-x64 /...

第四节:Webpack本地服务器搭建、剖析devServer的HRM热替换和其它配置、resolve模块解析、区分开发/生产环境方案实战

一. webpack本地服务器搭建 1. 为什么要搭建本地服务器?  我们之前通过【npm run build】,编译相关的代码; 然后需要在浏览器中运行,每次修改修改代码,都需要重新编译运行,很麻烦。我们希望可以做到,当文件发生变化时,可以自动的完成 编译 和 展示 。 2. watch mode模式 (1). 简介   在该模式下,webpack依赖图...

mysql 导出表结构和表数据 mysqldump用法

命令行下具体用法如下: mysqldump -u用戶名 -p密码-d数据库名表名 > 脚本名; 导出整个数据库结构和数据mysqldump -h localhost -uroot -p123456database > dump.sql 导出单个数据表结构和数据mysqldump -h localhost -uroot -p123456 data...

浏览器的F5和Ctrl+F5

在浏览器里中,按F5键和按F5同时按住Ctrl键(简称Ctrl+F5),效果是不同,到底两者有什么区别呢? 假如我第一次访问过http://localhost/home,这个网页是个动态网页,每次访问都会去访问Server,但是它包含一个一个静态资源http://localhost/content/bootstrap.css,浏览器在显示这个网页之前需要发...

解决mysql中只能通过localhost访问不能通过ip访问的问题

Mysql 默认是没有开启这个权限的(只允许使用 host:localhost,或者 host:127.0.0.1),如果想用 host:192.168.1.* ,来访问mysql ,需要手动开启这个权限进入Mysql终端输入这个命令 1.打开cmd窗口,进入MySql安装的bin目录 2.执行命令登录数据库,之后会出现一行要你输入密码的 mysql -...

【Vue+Node】解决axois请求数据跨域问题

项目基于Vue前端+Node后台,启动两个服务,请求数据时,端口不一致造成跨域报错: (No 'Access-Control-Allow-Origin' header is present on the requested resource) 经过查官方API得到以下两种思路: 1、在Node后台中设置,允许访问    1.1、用代码控制 app.all...