.net6使用consul实现服务注册与发现(代码片段)

dotNET跨平台 dotNET跨平台     2023-01-11     408

关键词:

前言

在这几年的工作中,也经历过几个微服务项目,大多数都上了k8s,基本上都看不到Consul的身影,所以在工作之余折腾了下Consul,作为个人来讲还是得学习下,所以也就顺便通过文章来记录下学习过程。还有就是现在基本上只要提到微服务,其中涉及到的知识点就会很繁多,遇到的问题也会很多,建议阅读本文前先了解下“什么是Consul?”,”什么是注册中心、服务注册、服务发现?”,”为什么需要有服务注册与服务发现?”等等,然后可以参考大佬的文章,讲的非常详细了 Consul概念及其架构方式
然后本文只是个人学习与分享,不喜勿喷,谢谢。

什么是Consul?

这里只简单介绍下Consul,网上相关文章也比较多,就不过多陈述
Consul官网:https://www.consul.io
开源地址:https://github.com/hashicorp/consul、https://github.com/G-Research/consuldotnet

Consul 作为一种分布式服务工具,为了避免单点故障常常以集群的方式进行部署,在 Consul 集群的节点中分为 Server和 Client两种节点(所有的节点也被称为Agent),Server 节点保存数据,Client 节点负责健康检查及转发数据请求到 Server;Server 节点有一个 Leader 节点和多个 Follower 节点,Leader 节点会将数据同步到 Follower 节点,在 Leader 节点挂掉的时候会启动选举机制产生一个新的 Leader。

Client 节点很轻量且无状态,它以 RPC 的方式向 Server 节点做读写请求的转发,此外也可以直接向 Server 节点发送读写请求。下面是 Consul 的架构图:

Consul 作为一种分布式服务工具,为了避免单点故障常常以集群的方式进行部署,在 Consul 集群的节点中分为 Server 和 Client 两种节点(所有的节点也被称为Agent),Server 节点保存数据,Client 节点负责健康检查及转发数据请求到 Server;Server 节点有一个 Leader 节点和多个 Follower 节点,Leader 节点会将数据同步到 Follower 节点,在 Leader 节点挂掉的时候会启动选举机制产生一个新的 Leader。

Client 节点很轻量且无状态,它以 RPC 的方式向 Server 节点做读写请求的转发,此外也可以直接向 Server 节点发送读写请求。下面是 Consul 的架构图,很好的解释了Consul的工作原理。

环境准备

.Net 6

Docker desktop

Visual Studio 2022

安装Consul

Consul 支持各种平台的安装,安装文档:https://www.consul.io/downloads,为了快速使用,我这里选择用 docker 方式安装。

docker pull consul --默认拉取latest

docker run -d --name consul -p 8500:8500 consul:latest --使用镜像 consul:latest 启动容器,将容器的8500端口映射到主机的8500端口

启动Consul,打开默认地址 http://localhost:8500 可以看到Consul的UI界面

项目搭建

我们先准备2个Service(Minimal Api)以及一个Client(空 Web)

然后准备一个类库 Service.Framework 用于封装Consul IOC注册


在Service.Framework 中安装

NuGet包

然后将 Consul 配置信息添加至各自项目的 appsettings.json 文件中

因为我们要将项目都运行在docker中,所以这里的地址要用 host.docker.internal 代替,使用 localhost 无法正常启动,如果不在 docker 中运行,这里就配置层 localhost。

服务注册

配置Consul 服务注册

我们首先需要将ServiceA与ServiceB注册到Consul中

我们直接在Service.Framework 添加扩展方法
ConsulExtend.cs

Program.cs

ConsulRegister.cs

然后直接在对应Service项目进行IOC注册即可

配置健康检查

然后我们还需要配置对应健康检查,用来监控服务可用性,主动区分出不可用服务。
这里我们使用中间件的方式
在Service.Framework中添加HealthCheckMiddleware.cs

这里健康检查地址需要与appsetting.json文件中配置的地址对应

然后在对应服务项目中使用即可
Program.cs(示例代码为 ServiceA,ServiceB服务可以自行添加)

