.NET Core 使用 Consul 服务注册发现
Consul
是一个用来实现分布式系统服务发现与配置的开源工具。它内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具,使用起来也较为简单。
Consul
官网:https://www.consul.io- 开源地址:https://github.com/hashicorp/consul、https://github.com/G-Research/consuldotnet
1|0安装
Consul
支持各种平台的安装,安装文档:https://www.consul.io/downloads,为了快速使用,我这里选择用docker方式安装。
提供一个docker-compose.yaml
,使用docker-compose up
编排脚本启动Consul
,如果你不熟悉,可以选择其它方式能运行Consul
即可。
这里使用 Docker 搭建 3个 server 节点 + 1 个 client 节点,API 服务通过 client 节点进行服务注册和发现。
安装完成启动Consul
,打开默认地址 http://localhost:8500 可以看到Consul
ui界面。
2|0快速使用
添加两个webapi服务,ServiceA和ServiceB,一个webapi客户端Client来调用服务。
在项目中添加Consul
组件包
2|1服务注册
接下来在两个服务中添加必要的代码来实现将服务注册到Consul
中。
首先将Consul
配置信息添加到appsettings.json
因为我们要将项目都运行在docker中,所以这里的地址要用 host.docker.internal 代替,使用 localhost 无法正常启动,如果不在 docker 中运行,这里就配置层 localhost。
添加一个扩展方法UseConul(this IApplicationBuilder app, IConfiguration configuration, IHostApplicationLifetime lifetime)
。
然后在Startup.cs
中使用扩展方法即可。
注意,这里将IConfiguration
和IHostApplicationLifetime
作为参数传进来的,根据实际开发做对应的修改就可以了。
分别在ServiceA和ServiceB都完成一遍上述操作,因为不是实际项目,这里就产生的许多重复代码,在真正的项目开发过程中可以考虑放在一个单独的项目中,ServiceA和ServiceB分别引用,调用。
接着去实现健康检查接口。
最后在ServiceA和ServiceB中都添加一个接口。
这样我们写了两个服务,ServiceA和ServiceB。都添加了健康检查接口和一个自己的服务接口,返回一段json。
我们现在来运行看看效果,可以使用任何方式,只要能启动即可,我这里选择在docker中运行,直接在 Visual Studio中对着两个解决方案右键添加,选择Docker支持,默认会帮我们自动创建好Dockfile,非常方便。
生成的Dockfile文件内容如下:
然后定位到项目根目录,使用命令去编译两个镜像,service_a和service_b
看到 Successfully 就成功了,通过docker image ls
可以看到我们打包的两个镜像。
这里顺便提一句,已经可以看到我们编译的镜像,service_a和service_b了,但是还有许多名称为<none>
的镜像,这些镜像可以不用管它,这种叫做虚悬镜像,既没有仓库名,也没有标签。是因为docker build
导致的这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none>
的镜像。
一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以docker image prune
命令删除,这样镜像列表就干净多了。
最后将两个镜像service_a和service_b,分别运行三个实例。
运行成功,接下来就是见证奇迹的时刻,去到Consul
看看。
成功将两个服务注册到Consul
,并且每个服务都有多个实例。
访问一下接口试试吧,看看能不能成功出现结果。
因为终端编码问题,导致显示乱码,这个不影响,ok,至此服务注册大功告成。
2|2服务发现
搞定了服务注册,接下来演示一下如何服务发现,在Client项目中先将Consul
地址配置到appsettings.json
中。
然后添加一个接口,IService.cs
,添加三个方法,分别获取两个服务的返回结果以及初始化服务的方法。
实现类:Service.cs
代码就不解释了,相信都可以看懂,使用了Random
类随机获取一个服务,关于这点可以选择更合适的负载均衡方式。
在Startup.cs
中添加接口依赖注入、使用初始化服务等代码。
一切就绪,添加api访问我们的两个服务。
直接在Visual Studio中运行Client项目,在浏览器访问api。
大功告成,服务注册与发现,现在就算之中的某个节点挂掉,服务也可以照常运行。
__EOF__

本文链接:https://www.cnblogs.com/meowv/p/13614168.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?