.netcore consul实现服务注册与发现-集群完整版

一、Consul的集群介绍

   Consul Agent有两种运行模式:ServerClient。这里的Server和Client只是Consul集群层面的区分,与搭建在Cluster之上的应用服务无关, 以Server模式运行的Consul Agent节点用于维护Consul集群的状态,官方建议每个Consul Cluster至少有3个或以上的运行在Server Mode的Agent,Client节点不限。

1、Server节点需要三台或以上机器

2、Client节点不限

640?wx_fmt=png

二、Consul环境准备

准备了三台Linux(CentOS)虚拟机(Consul Server)二台Linux(CentOS)虚拟机(Consul Client

Consul Server服务IP分别为:

192.168.31.175

192.168.31.176

192.168.31.177

Consul Client服务IP分别为:

192.168.31.178

192.168.31.179 

其中,192.168.31.175会作为leader角色,其余两台192.168.31.176和192.168.31.177会作为follower角色。当然,实际环境中leader角色不会是一个固定的,会随着环境的变化(比如Leader宕机或失联)由算法选出新的leader。在进行下面的操作会前,请确保三台节点能够相互ping通,并能够和宿主机也ping通。另外,192.168.31.178和192.168.31.179会作为client角色,并且和其余三台虚拟机互相ping通。

三、Consul正式安装

可以参考上一篇文章的安装方法:.netcore consul实现服务注册与发现-单台节点

一定保证以上五台安装成功

1、测试Consul是否安装成功

> consul

如下图表示成功:

640?wx_fmt=png

2、Consul Server服务端安装(启动与配置Consul服务

服务端192.168.31.175执行

> consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul  -node=consul-175 -client=0.0.0.0  -bind=192.168.31.175 -datacenter=dc1

服务端192.168.31.176执行

> consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul  -node=consul-176 -client=0.0.0.0  -bind=192.168.31.176 -datacenter=dc1 -join 192.168.31.175

服务端192.168.31.177执行

> consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul  -node=consul-177 -client=0.0.0.0  -bind=192.168.31.177 -datacenter=dc1 -join 192.168.31.175

注:因为是集群安装,bootstrap-expect=3,以服务端的数量为准

       datacenter=dc1,三台必须在一个数据中心 

      176和177的启动命令中,有一句 -join 192.168.31.175 => 有了这一句,就把176和177加入到了175所在的集群中。

  启动之后,集群就开始了Vote(投票选Leader)的过程 

命令:查看各个server的情况:

> consul members

640?wx_fmt=png

命令:查看目前全部的consul的角色状态:

> consul operator raft list-peers

640?wx_fmt=png

 

3、通过UI查看集群状态

 Consul不仅提供了丰富的命令查看集群情况,还提供了一个WebUI,默认端口8500,我们可以通过访问这个URL(eg. http://192.168.31.175:8500)得到如下图所示的WebUI:

640?wx_fmt=png

4、模拟Leader挂掉,查看Consul集群的新选举Leader

直接停止192.168.31.175的服务,或者暴力直接关机

输入命令查看服务状态

> consul members

640?wx_fmt=png


查看其余两个节点的日志或者命令可以发现,consul-176被选为了新的leader

我们也可以在次通过UI界面来查看状态:

640?wx_fmt=png

虽然这里192.168.31.175这个原leader节点挂掉了,但是只要超过一半的Server(这里是2/3还活着)还活着,集群是可以正常工作的,这也是为什么像Consul、ZooKeeper这样的分布式管理组件推荐我们使用3个或5个节点来部署的原因。 

注:以上也可以将.netcore项目部署在Consul Server上,但官方建议用Consul Client来关联,分别做各自的事情,互不影响。 

5、Consul Client安装

为了节约虚拟机,目前在192.168.31.178部署.netcore项目

> mkdir /data/mvc


> mkdir /data/api


> cd /data/mvc/


> dotnet new mvc


> cd /data/api/


> dotnet new webapi


>dotnet run

启动并运行mvc,webapi两个项目,保证能正常访问,如图正常访问

640?wx_fmt=png

6、将.netcore服务注册到Consul(通过配置文件来注册服务

vi /etc/consul/services_config.json


{


"services":[


{


"id": "CLIENT_SERVICE_01",


"name" : "MVCClientService",


"tags": [


"urlprefix-/MVCClientService01"


],


"address": "192.168.31.178",


"port": 5000,


"checks": [


{


"name": "clientservice_check",


"http": "http://192.168.31.178:5000",


"interval": "10s",


"timeout": "5s"


}


]


},


{


"id": "CLIENT_SERVICE_02",


"name" : "APIClientService",


"tags": [


"urlprefix-/APIClientService02"


],


"address": "192.168.31.178",


"port": 5000,


"checks": [


{


"name": "clientservice_check",


"http": "http://192.168.31.178/api/values",


"interval": "10s",


"timeout": "5s"


}


]


}


]


}

在Consul Client 192.168.31.178运行命令:

consul agent -config-dir=/etc/consul -data-dir=/tmp/consul -node=consul-178 -client=0.0.0.0 -bind=192.168.31.178 -datacenter=dc1 -join 192.168.31.175

如下图表示正常启动,并将192.168.31.178加入到服务集群192.168.31.175中

640?wx_fmt=png

7、查看Consul集群状态

可以看到192.168.31.178加入到了集群中,表示正常,还能看到.netcore的两个服务哦,也表示正常

640?wx_fmt=png


Consul不仅仅提供了服务注册,还提供了服务发现,我们可以通过调用其提供的API来发现服务的IP和Port。

640?wx_fmt=png

8、通过consul api 接口注册服务

  • 创建一个ASP.NET Core WebAPI程序            

640?wx_fmt=png

  • 创建一个HealthController用于Consul的健康检查    

[Produces("application/json")]

[Route("api/Health")]

public class HealthController : Controller

{


[HttpGet]

public IActionResult Get() => Ok("ok");


}

注:Consul会通过call这个API来确认Service的健康状态。 

  • 基于IApplicationBuilder写一个扩展方法,用于调用Consul API

  • 在nuge管理器中引入Consul包 

public static class ConsulBuilderExtensions

{


// 服务注册

public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app, IApplicationLifetime lifetime, HealthService healthService, ConsulService consulService)

{


var consulClient = new ConsulClient(x => x.Address = new Uri($"http://{consulService.IP}:{consulService.Port}"));//请求注册的 Consul 地址

var httpCheck = new AgentServiceCheck()

{


DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务启动多久后注册

Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔

HTTP = $"http://{healthService.IP}:{healthService.Port}/api/health",//健康检查地址

Timeout = TimeSpan.FromSeconds(5)


};


// Register service with consul


var registration = new AgentServiceRegistration()

{


Checks = new[] { httpCheck },

ID = healthService.Name + "_" + healthService.Port,

Name = healthService.Name,

Address = healthService.IP,

Port = healthService.Port,

Tags = new[] { $"urlprefix-/{healthService.Name}" }//添加 urlprefix-/servicename 格式的 tag 标签,以便 Fabio 识别


};


consulClient.Agent.ServiceRegister(registration).Wait();//服务启动时注册,内部实现其实就是使用 Consul API 进行注册(HttpClient发起)

lifetime.ApplicationStopping.Register(() =>

{


consulClient.Agent.ServiceDeregister(registration.ID).Wait();//服务停止时取消注册


});


return app;


}


}


  • 在Starup类的Configure方法中,调用此扩展方法

#region register this service


ConsulService consulService = new ConsulService()


IP = Configuration["Consul:IP"],


Port = Convert.ToInt32(Configuration["Consul:Port"])


};


HealthService healthService = new HealthService()


{


IP = Configuration["Service:IP"],


Port = Convert.ToInt32(Configuration["Service:Port"]),


Name = Configuration["Service:Name"],


};


app.RegisterConsul(lifetime, healthService, consulService);


#endregion

 

  • 其中用到了appSettings.json配置文件,其定义如下:

"Service": {


"Name": "DMSWebAPITest",


"IP": "localhost",


"Port": "5001"


},


"Consul": {


"IP": "localhost",


"Port": "8500"


}

 

  • 其中ConsulService类定义如下:

public class ConsulService

{


public string IP { get; set; }


public int Port { get; set; }


}

  • 其中HealthService类定义如下:

 

public class HealthService


{


public string Name { get; set; }


public string IP { get; set; }


public int Port { get; set; }



}

 

  • 确保HealthController的API能正常访问,以便做健康检查

640?wx_fmt=png

  • 成功运行后,查看Consul集群的状态,UI界面

640?wx_fmt=png

 

四、总结与后续工作

    本篇主要基于一个最小化的集群搭建了一个Consul服务治理组件,并将ASP.NET Core API程序注册到了Consul(通过配置文件注册),并尝试通过Consul进行服务发现。希望整理这篇文章对大家有一些帮助,同时希望大家把.NET Core应用起来,将来能够跑在Linux和Docker上,希望大家早日实现目标。 

    后续我会继续尝试基于Ocelot构建API网关,到时会结合Consul进行进一步的集成。另外,还会尝试Polly进行熔断降级、Identity Server进行验证

Exceptionless作分布式日志开源框架,Log4net,NLog,Autofac属性注入,Consul API接口服务注册实例等开源地址:https://github.com/hailang2ll/DMS

相关文章:

  • .net core grpc consul 实现服务注册 服务发现 负载均衡(二)

  • winserver的consul部署实践与.net core客户端使用(附demo源码)

  • .netcore consul实现服务注册与发现-单节点部署

原文地址: https://blog.csdn.net/hailang2ll/article/details/82079192


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

640?wx_fmt=jpeg

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

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

相关文章

【矩阵乘法】【倍增】WYC(luogu 3597)

WYC 题目大意 给你一个有向图,让你求图中的kkk短路(非简单路径) 输入样例# 6 6 11 1 2 1 2 3 2 3 4 2 4 5 1 5 3 1 4 6 3输出样例#1 4数据范围 1⩽n⩽40,1⩽m⩽1000,1⩽k⩽10181\leqslant n\leqslant 40&#xff…

匹配(树形DP)

传送门 题目描述: 有一张无向联通图 G⟨V,E⟩ ,其中顶点数 |V|n ,边数 |E|n−1 。求有多少种方案使得删边后残余图中的最大匹配数恰好为 m 的倍数。 题解: 这道题看起来是求最大匹配,其实关系不大,正解…

博弈论讲解(一)

常见的博弈论有巴什博弈,威佐夫博弈,尼姆博弈,斐波那契博弈等等,今天暂时讲几个 文章目录一.巴什博弈证明:代码二.威佐夫博奕结论:代码:三.环形博弈结论证明代码:一.巴什博弈 巴什博…

浅谈surging服务引擎中的rabbitmq组件和容器化部署

1、前言上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎,而这篇将介绍浅谈surging服务引擎中的rabbi…

csp-j/s总结

文章目录csp-jcsp-s总结csp-j T1傻逼题(我是傻逼),手残把&打成整除了(大样例还对了gg) T2乱推,然后打了个O(n)O(n)O(n),却WA了15分? T3看了看,修改不会相互影响?那不…

51nod1220-约数之和【莫比乌斯反演,杜教筛】

正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId1220 题目大意 给出nnn,求∑i1n∑j1nσ(i∗j)\sum_{i1}^n\sum_{j1}^n\sigma(i*j)i1∑n​j1∑n​σ(i∗j) 其中σ\sigmaσ表示约数和。 解题思路 首先有结论σ(i∗j)∑x∣i∑y∣j[gcd(x,y)1]…

CDQ分治与整体二分

首先说明,CDQ分治与整体二分都是离线算法 CDQ分治: 流程: 1.我们要解决一系列问题,这些问题一般包含修改和查询操作,可以把这些问题排成一个序列,用一个区间[L,R]表示。 2.分。递归处理左边区间[L,M]和…

博弈论讲解(二)

文章目录斐波那契博弈问题:结论证明:尼姆博奕(Nimm Game)问题:结论:证明:代码:公平组合博弈(Impartial Combinatori Games)理论知识(1)、若面临末状态者为获胜…

.net core实践系列之短信服务-架构设计

前言上篇《.net core实践系列之短信服务-为什么选择.net core(开篇)》简单的介绍了(水了一篇).net core。这次针对短信服务的架构设计和技术栈的简析。源码地址:https://github.com/SkyChenSky/Sikiro.SMS为什么需要架…

【矩阵乘法】Matrix Power Series(poj 3233)

Matrix Power Series poj 3233 题目大意 给你一个矩阵A&#xff0c;让你求SAA2A3…AkS A A^2 A^3 … A^kSAA2A3…Ak 输入样例 2 2 4 0 1 1 1输出样例 1 2 2 3n⩽30,k⩽109,m<104,a∈A,a⩽32768n \leqslant 30,k \leqslant 10^9,m < 10^4,a\in A,a \leqslant32…

P3702-[SDOI2017]序列计数【矩阵乘法】

正题 题目链接:https://www.luogu.com.cn/problem/P3702 题目大意 nnn个不超过mmm的正整数&#xff0c;要求和是ppp的倍数且至少有一个质数。 解题思路 用总方案数减去只有非质数的方案数即可。 线性筛出所有质数&#xff0c;然后矩阵乘法转移即可。 时间复杂度O(mp3log⁡n…

字符串hash(一)

很久没遇到过hash的题了&#xff0c;今天来重新温故一下 文章目录序言常用的几个字符串hash方法&#xff1a;hash公式&#xff08;自然溢出&#xff09;讲解模板单hash讲解模板双hash讲解代码总结序言 你有没有想过&#xff0c;字符串存储一大溜&#xff0c;比较时又麻烦又折腾…

CAP 2.3版本发布,支持 MongoDB

前言经过2个月的调整及测试&#xff0c;CAP 2.3 版本终于发布了&#xff0c;这个版本最大的特性就是对于 MongoDB 的支持&#xff0c;感谢博客园团队的keke同学对于 MongoDB 支持所提供的 PR&#xff0c;相信随着博客园的使用&#xff0c;CAP 会越来越多的帮助到更多的人。CAP …

【矩阵乘法】递推(ssl 1532)

递推 ssl 1532 题目大意 给出数列a0,a1…ana_0,a_1…a_na0​,a1​…an​和fff的前n−1n-1n−1项f0,f1…fn−1f_0,f_1…f_{n-1}f0​,f1​…fn−1​ fia0∗fi−na1∗fi−(n−1)...an−1∗fi−1anf_ia_0*f_{i-n}a_1*f_{i-(n-1)}...a_{n-1}*f_{i-1}a_nfi​a0​∗fi−n​a1​∗fi…

P3185-[HNOI2007]分裂游戏【SG函数】

正题 题目链接:https://www.luogu.com.cn/problem/P3185 题目大意 nnn个瓶子&#xff0c;开始第iii个里有pip_ipi​个糖果&#xff0c;操作的人可以找到一个三元组(i,j,k)i<j≤k(i,j,k)\ i<j\leq k(i,j,k) i<j≤k然后取出iii中的一个糖果&#xff0c;在j,kj,kj,k中各…

牛客网 【每日一题】5月9日 过河

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 在河上有一座独木桥&#xff0c;一只青蛙想沿着独木桥从河的一侧跳到另一侧。在桥上有一些石子&#xff0…

.NETCore 实现容器化Docker与私有镜像仓库管理

一、Docker介绍Docker是用Go语言编写基于Linux操作系统的一些特性开发的&#xff0c;其提供了操作系统级别的抽象&#xff0c;是一种容器管理技术&#xff0c;它隔离了应用程序对基础架构&#xff08;操作系统等&#xff09;的依赖。相较于虚拟机而言&#xff0c;Docker共享的是…

【矩阵乘法】幼儿园数学题I(ssl 2513)

幼儿园数学题I ssl 2513 题目大意 定义fn(512)n−1f_n\left ( \frac{\sqrt{5}1}{2}\right )^{n-1}fn​(25​1​)n−1&#xff0c;求前n项的和,&#xff08;对109710^971097取模&#xff09;&#xff08;题目貌似出了些问题&#xff0c;实际上fff等价于斐波那契数列&#xff…

P4492-[HAOI2018]苹果树【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4492 题目大意 开始有一个节点&#xff0c;第iii次在一个儿子不超过222的节点下面长出一个新儿子编号为iii。求所有方案下树的路径长度和。 解题思路 考虑计算每条边的贡献&#xff0c;设gig_igi​表示大小为iii的树的形态…

字符串hash(二)

从上一届已经讲了字符串hash的方法&#xff0c;hash后怎么用也很重要 文章目录一.查询子串的hash值查询子串减去期中一个字符后的hash值查询两个子串拼接的hash值**hash的模板&#xff08;自然溢出&#xff09;**char s[10010]; ull hashs(char s[]) {int lenstrlen(s);ull bas…