增加测试接口

直接在Program.cs 直接添加即可

增加docker支持

这里我因为选择的是在docker中运行,所以需要为项目添加docker支持。

接下来我们通过 Visual Studio为ServiceA与ServiceB项目生成对应的Dockfile文件

ServiceA

ServiceB

编译镜像

然后定位到项目根目录,使用命令去编译两个镜像,service_a和service_b(这里不清楚的可以参考我之前的文章 .NET 6 从0到1使用Docker部署至Linux环境)

docker image build -f ./ServiceA/Dockerfile -t service_a .

docker image build -f ./ServiceB/Dockerfile -t service_b .

查看编译好的镜像

运行镜像

接下来运行镜像启动项目实例

docker run -d -p 5050:80 --name service_a1 service_a --ConsulRegisterOptions:Port="5050"
docker run -d -p 5060:80 --name service_b1 service_b --ConsulRegisterOptions:Port="5060"

然后这里注意一下 ConsulRegisterOptions:Port="5050"
这里的意思是会替换appsetting.json 文件中的ConsulRegisterOptions配置文件中Port的内容,这里可以方便后面启动多实例时指定对应端口,本示例为单实例也可不需要此项内容,默认使用配置文件中的Port

docker run -d -p 5050:80 --name service_a1 service_a
docker run -d -p 5060:80 --name service_b1 service_b

分别执行命令

然后访问 http://localhost:8500 查看Consul查看服务是否注册成功

发现服务注册成功,健康检查也已通过,后面服务地址端口也都对应。

服务实例集群

然后我们继续为服务启动多个实例

docker run -d -p 5051:80 --name service_a2 service_a --ConsulRegisterOptions:Port="5051"
docker run -d -p 5052:80 --name service_a3 service_a --ConsulRegisterOptions:Port="5052"

docker run -d -p 5061:80 --name service_b2 service_b --ConsulRegisterOptions:Port="5061"
docker run -d -p 5062:80 --name service_b3 service_b --ConsulRegisterOptions:Port="5062"

当然这里如果你觉得比较繁琐,也可以使用docker compose来编排脚本启动服务实例

访问服务接口

接下来我们试着访问访问接口,看看能不能出现效果

因为终端编码问题,导致显示乱码,这个不影响,ok,至此服务注册大功告成

服务发现

我们直接在Client项目的Program.cs中准备两个接口

代码很简单

下面这个接口,我把上面的代码封装了一下,弄了个抽象类,然后模拟了3种调度策略,意思一样的

用之前记得先在IOC注册一下

builder.Services.AddConsulDispatcher(ConsulDispatcherType.Polling);

然后我们分别访问两个接口,模拟访问3次,看下效果:

ServiceADiscoveryTest

ServiceBDiscoveryTest

至此,服务发现就大功告成,就算其中某个节点挂掉,服务也可以正常运行。

结尾

本文只是简单的实现了Consul的服务注册和发现,至于怎么更好的应用到实际项目,还得继续探索。

后面会继续学习网关等相关知识,感兴趣的同学欢迎继续关注!

代码仓库地址

https://github.com/fengzhonghao8-24/ConsulIntroduction

作者:Mamba8-24

出处:https://www.cnblogs.com/Mamba8-24/

springcloud——consul服务注册中心的介绍安装与使用(代码片段)

...,多数据中心方案,不再需要依赖其它工具,使用起来比较简单Consul特性Raft算法服务发现健康检查key/Value存储多数据中心支持http和dns协议接口官方提供we 查看详情

consul实现服务治理(代码片段)

.NETCore微服务之基于Consul实现服务治理https://www.cnblogs.com/edisonchou/p/9124985.html一、Consul基础介绍  Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,比如Airbnb的Sma... 查看详情

springcloud(13)——服务注册与发现工具consul(代码片段)

服务注册与发现工具-ConsulSpringCloud也可以使用Consul作为服务注册与发现工具。Consul和Eureka一样,也有服务端和客户端的概念,它们都需要基于ConsulAgent运行,即Agent有Server模式和Client模式,开发环境可以直接通过consulagent-dev启动... 查看详情

