Ocelot + Consul实践
关于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": , "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": , "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": } ], "UpstreamPathTemplate": "/api001/values", "UpstreamHttpMethod": [ "Get" ], "ServiceName": "API001", "LoadBalancer": "RoundRobin", "UseServiceDiscovery": true, "ReRouteIsCaseSensitive": false, "QoSOptions": { "ExceptionsAllowedBeforeBreaking": , "DurationOfBreak": , "TimeoutValue": }, "HttpHandlerOptions": { "AllowAutoRedirect": false, "UseCookieContainer": false, "UseTracing": false }, "AuthenticationOptions": { "AuthenticationProviderKey": "", "AllowedScopes": [] }, "RateLimitOptions": { "ClientWhitelist": [ "admin" ], "EnableRateLimiting": true, "Period": "1m", "PeriodTimespan": , "Limit": } }, { "DownstreamPathTemplate": "/notice", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": } ], "UpstreamPathTemplate": "/notice", "UpstreamHttpMethod": [ "Post" ], "ReRouteIsCaseSensitive": false, "QoSOptions": { "ExceptionsAllowedBeforeBreaking": , "DurationOfBreak": , "TimeoutValue": }, "HttpHandlerOptions": { "AllowAutoRedirect": false, "UseCookieContainer": false, "UseTracing": false }, "AuthenticationOptions": { "AuthenticationProviderKey": "", "AllowedScopes": [] } }, { "DownstreamPathTemplate": "/api/values", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "localhost", "Port": } ], "UpstreamPathTemplate": "/API002/values", "UpstreamHttpMethod": [ "Get" ], "QoSOptions": { "ExceptionsAllowedBeforeBreaking": , "DurationOfBreak": , "TimeoutValue": }, "ServiceName": "API002", "LoadBalancer": "RoundRobin", "UseServiceDiscovery": true, "HttpHandlerOptions": { "AllowAutoRedirect": false, "UseCookieContainer": false }, "AuthenticationOptions": { "AuthenticationProviderKey": "", "AllowedScopes": [] }, "RateLimitOptions": { "ClientWhitelist": [ "user" ], "EnableRateLimiting": true, "Period": "1m", "PeriodTimespan": , "Limit": } } ], "GlobalConfiguration": { "ServiceDiscoveryProvider": { "Host": "localhost", "Port": }, "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": , "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": , "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": , "Limit": }
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,开发上不作任何处理。
Ocelot + Consul实践的更多相关文章
- .net core Ocelot Consul 实现API网关 服务注册 服务发现 负载均衡
大神张善友 分享过一篇 <.NET Core 在腾讯财付通的企业级应用开发实践>里面就是用.net core 和 Ocelot搭建的可扩展的高性能Api网关. Ocelot(http:// ...
- 【微服务No.4】 API网关组件Ocelot+Consul
介绍: Ocelot是一个.NET API网关.该项目针对的是使用.NET运行微服务/面向服务架构的人员,他们需要一个统一的入口进入他们的系统.然而,它可以处理任何说HTTP并在ASP.NET Cor ...
- 负载均衡之Ocelot+Consul(配置文件注册服务)
继上篇 Ocellot 做负载均衡之后,本篇将记录 Ocelot + Consul 试验如何做服务发现和服务注册. 服务发现和服务注册的背景知识,一搜满街都是. 在此,我还是写下自己对这个术语的理解吧 ...
- 负载均衡之Ocelot+Consul(WebAPI注册服务)
上一篇 负载均衡之Ocelot+Consul(文件配置注册服务),介绍了如何通过json文件注册服务,本篇将学习如何通过web api 注册服务. 在展开学习过程之前,且先总结一下 consul服 ...
- Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网关Ocelot+Consul
相关文章 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-Consul服务注册,服务发现 Consul+Ocelot+Polly在.NetCore中使用(.NET5)-网 ...
- Ocelot+Consul 集群搭建实践
博客园已经有很多大神写过consul集群搭建了.大家都在玩,那我也不能托后退呢 不过自己研究下还是好的.毕竟每个人遇到的问题的不同 研究过才能说自己玩过consul,文章有部分名词解释是收集网络 Co ...
- .NET5 API 网关Ocelot+Consul服务注册
1|0网关介绍 网关其实就是将我们写好的API全部放在一个统一的地址暴露在公网,提供访问的一个入口.在 .NET Core下可以使用Ocelot来帮助我们很方便的接入API 网关.与之类似的库还有Pr ...
- Ocelot + Consul + Registrator 基于Docker 实现服务发现、服务自动注册
目录 1. Consul集群搭建 1.1 F&Q Consul官方推荐的host网络模式运行 2. Registrator服务注册工具 2.1 F&Q Registrator悬挂服务 ...
- 【3分钟就会系列】使用Ocelot+Consul搭建微服务吧!
一.什么Ocelot? API网关是一个服务器,是系统的唯一入口.API 网关一般放到微服务的最前端,并且要让API 网关变成由应用所发起的每个请求的入口.这样就可以明显的简化客户端实现和微服务应用程 ...
随机推荐
- Tomcat映射路径
打开tomcat安装包,在config目录下修改server.xml文件: 在<Host>标签中添加: <Context path="" docBase=&quo ...
- leetcode刷题六<z字形变换>
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 时,排列如下: L C I R E T O E S I I G E D H N 之后,你的输出需要从左往右逐 ...
- HashCode总结
不同的实例对象的hashCode是不相同的 package com.cici.test;class DoubleLinkNode{ public int iData; public double dD ...
- js中常用的正则表达式总结
去除所有空格: str = str.replace(/\s+/g,""); 去除两头空格: str = str.replace(/^\s+|\s+$/g,"") ...
- Windows远程桌面相关
3389端口是Windows系统远程终端服务以及系统远程桌面服务默认所使用的端口,原本是为了管理人员能够方便的远程维护管理计算机而设计的,但如今已经成为了黑客们最喜爱的一种人侵途径,入侵者通过3389 ...
- 主流图库对比以及JanusGraph入门
1.Overall Comparison Name Neo4j JanusGraph Giraph Jena 1.Compute Framework Yes Yes Yes 2.External Co ...
- [SQLite]SQLite URI配置
脱离新手文档使用SQLAlchemy配置sqlite,才发现sqlite的URI指定有点特别. https://github.com/mitsuhiko/flask-sqlalchemy/issues ...
- sqlzoo:2
顯示具有至少2億人口的國家名稱. 2億是200000000,有八個零. SELECT name FROM world 找出有至少200百萬(2億)人口的國家名稱,及人均國內生產總值. select n ...
- JUC
1.Java JUC简介 在Java5.0提供了java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池.异 ...
- mysql学习3
1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据.对于索引, 会保存在额外的文件中. 作用: 约束 加速查找 1.1.建立索引 a.额外的文件保存特殊的数据结构 ...