.net ocelot网关入门操作

记录微服务的搭建过程

介绍

Ocelot是一个用.NET Core实现且开源的网关,只需要配置配置就能完成路由、请求聚合、服务发现、认证、鉴权、限流熔断、并内置了负载均衡器与Service Fabric、Butterfly Tracing集成等功能。下面我会对这些功能的配置和说明。

ocelot的安装

.net ocelot网关入门操作
选择第一个根据自己的vs选择不同的版本

ocelot的搭建过程

配置startup
using一下命名空间
using Ocelot.DependencyInjection;
using Ocelot.Middleware;
.net ocelot网关入门操作
新建一个配置文件
当然你也可以把配置信息写在appsettings.json里面
.net ocelot网关入门操作
配置完后需要在program进行注册
.net ocelot网关入门操作
额外补一点配置文件的优先级
自定义配置文件>命令行>环境(launchSettings)>appsettings>UseSetting

ocelot配置文件介绍

 {
  "ReRoutes": [
  ],//路由配置
  "GlobalConfiguration": {} //全局配置
}

路由ReRoutes基本配置
假设我的网关地址是 www.wangguan.vip/post/test/get?id=3
他会转发到路由 http://127.0.0.1:5005/api/test/get?id=3
或者是http://127.0.0.1:5006/api/test/get?id=3

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/{postId}", //下游(指访问服务的接口)
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "127.0.0.1",
          "Port": 5005
        },
        {
          "Host": "127.0.0.1",
          "Port": 5006
        }
      ],
       "LoadBalancer": "LeastConnection ", //负载均衡策略
      "UpstreamPathTemplate": "/post/{postId}", //上游也就是用户输入的请求Url模板
      "UpstreamHttpMethod": [ "Get" ], //上游请求http方法,可使用数
      "Priority":1,//优先级
    }
  ],
  "GlobalConfiguration": {}
}
  • DownstreamPathTemplate 下游模板
  • DownstreamScheme 请求的scheme(http或者https)
  • DownstreamHostAndPorts 比如你一个用户注册你部署了集群 这个时候就可以配置host和Port来访问,
  • LoadBalancer 负载均衡策略
  • UpstreamPathTemplate 上游模板
  • UpstreamHttpMethod 上游请求方式
  • Priority 优先级

优先级

{
"ReRoutes": [
    {
      "UpstreamPathTemplate": "/post/{postId}", 
      "Priority":0,//优先级
    }
    {
      "UpstreamPathTemplate": "/post/test/get", 
      "Priority":1,//优先级
    }
  ],
}

如果路由模板出现了冲突 优先级越大的会先被匹配
负载均衡策略(本次会使用consul做服务注册与发现)
DownstreamHostAndPorts存在多个hostandports 则可以分配一下匹配策略

  • LeastConnection – 将请求发往最空闲的那个服务器
  • RoundRobin – 轮流发送
  • NoLoadBalance – 总是发往第一个请求或者是服务发现

请求聚合
就是把多个响应的结果一次性返回给客户端

{
  "ReRoutes": [
   
    {
      "DownstreamPathTemplate": "/api/test/GetUserInfo",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "127.0.0.1",
          "Port": 5005
        }
      ],

      "UpstreamPathTemplate": "/GetUserInfo", //上游也就是用户输入的请求Url模板
      "UpstreamHttpMethod": [ "Get" ], //游请求http方法,可使用数
      "Key": "GetUserInfo"
    },
    {
      "DownstreamPathTemplate": "/api/test/GetUserIntegral",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "127.0.0.1",
          "Port": 5006
        }
      ],

      "UpstreamPathTemplate": "/GetUserIntegral", //上游也就是用户输入的请求Url模板
      "UpstreamHttpMethod": [ "Get" ], //游请求http方法,可使用数
      "Key": "GetUserIntegral"
    }
  ],
    "Aggregates": [
    {
      "ReRouteKeys": [
        "GetUserInfo",
        "GetUserIntegral"
      ],
      "UpstreamPathTemplate": "/GetUserInfoAndIntegral" //上游模板
    }
  ],
  "GlobalConfiguration": {}

在路由中需要用Key来标记且在Aggregates添加一个匹配模板
这边我将演示客户端获取用户信息和用户积分
单独请求获取用户信息接口和用户接口接口
.net ocelot网关入门操作
.net ocelot网关入门操作
使用请求集合得到的接口
.net ocelot网关入门操作
显然 把2个接口的数据合并到一个请求返回
注意

  • 聚合返回的是json数据
  • 如果其中一个服务挂掉了 则会返回502
  • 下游只支持get请求
  • 下游的response header并会被丢弃

限流
限制某个接口访问的频率,来减少服务器的压力,或者并行带来的数据错乱

{
  "ReRoutes": [
    {
      "DownstreamPathTemplate": "/api/{postId}",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "127.0.0.1",
          "Port": 5005
        }

      ],
      "RateLimitOptions": {
        "ClientWhitelist": [],
        "EnableRateLimiting": true,
        "Period": "5m",
        "PeriodTimespan": 100,
        "Limit": 1
      },
      "UpstreamPathTemplate": "/post/{postId}", //上游也就是用户输入的请求Url模板
      "UpstreamHttpMethod": [ "Get" ] //游请求http方法,可使用数
    }
 
  ],
  "GlobalConfiguration": {
   
  }
}

  • ClientWihteList 白名单
  • EnableRateLimiting 是否启用限流
  • Period 时间区间:1s, 5m,1h, 1d
  • PeroidTimeSpan 多少秒之后客户端可以重试
  • Limit 在时间段内允许的最大请求数量
    熔断
    熔断的意思是停止将请求转发到下游服务。当下游服务已经出现故障了,没必要再去请求了,并且增加下游服务器和API网关的负担。这个功能是用的Pollly来实现的,我们只需要为路由做一些简单配置即可
  "QoSOptions": {
      "ExceptionsAllowedBeforeBreaking": 5,
      "DurationOfBreak": 5,
      "TimeoutValue": 5000
    }
  • ExceptionsAllowedBeforeBreaking 允许多少个异常请求
  • DurationOfBreak 熔断的时间,单位为秒
  • TimeoutValue 如果下游请求的处理时间超过多少则自如将请求设置为超时
    鉴权(结合IdentityServer4.X)
上一篇:NetCore基于Consul+Ocelot+Docker+Jenkin搭建微服务架构


下一篇:.Net Core微服务入门全纪录(五)——Ocelot-API网关(下)