springcloud(十三):注册中心consul使用详解

...据中心方案,不再需要依赖其它工具(比如ZooKeeper等)。使用起来也较为简单。Consul使用Go语言编写,因此具有天然可移植性(支持Linu 查看详情

consul服务注册与服务发现的巨坑(代码片段)

最近使用consul作为项目的服务注册与服务发现的基础功能。在塔建集群使用中遇到一些坑,下面一个个的记录下来。consul集群多nodeconsul集群的node也就是我们所说的consul实例。集群由多个node组成,为了集群的可用性,需要超过半... 查看详情

服务注册与发现-consul

 服务注册与发现-Consul  参考资料Consul服务发现安装(单机)Consul的介绍、安装与使用Consul初探-从安装到运行 查看详情

docker+consul+registrator实现服务自动注册与发现(代码片段)

...方案,它是一个一个分布式的、高可用的系统,而且开发使用都很简单、方便、它主要提供了一个功能齐全的控制平台,主要特点:服务发现、健康检查、键值存储、安全服务通信、多数据中心;Registrator:负责收集dockerhost上容... 查看详情

springcloud服务注册之consul的简介和原理

...据中心方案,不再需要依赖其他工具(比如ZooKeeper等),使用起来也较为简单。Consul用Golan 查看详情

springboot(微服务)注册分布式consul(代码片段)

...0c;用于在大型分布式系统中实现服务发现和配置共享。它使用Raft协议来实现强一致性,保证了在多个节点之间进行的数据更新的原子性。Consul客户端可以将它们自己的服务信息注册到Consul服务器。这样,Consul服务器将自... 查看详情

01.consul入门

...据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较为简单。Consul使用Go语言编写,因此具有天然可移植性( 查看详情

基于consul实现magiconion(grpc)服务注册与发现

...tps://www.cnblogs.com/myzony/p/9168851.html 0.简介 0.1什么是ConsulConsul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。这里所谓的服务,不仅仅包括常用的Api这些服务,也包括软件开发过程当中所需要的诸如... 查看详情

使用consul实现服务的注册和发现

服务注册-服务进程在注册中心注册自己的位置。它通常注册自己的主机和端口号,有时还有身份验证信息,协议,版本号,以及运行环境的详细资料。服务发现-客户端应用进程向注册中心发起查询,来获取服务的位置。服务发... 查看详情

springcloud——consul服务注册中心的介绍安装与使用(代码片段)

...,多数据中心方案,不再需要依赖其它工具,使用起来比较简单Consul特性Raft算法服务发现健康检查key/Value存储多数据中心支持http和dns协议接口官方提供web管理界面Consul角色client:客户端,无状态,将HTTP和... 查看详情

微服务~consul服务注册与发现

...sul代理服务器在通过八卦协议进行通信的群集中运行,并使用筏式协议协议。文章参考:https://www.jian 查看详情

微服务~consul服务注册与发现

...sul代理服务器在通过八卦协议进行通信的群集中运行,并使用筏式协议协议。文章参考:​​https://www.ji 查看详情

一个故事,一段代码告诉你如何使用不同语言(golang&c#)提供相同的能力基于consul做服务注册与发现(代码片段)

...服务传统服务微服务什么是服务注册与服务发现为什么要使用不同的语言提供相同的服务能力服务协调器服务注册GolangC#(.NetCore3.1)服务发现通过HttpClient发现服务,并访问注销一个`coffee-service`实例再访问引言... 查看详情

consul服务注册与发现

文章目录Consul服务注册与发现总概括思维导图Consul简介安装并运行Consul服务提供者新建Module支付服务provider8006POMYML主启动类业务类Controller验证测试服务消费者新建Module消费服务order80POMYML主启动类配置BeanController验证测试访问测... 查看详情

.netcore微服务之:基于consul实现服务治理

...离、服务配置。这些功能中的每一个都可以根据需要单独使用,也可以同时使用所有功能。Consul官网目前主要推Consul在服务网格中的使用。与其它分布式服务注册与发现的方案相比:Consul的方案更“一站式”——内置了服务注册... 查看详情