• Ocelot


    Api Gateway

    Ocelot 作为.NET Core平台下一款开源的API 网关开发库越来越得到社区的认可。

    APi网关选型

    什么是API网关

    API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。

    API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和管理服务。

    API 网关是客户端访问服务的统一入口,API 网关封装了后端服务,还提供了一些更高级的功能,例如:身份验证、监控、负载均衡、缓存、多协议支持、限流、熔断等等。

    网关(API Gateway)的设计要素

    • 限流:实现微服务访问流量计算,基于流量计算分析进行限流,可以定义多种限流规则。
    • 缓存:数据缓存。
    • 日志:日志记录。
    • 监控:记录请求响应数据,api耗时分析,性能监控。
    • 鉴权:权限身份认证。
    • 灰度:线上灰度部署,可以减小风险。
    • 路由:路由是API网关很核心的模块功能,此模块实现根据请求,锁定目标微服务并将请求进行转发。

    API 网关的优缺点

    API 网关的好处是显而易见的,封装了应用程序的内部结构,为不同客户端提供不同粒度的 API,同时网关自身也提供了一些高级功能,也减少了客户端与应用程序之间的往返次数,使客户端代码更优雅。

    同时使用网关也存在一些缺点,增加了一个新的组件,增加了整个应用架构的复杂度,一个通俗的道理,你做的越多你犯错的风险也越高,网关不可用很可能导致整个应用架构崩溃,当然现在有各种各样的方案,能防止网关崩溃,它也可能存在瓶颈风险。

    Kong

    Kong是一个在 Nginx 中运行的Lua应用程序,并且可以通过lua-nginx模块实现,Kong不是用这个模块编译Nginx,而是与 OpenResty 一起发布,OpenResty已经包含了 lua-nginx-module, OpenResty 不是 Nginx 的分支,而是一组扩展其功能的模块。

    它的核心是实现数据库抽象,路由和插件管理,插件可以存在于单独的代码库中,并且可以在几行代码中注入到请求生命周期的任何位置。

    Traefik

    Traefik 是一个现代 HTTP 反向代理和负载均衡器,可以轻松部署微服务,Traeffik 可以与您现有的组件(Docker、Swarm,Kubernetes,Marathon,Consul,Etcd,…)集成,并自动动态配置。

    Ambassador

    Ambassador 是一个开源的微服务 API 网关,建立在 Envoy 代理之上,为用户的多个团队快速发布,监控和更新提供支持,支持处理 Kubernetes ingress controller 和负载均衡等功能,可以与 Istio 无缝集成。

    Tyk

    Tyk是一个开源的、轻量级的、快速可伸缩的 API 网关,支持配额和速度限制,支持认证和数据分析,支持多用户多组织,提供全 RESTful API。基于 go 编写。

    Zuul

    Zuul 是一种提供动态路由、监视、弹性、安全性等功能的边缘服务。Zuul 是 Netflix 出品的一个基于 JVM 路由和服务端的负载均衡器。

    Ocelot

    Ocelot 作为.NET Core平台下一款开源的API 网关开发库越来越得到社区的认可。

    Ocelot简易教程

    Ocelot简易教程

    Ocelot简易教程(一)之Ocelot是什么

    Ocelot简易教程(二)之快速开始1

    Ocelot简易教程(二)之快速开始2

    Ocelot简易教程(三)之主要特性及路由详解

    Ocelot简易教程(四)之请求聚合以及服务发现

    Ocelot简易教程(五)之集成IdentityServer认证以及授权

    Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

    Ocelot简易教程(七)之配置文件数据库存储插件源码解析

    Ocelot其他简介

    Ocelot.json配置:

    {
        "GlobalConfiguration": {
    
        },
        "Routes": [{
            "DownstreamPathTemplate": "/api/{everything}",
            "DownstreamScheme": "http",
            "DownstreamHostAndPorts": [{
                "Host": "localhost",
                "Port": 1001
            },
            {
                "Host": "localhost",
                "Port": 1002
            }
          ],
          "UpstreamPathTemplate": "/{everything}",
          "UpstreamHttpMethod": [ "Get", "Post" ],
          "LoadBalancerOptions": {
              "Type": "RoundRobin"
          }
        }
      ]
    }
    

    Ocelot特性介绍

    合并配置文件

    Ocelot会寻找所有匹配了 (?i)ocelot.([a-zA-Z0-9]*).json 的文件,然后合并他们。如何你要设置GlobalConfiguration 属性,那么你需要建立一个ocelot.global.json 的文件来进行全局的配置。

    在consul中存储配置

    这里你首先要做的就是安装Ocelot中提供的Consul的NuGet包,Nuget安装方式:

    Install-Package Ocelot.Provider.Consul
    

    然后在注册服务时添加如下内容:Ocelot将会尝试在Consul KV存储并加载配置。

    services
       .AddOcelot()
       .AddConsul()
       .AddConfigStoredInConsul();
    

    当然你还得把下面的配置添加到你的ocelot.json文件中。这里定义Ocelot如何查找Consul根并从Consul中加载并存储配置。如果你使用Consul进行配置,你可能需要配置Key以便区分多个配置,为了指定Key,你需要在json配置文件中的ServiceDiscoveryProvider部分设置ConfigurationKey属性:

    "GlobalConfiguration": {
        "ServiceDiscoveryProvider": {
            "Host": "localhost",
            "Port": 9500,
            "ConfigurationKey": "Oceolot_A"
        }
    }
    

    请求聚合

    在ocelot.all.json中加入聚合配置,如下所示:

    "Aggregates": [{
        "ReRouteKeys": [
        "Good",
        "Order"
        ],
        "UpstreamPathTemplate": "/GetOrderDetail/{id}"
    }]
    

    注意 :这里Aggregates跟ReRoutes同级,ReRouteKeys中填写的数组就是上面步骤3中设置的Key属性对应的值。
    注意的是聚合请求不会返回404请求。如果两个下游都返回404状态码的话,这里聚合后的响应也不会返回404,只会返回空的json串,拿上面的实例,如果两个下游都返回404的话,那么他的响应代码类似下面这样:

    {
        "Good": ,
        "Order":
    }
    

    服务发现

    Ocelot允许您指定服务发现提供程序,并将使用它来查找Ocelot将请求转发到的下游服务的主机和端口。目前,这仅在GlobalConfiguration部分中受支持,这意味着相同的服务发现提供程序将用于为ReRoute级别指定ServiceName的所有ReRoutes。

    在使用Consul前你首先要做的就是安装在Ocelot中提供Consul支持的NuGet包
    Install-Package Ocelot.Provider.Consul
    然后将下面的内容添加在ConfigureServices方法中

    services.AddOcelot()//注入Ocelot服务
            .AddConsul();
    

    GlobalConfiguration中需要加入以下内容。如果您未指定主机和端口,则将使用Consul默认值。

    "ServiceDiscoveryProvider": {
        "Host": "localhost",
        "Port": 8500,
        "Type": "Consul"
    }
    

    合并后配置信息为Ocelot.json:

    "ServiceDiscoveryProvider": {
      "Host": "localhost",
      "Port": 8500,
      "Type": "Consul",
      "Token": null,
      "ConfigurationKey": null,
      "PollingInterval": 0
    }
    

    为了告诉Ocelot ReRoute是为其主机和端口使用服务发现提供程序,您必须在下游请求时添加要使用的ServiceName和负载均衡器。目前,Ocelot可以使用RoundRobin和LeastConnection算法。如果未指定负载均衡器,则Ocelot将不会对请求进行负载均衡。

    {
        "DownstreamPathTemplate": "/api/posts/{postId}",
        "DownstreamScheme": "https",
        "UpstreamPathTemplate": "/posts/{postId}",
        "UpstreamHttpMethod": [ "Put" ],
        "ServiceName": "product",
        "LoadBalancerOptions": {
            "Type": "LeastConnection"
        },
    }
    

    动态路由

    作者的想法是在使用服务发现提供程序时启用动态路由。在此模式下,Ocelot将使用上游路径的第一个段来与服务发现提供程序一起查找下游服务。

    例如,使用 https://api.yilezhu.cn/product/products 等网址调用ocelot 。Ocelot将采用产品路径的第一部分product,并将其用作在Consul中查找服务的Key。如果consul返回一个服务,Ocelot将使用从consul返回的主机和端口以及剩余路径段组合后的Url来进行请求的响应。,如:http:// hostfromconsul:portfromconsul/products。Ocelot将正常向下游URL转发查询字符串。即query

    要启用动态路由,您需要在配置中保留0个ReRoutes。目前您无法混合动态和配置ReRoutes。除此之外,您还需要指定上面概述的Service Discovery提供程序详细信息和下游http / https方案作为DownstreamScheme。

    除此之外,您还可以设置RateLimitOptions,QoSOptions,LoadBalancerOptions和HttpHandlerOptions,DownstreamScheme(您可能希望在https上调用Ocelot,但可以通过http与私有服务进行通信),这些将应用于所有动态ReRoutes。

    配置可能看起来像:

    {
        "ReRoutes": [],
        "Aggregates": [],
        "GlobalConfiguration": {
            "RequestIdKey": null,
            "ServiceDiscoveryProvider": {
                "Host": "localhost",
                "Port": 8500,
                "Type": "Consul",
                "Token": null,
                "ConfigurationKey": null
            },
            "RateLimitOptions": {
                "ClientIdHeader": "ClientId",
                "QuotaExceededMessage": null,
                "RateLimitCounterPrefix": "ocelot",
                "DisableRateLimitHeaders": false,
                "HttpStatusCode": 429
            },
            "QoSOptions": {
                "ExceptionsAllowedBeforeBreaking": 0,
                "DurationOfBreak": 0,
                "TimeoutValue": 0
            },
            "BaseUrl": null,
                "LoadBalancerOptions": {
                "Type": "LeastConnection",
                "Key": null,
                "Expiry": 0
            },
            "DownstreamScheme": "http",
            "HttpHandlerOptions": {
                "AllowAutoRedirect": false,
                "UseCookieContainer": false,
                "UseTracing": false
            }
        }
    }
    

    Ocelot还允许您设置DynamicReRoutes,允许您为每个下游服务设置速率限制规则。如果您有一个产品和搜索服务,并且您希望对另一个进行速率限制,则此功能非常有用。这方面的一个例子如下。

    {
        "DynamicReRoutes": [
            {
            "ServiceName": "product",
            "RateLimitRule": {
                    "ClientWhitelist": [],
                    "EnableRateLimiting": true,
                    "Period": "1s",
                    "PeriodTimespan": 1000.0,
                    "Limit": 3
                }
            }
        ],
        "GlobalConfiguration": {
            "RequestIdKey": null,
            "ServiceDiscoveryProvider": {
                "Host": "localhost",
                "Port": 8523,
                "Type": "Consul"
            },
            "RateLimitOptions": {
                "ClientIdHeader": "ClientId",
                "QuotaExceededMessage": "",
                "RateLimitCounterPrefix": "",
                "DisableRateLimitHeaders": false,
                "HttpStatusCode": 428
            },
            "DownstreamScheme": "http",
        }
    }
    
  • 相关阅读:
    你知道线程池是如何退出程序的吗?
    华为云GuassDB(for Redis)发布全新版本推出:Lua脚本和SSL连接加密
    分布式消息流平台:不要只想着Kafka,还有Pulsar
    新来的前端小姐姐问:Vue路由history模式刷新页面出现404问题
    1ms的时延,10Gbps速率…5G通信技术解读
    一分钟带你了解Huawei LiteOS组件开发指南
    资深Linux 系统管理员常用的15个很好用的Cron工作示例
    C语言中动态内存分配的本质是什么?
    Python连载8datetime包函数介绍 心悦君兮君不知
    Python连载7time包的其他函数 心悦君兮君不知
  • 原文地址:https://www.cnblogs.com/Nine4Cool/p/13810326.html
Copyright © 2020-2023  润新知