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": 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):

启动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,开发上不作任何处理。

相关文章:

  • Ocelot——初识基于.Net Core的API网关

  • Ocelot API网关的实现剖析

  • 微服务网关Ocelot

  • API网关Ocelot 使用Polly 处理部分失败问题

  • 谈谈微服务中的 API 网关(API Gateway)

  • Ocelot网关

  • Ocelot统一权限验证

  • 应用监控怎么做?

  • ASP.NET Core之跨平台的实时性能监控

  • .Net Core 2.0+ InfluxDB+Grafana+App Metrics 实现跨平台的实时性能监控

  • 应用程序的8个关键性能指标以及测量方法

  • 使用Metrics监控应用程序的性能

  • 下一个计划 : .NET/.NET Core应用性能管理

  • Ocelot监控

  • Ocelot 集成Butterfly 实现分布式跟踪

  • Ocelot中使用Butterfly实践

原文:http://www.cnblogs.com/axzxs2001/p/8487521.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322035.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Arthas - 开源 Java 诊断工具

转载自 Arthas使用 Authas — 开源的java诊断工具 下载安装 authas是一个jar包,可以直接下载后运行 wget https://alibaba.github.io/arthas/arthas-boot.jarjava -jar arthas-boot.jar就可以启动起来。启动后,authas会自动检测存在的java进程&…

jzoj6307-安排【归并排序】

正题 题目大意 一个目前序列,一个目标序列,每次可以选择一个区间交换区间最大值和最小值。 询问在345678345678345678步内将目前序列转换回目标序列的方案(输出该方案)。 解题思路 我们考虑归并排序,对于两个升序的序列,我们考…

.NET Core 2.1 Preview 1发布:更快的构建性能

今天,我们宣布发布 .NET Core 2.1 Preview 1。这是 .NET Core 2.1 的第一个公开发布。我们有很大的改进希望分享出来,并且渴望得到您的反馈意见,无论是在评论中还是在github中dotnet/core #1297ASP.NET Core 2.1 Preview 1 和 Entity Framewo…

Spark SQL(七)之基于用户的相似度公式

