关于Consul(https://www.consul.io)是一个分布式,高可用,支持多数据中心的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla Public License 2.0 的协议进行开源。 在Consul的文档上,Consul 支持Service Discovery, Health Checking, Key/Value Store, Multi DataCenter。运用Consul,可以在系统中build复杂的应用和服务的发现等。本文不是Consul的学习重点,关于更多Consul的学习,可参考:http://blog.csdn.net/column/details/consul.html

阅读本博客的前提是对Consul中数据中心,节点,服务,健康检查等名词,一些基本的consul命令,Consul UI的使用有一定的了解。

Ocelot对Consul支持是天生集成,在OcelotGateway项目中configuration.json配置就可以开启consul+ocelot的使用,这套组合可以实现什么功能呢?

服务注册,服务发现,API网关(ocelot固有,不作说明),负载均衡,限流,熔错告警,弹性和瞬态故障处理

 

一、服务治理:服务注册,服务发现

服务注册和服务发现都是Consul自有的功能,可以通过Consul的http api完成注册或发现,我写了个NuGet库ConsulSharp(https://github.com/axzxs2001/ConsulSharp),可以在.net core下完成服务的注册和发现,建议服务注册做到一个统一的管理平台里,为了测试方便,可以在Consul的配置文里先配置服务,每次Consul启动时,自动注册;关于服务发现,Ocelot自动可以完成,只需要在OcelotGateway项目中configuration.json进行配置就可以,接下来我们看看怎么配置。

首先下载Consul: https://www.consul.io/downloads.html,本项目是windows下进行测试

再下载Consul配置文件(这个配置文件是适合本例Demo的,可根据具体给你个况调整)https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/ConsulOcelot/consul

conf文件夹:consul存放配置文件

dist文件夹:consul UI,一个小的consul信息展示门户

data文件夹:consul启动后存放consul的生成的数据和文件,在运行consul前可以清空此文件夹

Consul的配置文件如下:

{"encrypt": "7TnJPB4lKtjEcCWWjN6jSA==","services": [{"id": "API001","name": "API001","tags": [ "API001" ],"address": "192.168.1.99","port": 5001,"checks": [{"id": "API001_Check","name": "API001_Check","http": "http://192.168.1.99:5001/health","interval": "10s","tls_skip_verify": false,"method": "GET","timeout": "1s"}]},{"id": "API002","name": "API002","tags": [ "API002" ],"address": "192.168.1.99","port": 5002,"checks": [{"id": "API002_Check","name": "API002_Check","http": "http://192.168.1.99:5002/health","interval": "10s","tls_skip_verify": false,"method": "GET","timeout": "1s"}]}]}

两个服务API001和API002,跟着两个健康检查API001_Check和API002_Check

基于consul服务的配置,现在创建三个asp.net core web api项目

OcelotGateway,网关项目,端口5000;API001业务API项目,端口5001;业务API项目,API002端口5002,代码参见https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/ConsulOcelot

OcelotGateway实现引入Ocelot网关,API001,API002实现健康检查的两个get请求。

测试服务注册和发现:

1、 启动consul

consul agent -server -datacenter=dc1 -bootstrap -data-dir ./data -config-file ./conf -ui-dir ./dist -node=n1 -bind 本机IP -client=0.0.0.0

再启动一个consul,查看状态,命令:consul operator raft list-peers

结果:

Node  ID                                    Address            State   Voter  RaftProtocol

n1    dad74de2-173d-1c1e-add0-975a243b59eb  192.168.1.99:8300  leader  true   3

用Consul UI查看

services:

nodes:

可以看到API001和API002服务,并且健康检查都是正常的。

2、 配置Ocelot网关

configuration.json文件如下(关于ocelot配置文件,详见http://ocelot.readthedocs.io/en/latest/features/configuration.html):

{"ReRoutes": [{"DownstreamPathTemplate": "/api/values","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 5001}],"UpstreamPathTemplate": "/api001/values","UpstreamHttpMethod": [ "Get" ],"ServiceName": "API001","LoadBalancer": "RoundRobin","UseServiceDiscovery": true,"ReRouteIsCaseSensitive": false,"QoSOptions": {"ExceptionsAllowedBeforeBreaking": 3,"DurationOfBreak": 10,"TimeoutValue": 5000},"HttpHandlerOptions": {"AllowAutoRedirect": false,"UseCookieContainer": false,"UseTracing": false},"AuthenticationOptions": {"AuthenticationProviderKey": "","AllowedScopes": []},"RateLimitOptions": {"ClientWhitelist": [ "admin" ],"EnableRateLimiting": true,"Period": "1m","PeriodTimespan": 15,"Limit": 5}},{"DownstreamPathTemplate": "/notice","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 5001}],"UpstreamPathTemplate": "/notice","UpstreamHttpMethod": [ "Post" ],     "ReRouteIsCaseSensitive": false,"QoSOptions": {"ExceptionsAllowedBeforeBreaking": 3,"DurationOfBreak": 10,"TimeoutValue": 5000},"HttpHandlerOptions": {"AllowAutoRedirect": false,"UseCookieContainer": false,"UseTracing": false},"AuthenticationOptions": {"AuthenticationProviderKey": "","AllowedScopes": []}   },{"DownstreamPathTemplate": "/api/values","DownstreamScheme": "http","DownstreamHostAndPorts": [{"Host": "localhost","Port": 5002}],"UpstreamPathTemplate": "/API002/values","UpstreamHttpMethod": [ "Get" ],"QoSOptions": {"ExceptionsAllowedBeforeBreaking": 3,"DurationOfBreak": 10,"TimeoutValue": 5000},"ServiceName": "API002","LoadBalancer": "RoundRobin","UseServiceDiscovery": true,"HttpHandlerOptions": {"AllowAutoRedirect": false,"UseCookieContainer": false},"AuthenticationOptions": {"AuthenticationProviderKey": "","AllowedScopes": []},"RateLimitOptions": {"ClientWhitelist": [ "user" ],"EnableRateLimiting": true,"Period": "1m","PeriodTimespan": 15,"Limit": 5}}],"GlobalConfiguration": {"ServiceDiscoveryProvider": {"Host": "localhost","Port": 8500},"RateLimitOptions": {"ClientIdHeader": "client_id","QuotaExceededMessage": "Too Many Requests!!!","DisableRateLimitHeaders": false}}}

启动OcelotGateway,API001,API002项目,通过http://localhost:5000/api001/values,和http://localhost:5000/api002/values访问;因为Ocelot配置了Consul的服务治理,所以可以通过配置的服务名称和GlobalConfiguratin的Consul http api接口查找到对应服务的地址,进行访问,这些都是Ocelot帮我们做,这点很容易证明,可以修改Consul配置文件中服务的address为错误IP,就会发现通过5000端口访问不成功。

二、负载均衡

负载均衡需要启动多个API001和API002,才能进行测试,所以发布API001和API002项目,并复制到一个与192.168.1.99在一个局域网的电脑中,同时把Consul和它的配置,UI文件也复制到这台电脑上,网关项目OcelotGateway不需要,假设另外一台电脑为192.168.1.126

首先修改Consul的配置文件如下

{"encrypt": "7TnJPB4lKtjEcCWWjN6jSA==","services": [{"id": "API001","name": "API001","tags": [ "API001" ],"address": "192.168.1.126","port": 5001,"checks": [{"id": "API001_Check","name": "API001_Check","http": "http://192.168.1.126:5001/health","interval": "10s","tls_skip_verify": false,"method": "GET","timeout": "1s"}]},{"id": "API002","name": "API002","tags": [ "API002" ],"address": "192.168.1.126","port": 5002,"checks": [{"id": "API002_Check","name": "API002_Check","http": "http://192.168.1.126:5002/health","interval": "10s","tls_skip_verify": false,"method": "GET","timeout": "1s"}]}]}

在192.168.1.126下启动API001,API002项目

启动consul

consul agent -server -datacenter=dc1 -data-dir ./data -config-file ./conf -ui-dir ./dist -node=n2 -bind 192.168.1.126

同样,在192.168.1.126下用Consul UI查看各服务是否正常

在192.168.1.99下,把192.168.1.126加到集群中,命令如下

consul join 192.168.1.126

注意,consul集群中,consul配置文件中的encrypt,一定要相同,否则无法放加入同一个集群

用consul operator raft list-peers查看状态,会发现n1,n2在一个集群中了

Node  ID                                    Address             State     Voter  RaftProtocol

n1    dad74de2-173d-1c1e-add0-975a243b59eb  192.168.1.99:8300   leader    true   3

n2    efe954ce-9840-5c66-fa80-b9022167d782  192.168.1.126:8300  follower  true   3

些时在浏览器中多次访问view-source:http://localhost:5000/api001/values或view-source:http://localhost:5000/api002/values,会发现返回的内容是交替出现的,因为只有两个相同的API在集群中,这样就实现了负载均衡。

三、限流

限流是通过configuration.json配置完成的,具体值详见http://ocelot.readthedocs.io/en/latest/features/ratelimiting.html

每个要限流Route中

    "RateLimitOptions": {"ClientWhitelist": [ "admin" ],"EnableRateLimiting": true,"Period": "1m","PeriodTimespan": 15,"Limit": 5}

GlobalConfiguration中"RateLimitOptions": {"ClientIdHeader": "client_id","QuotaExceededMessage": "too more request","DisableRateLimitHeaders": false}

需要说明的是如果配置ClientWithelist白名单,需要在访问api的客户端添加一个Header项目,key为client_id,值为admin,此客户端就不受限流控制

为了测试限流创建 TestClient控制台程序进行测试,交果如下图,在一分钟内,用adminclinet访问API001超过五次也可以,访问API002,只能五次

四、熔错告警

熔断保护在Consul中和Ocelot中都有实现,意义当一个服务不正常时,首先不影响正常使用(因为服务作了集群,可以把请求转到别的服务器上),二是发生问题,应该用所告警。Ocelot负载均衡可以自动发现服务出问题(Consul有健检查),并停止对异常服务请求;告警是通过Consul配置文件实现的,关于watches参看https://www.consul.io/docs/agent/watches.html

{"watches": [{"type": "checks","handler_type": "http","state": "critical","http_handler_config": {"path": "http://192.168.1.99:5000/notice","method": "POST","timeout": "10s","header": { "Authorization": [ "token" ] }}}]}

在consul启动时,会加载conf下的所有json文件,因为是json内容是watches节点,consul会作特定处理。

同时http://192.168.1.99:5000/notice映射的http://localhost:5001/notice中作了一个发邮件的操作,把发生异常的服务信息发送给对应邮箱,这里注意,测试时,不要关了API001测试,因为发邮件的功能在这个项目里,可以关掉API002测试,真实环境中,这块肯定是独立项目处理,并且采用集群的,效果如下:

关掉192.168.1.99下的API2,作业报警邮件会提示准确的检查错误和服务名称。

五、弹性和瞬态故障处理

弹性和瞬态故障处理,是Ocelot内置的功能,在网关转发每个请求时,会用Polly(https://github.com/App-vNext/Polly)处理,设置详见http://ocelot.readthedocs.io/en/latest/features/qualityofservice.html,开发上不作任何处理。

 

转载于:https://www.cnblogs.com/axzxs2001/p/8487521.html

Ocelot + Consul实践相关推荐

  1. .net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡

    大神张善友 分享过一篇 <.NET Core 在腾讯财付通的企业级应用开发实践>里面就是用.net core 和 Ocelot搭建的可扩展的高性能Api网关. Ocelot(http:// ...

  2. .NET Core Ocelot Consul

    管理 NuGet 程序包 Ocelot Consul Ocelot.Provider.Consul ---------[ocelot + api]--------- 优点:负载均衡 缺点:不能动态伸缩 ...

  3. 【Consul】Consul实践指导-健康检查(Checks)

    Consul的一个基本功能是提供系统级和应用级健康检查.如果健康检查与某个服务关联,则称为是应用级的:如果不予服务关联,则监控整个节点的健康. check定义在配置文件中,或运行时通过HTTP接口添加 ...

  4. Asp.Net Core Ocelot Consul 微服务

    做一个简单的微服务架构如下图: 这个图表示的是一个网关代理Consul的两个服务,consul每个服务注册集群 安装 Consul的服务,这里安装单机版的,集群版配置最低要求(3个Consul ser ...

  5. .Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关...

    1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderEx ...

  6. .NET Core微服务之基于Consul实现服务治理(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...

  7. .NET微服务体系结构中为什么使用Ocelot实现API网关

    为什么要使用API网关而不是直接通信? 在微服务架构中,客户端应用程序通常需要使用来自多个微服务的功能.如果直接执行该消费,则客户端需要处理多个微服务端点以进行呼叫.当应用程序发展并引入新的微服务或更 ...

  8. Swagger如何访问Ocelot中带权限验证的API

    先亮源代码:https://github.com/axzxs2001/Asp.NetCoreExperiment/tree/master/Asp.NetCoreExperiment/SwaggerDe ...

  9. Ocelot.JwtAuthorize:一个基于网关的Jwt验证包

    Ocelot作为基于.net core的API网关,有一个功能是统一验证,它的作用是把没有访问权限的请求挡在API网关外面,而不是到达API网关事端的API时才去验证:之前我有一篇博文Ocelot统一 ...

最新文章

  1. CTFshow 文件包含 web82
  2. Java基础点——面向对象(中)
  3. vim下php文件中自动缩排html代码
  4. 基于php的外卖订餐系统开题报告_订餐系统开题报告.doc
  5. Emlog百度快速收录插件
  6. 一步一步写算法(之链表排序)
  7. 实习踩坑之路:ElasticSearch搜索出来了不是自己的数据?Elastic会像MyBatisPlus一样会帮我们做判断null的操作么?分片精确度如何控制?
  8. win10 我的世界java_Windows10系统怎样运行我的世界
  9. ios代码拨打电话时,电话号码格式兼容性处理问题:
  10. 不要害怕超级人工智能
  11. java高并发唯一订单号_高并发下唯一订单号生成器--雪花算法
  12. 如何快速提高网站用户体验之3大绝招:快、准、狠
  13. pageX,clientX区别
  14. 【Tool】TI公司14-Pin JTAG规范以及参考原理图
  15. 【数据结构】第15-16周练习题 查找排序
  16. 虚拟机licserver服务器,Grid license服务器搭建
  17. 我的世界java版的马难以驯服_最难驯服的我的世界呆萌宠物排行榜介绍
  18. 串口干扰 linux复位,消除RS422串口干扰的方法与流程
  19. 鸟和飞机都能飞行,使用代码写一个方法完成鸟的子类比如鹰,麻雀的飞行,还有飞机的飞行
  20. JavaScript 简易小米官网案例

热门文章

  1. 创建数据库,指定数据库的字符集和编码顺序
  2. 后端怎么防止重复提交?(常用的做法)
  3. 亲手建造自己想要的生活
  4. 数据库里存json数据
  5. xshell问题汇总
  6. 操作系统学习笔记 第一章:操作系统概述(王道考研)
  7. MindSpore张量mindspore::tensor
  8. 为什么edge AI是一个无需大脑的人
  9. 从C到C++过渡的3个原因
  10. 2021年大数据常用语言Scala(四):基础语法学习 声明变量