一、基于用户的Jaccard相似度公式 其中,u、v表示任意两个用户,N(u)表示用户u喜欢的物品集合,N(v)表示用户v喜欢物品的集合。 代码 public class UserCFApp {public static void main(String[]args){SparkConf sparkConf new SparkConf();sparkConf.se…

欢乐纪中A组赛【2019.8.17】

前言 前几天题目没改完(好难QvQQvQQvQ),然后这几天ZZYZZYZZY和WHFWHFWHF去广州二中了 然后我是菜鸡,今天暴力写挂了QAQQAQQAQ,T2T2T2少判断了个东西少了808080 成绩 懒得写只放自己的了(反正垫底) Rank51,20ptsRank51,20ptsRank51,20pts 正…

BXUG第11期活动

分享主题:Xamarin Azure 微软云加端移动应用技术架构分享者:周岳 微软MVP分享主题:从设计图到最终界面- Xamarin跨平台界面最佳实践分享者: 程文锋 视高盛景分享主题:基于VSTS的App DevOps分享者: 安庭庭 张浩 视高…

Spark SQL(八)之基于物品的相似度公式

一、基于物品的Jaccard相似度公式 其中,i、j表示任意两个物品,N(i)表示喜欢物品i的用户数,N(j)表示喜欢物品j的用户数。 代码: public class ItemCFApp {public static void main(String[]args){SparkConf sparkConf new Spark…

ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL

ASP.NET CORE MVC 中,默认的 Route 模板是: /{controller}/{action} 。我们可以通过开启 URL 小写转换将 URL 变为小写,但此方式在 Controller 或者 Action 为一个词组时,生成的 URL 并不友好。假设我们有 UserController 和 Add…

Spark SQL(九)之基于用户的推荐公式

一、基于用户的推荐公式 其中,S(u,K)表示与用户u最相似的K个用户,N(i)代表喜欢物品i的用户集合,rm表示用户v对物品i的评分。 二、代码 public class UserCFRecommendApp {public static void main(String[]args){SparkConf sparkConf new S…

jzoj6309-完全背包【贪心,背包】

正题 题目大意 完全背包,不过容量特别大。 解题思路 然后我们可以先做一个1∼200001\sim 200001∼20000的背包,然后枚举一个大小,然后将这个大小填入背包知道无法填入为止,然后剩下的空位在再一次背包就好。 codecodecode #incl…

拥抱.NET Core系列:MemoryCache 缓存过期

MSCache项目MSCache目前最新的正式版是 2.0.0,预览版是2.1.0,会与.NETCore 2.1一起发布。本篇用了2.0.0版本开源在GitHub上,仓库地址是:https://github.com/aspnet/CachingNuGet地址为:https://www.nuget.org/packages…

Spark SQL(十)之基于物品的推荐公式

一、基于物品的推荐公式 其中,S(j,K)表示与物品j最相似的K个物品,N(u)表示用户u喜欢的物品集合,Rui表示用户u对物品i的评分。 二、代码 public class ItemCFRecommendApp {public static void main(String[]args){SparkConf sparkConf new …

jzoj6308-中间值【分治】

正题 题目大意 两个序列不降a,ba,ba,b,每次可以修改或询问[l1,r1,l2,r2][l_1,r_1,l_2,r_2][l1​,r1​,l2​,r2​]要求输出将序列aaa的l1∼r1l_1\sim r_1l1​∼r1​和bbb的l2∼r2l_2\sim r_2l2​∼r2​部分合起来然后求中位数。 解题思路 我们考虑分治,…

ASP.NET Core Razor 页面使用教程

ASP.NET Core Razor 页面作为 ASP.NET Core 2.0的一部分发布,它是基于页面的全新的Web开发框架。如果您想学习如何使用 ASP.NET Core Razor 页面,可以访问微软的官方站点https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/razor-pages/razor-page…

如何面试.NET/ASP.NET工程师?

2018-2-28 更新:距离这篇回答发布已经五年过去了,最近还经常受到关注。技术本身在发展,这令我感到有必要来更新一下,希望对新看到的朋友有用。对于服务器上的 .NET 技术,最新的发展当然是 .NET Core 了,作为…

欢乐纪中A组赛【2019.8.18】

前言 有一个暴力写挂了QVQQVQQVQ 成绩 RankRankRankPersonPersonPersonScoreScoreScoreAAABBBCCC111111(J−3)LRZ(J-3)LRZ(J−3)LRZ140140140100100100303030101010191919(J−3)WYC(J-3)WYC(J−3)WYC120120120100100100101010101010262626(J−3)HZB(J-3)HZB(J−3)HZB100100100…

Asp.Net Core 2.1+的视图缓存(响应缓存)

响应缓存Razor 页与 ASP.NET 核心 2.0 中不支持。 此功能将支持ASP.NET 核心 2.1 版本。在老的版本的MVC里面,有一种可以缓存视图的特性(OutputCache),可以保持同一个参数的请求,在N段时间内,直接从mvc的缓存中读取,不…

Json.NET 不再有超过120个依赖项

Json.NET是.NET的官方的JSON解析和序列化库,它取代了Microsoft实际提供的库。但是当把Json.NET推向.NET Standard时,出现了一些问题。除了在该平台上无法使用的众多方法之外,在NET Standard 1.3上的Json.NET需要高达122个依赖包。随着适用于.…

C#热度不如Java?网友呛声:还有使用C#不能完成的工作?

C#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言,自发布以来受到了程序员的广泛关注。C#与Java有着很多相似之处,例如,单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是与Java每月被…

EntityFramework Core 2.0执行原始查询如何防止SQL注入?

前言接下来一段时间我们来讲讲EntityFramework Core基础,精简的内容,深入浅出,希望为想学习EntityFramework Core的童鞋提供一点帮助。EntityFramework Core执行原始查询在EntityFramework Core中执行原始查询我们借助FromSql来实现&#xff…