如何利用Soa库和Abp框架实现微服务项目中的服务发现与健康监控?

2026-05-22 10:113阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1316个文字,预计阅读时间需要6分钟。

如何利用Soa库和Abp框架实现微服务项目中的服务发现与健康监控?

文章:服务发现与健康监测在伪原创系统中的应用

文章内容:本文将介绍伪原创系统中服务发现和健康监测的重要性,并探讨如何利用Soa库实现服务发现,以及如何配置Consul作为服务发现服务或轮询已配置的服务列表作为本机服务发现。

伪原创系统中的服务发现和健康监测是确保系统稳定运行的关键模块。Soa库提供了强大的服务发现功能,可以配置Consul作为服务发现服务,或者通过轮询已配置的服务列表来实现本机服务发现。

Soa库支持配置Consul作为服务发现服务,这样可以通过Consul来动态地发现和注册服务。Consul是一个高性能的服务发现和配置工具,它可以帮助系统自动发现服务实例,并在服务实例不可用时进行健康检查。

此外,Soa库还允许通过轮询已配置的服务列表来实现本机服务发现。这种方式适用于那些不需要动态服务发现的场景,可以通过定期检查服务列表来确保服务的可用性。

为了实现后台任务的异步处理,本文还将介绍如何使用Hangfire作为服务。Hangfire是一个开源的作业队列,可以轻松地集成到ASP.NET应用程序中,用于后台任务的调度和执行。

通过以上配置,伪原创系统可以实现高效的服务发现和健康监测,确保系统的稳定性和可靠性。

​上篇文章说过,服务发现和健康监测是面向服务体系架构重要的模块,Soa库可以配置使用Consul作为服务发现服务,或者轮询已配置的服务列表作为本机服务发现。

将用Hangfire来作为服务发现与健康监测的定时执行库

具体配置信息请参考Hangfire – Background jobs and workers for .NET and .NET Core

服务发现

配置各个服务的地址列表,或者在服务启动时注册的key-value地址集合,轮询地址服务描述服务(GetRoutesDescAsync),确定服务中方法的路由,方法签名,使用方式,描述(功能,作者)等内容。

本机服务发现(InServer)

本机服务发现将轮询Address配置中的地址所对应的RoutesGetters,执行获取路由信息,并更新SoaServiceRoute中的Address集合

每个微服务都有一个Id 为"Soa.ServiceDiscovery.InServer.GetRoutesDescAsync"的方法

获取该服务的地址,服务描述。

在服务模块初始化中已经将这个服务路由对象添加到RoutesGetters

var service = new SoaServiceRoute { Address = new List<SoaAddress> { addr }, ServiceDescriptor = new SoaServiceDesc { Id = "Soa.ServiceDiscovery.InServer.GetRoutesDescAsync" } };

在主服务(Soa.Sample.Web)中的appsettings.json中,配置如下:

"Discovery": "InServer"

配置服务发现,当前设置的轮询间隔为每分钟执行一次

"InServiceDiscovery": { "Enable": true, "JobCron": "0 * * * * ? " }

各个服务Host的appsettings.json中,只需要配置Discovery即可:

"Discovery": "InServer", Consul

可以使用UseConsulForDiscovery方法配置基于consul的服务发现功能

consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案

首先去consul官网下载二进制文件

Downloads | Consul by HashiCorp

安装直接下载zip包,解压后只有一个可执行的文件consul,将consul添加到系统的环境变量里面。

打开命令行并输入consul.exe agent -dev -bind {你本机的ip地址} 来运行consul服务

​​

在主服务(Soa.Sample.Web)和各个服务Host的appsettings.json中,配置如下:

配置文件中设置Discovery

"Discovery": "Consul",

设置Consul

"ConsulServiceDiscovery": { "Ip": "127.0.0.1", "Port": "8500" }

注意8500为consul所在ip地址

服务运行时将自动注册ip和服务名称到consul的kv中,待客户端调用时,只需要传入key值即可

当服务运行之后,在浏览器地址栏输入127.0.0.1:8500查看已在consul注册的服务

​​

服务监控

在​ServicesManagerController是获取服务列表和服务详情的Api接口控制器

[Route("api/[controller]/[action]")] public class ServicesManagerController:AbpController { private readonly IClientServiceDiscovery clientServiceDiscovery; public ServicesManagerController(IClientServiceDiscovery clientServiceDiscovery) { this.clientServiceDiscovery = clientServiceDiscovery; } [HttpGet] public async Task<List<SoaAddress>> GetAddresses() { var addresses = await clientServiceDiscovery.GetAddressAsync(); return addresses; } [HttpGet] public async Task<List<SoaServiceDesc>> GetServices(string server) { var routes = await clientServiceDiscovery.GetRoutesAsync(); if (routes != null && routes.Any() && !string.IsNullOrEmpty(server)) { return (from route in routes where route.Address.Any(x => x.Code == server) select route.ServiceDescriptor).ToList(); } return (from route in routes select route.ServiceDescriptor).ToList(); } }

运行项目,在swagger中调试请求GetSoaService接口,可以获取所有服务信息

​​

健康监测

健康监测用于确定各服务的健康程度,比如是否运行缓慢,是否链接顺畅等。

用一个简单的监测链接是否超时方式,确定这个服务是否健康。

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { SendTimeout = timeout }) { try { await socket.ConnectAsync(server.CreateEndPoint()); server.IsHealth = true; } catch { server.IsHealth = false; } }

在主服务(Soa.Sample.Web)和各个服务Host的appsettings.json中,配置如下:

"HealthCheck": { "Enable": true, "JobCron": "0/5 * * * * ? ", "Timeout": 3000 },

这里健康监测服务的轮询时间是5s,超时时间为3000ms

如何利用Soa库和Abp框架实现微服务项目中的服务发现与健康监控?

运行后关闭一个微服务,若关闭Service2,请求/api/ServicesManager/GetAddresses

可以看到IsHealth变为False

项目地址:

MatoApps/Soa (github.com)

本文共计1316个文字,预计阅读时间需要6分钟。

如何利用Soa库和Abp框架实现微服务项目中的服务发现与健康监控?

文章:服务发现与健康监测在伪原创系统中的应用

文章内容:本文将介绍伪原创系统中服务发现和健康监测的重要性,并探讨如何利用Soa库实现服务发现,以及如何配置Consul作为服务发现服务或轮询已配置的服务列表作为本机服务发现。

伪原创系统中的服务发现和健康监测是确保系统稳定运行的关键模块。Soa库提供了强大的服务发现功能,可以配置Consul作为服务发现服务,或者通过轮询已配置的服务列表来实现本机服务发现。

Soa库支持配置Consul作为服务发现服务,这样可以通过Consul来动态地发现和注册服务。Consul是一个高性能的服务发现和配置工具,它可以帮助系统自动发现服务实例,并在服务实例不可用时进行健康检查。

此外,Soa库还允许通过轮询已配置的服务列表来实现本机服务发现。这种方式适用于那些不需要动态服务发现的场景,可以通过定期检查服务列表来确保服务的可用性。

为了实现后台任务的异步处理,本文还将介绍如何使用Hangfire作为服务。Hangfire是一个开源的作业队列,可以轻松地集成到ASP.NET应用程序中,用于后台任务的调度和执行。

通过以上配置,伪原创系统可以实现高效的服务发现和健康监测,确保系统的稳定性和可靠性。

​上篇文章说过,服务发现和健康监测是面向服务体系架构重要的模块,Soa库可以配置使用Consul作为服务发现服务,或者轮询已配置的服务列表作为本机服务发现。

将用Hangfire来作为服务发现与健康监测的定时执行库

具体配置信息请参考Hangfire – Background jobs and workers for .NET and .NET Core

服务发现

配置各个服务的地址列表,或者在服务启动时注册的key-value地址集合,轮询地址服务描述服务(GetRoutesDescAsync),确定服务中方法的路由,方法签名,使用方式,描述(功能,作者)等内容。

本机服务发现(InServer)

本机服务发现将轮询Address配置中的地址所对应的RoutesGetters,执行获取路由信息,并更新SoaServiceRoute中的Address集合

每个微服务都有一个Id 为"Soa.ServiceDiscovery.InServer.GetRoutesDescAsync"的方法

获取该服务的地址,服务描述。

在服务模块初始化中已经将这个服务路由对象添加到RoutesGetters

var service = new SoaServiceRoute { Address = new List<SoaAddress> { addr }, ServiceDescriptor = new SoaServiceDesc { Id = "Soa.ServiceDiscovery.InServer.GetRoutesDescAsync" } };

在主服务(Soa.Sample.Web)中的appsettings.json中,配置如下:

"Discovery": "InServer"

配置服务发现,当前设置的轮询间隔为每分钟执行一次

"InServiceDiscovery": { "Enable": true, "JobCron": "0 * * * * ? " }

各个服务Host的appsettings.json中,只需要配置Discovery即可:

"Discovery": "InServer", Consul

可以使用UseConsulForDiscovery方法配置基于consul的服务发现功能

consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案

首先去consul官网下载二进制文件

Downloads | Consul by HashiCorp

安装直接下载zip包,解压后只有一个可执行的文件consul,将consul添加到系统的环境变量里面。

打开命令行并输入consul.exe agent -dev -bind {你本机的ip地址} 来运行consul服务

​​

在主服务(Soa.Sample.Web)和各个服务Host的appsettings.json中,配置如下:

配置文件中设置Discovery

"Discovery": "Consul",

设置Consul

"ConsulServiceDiscovery": { "Ip": "127.0.0.1", "Port": "8500" }

注意8500为consul所在ip地址

服务运行时将自动注册ip和服务名称到consul的kv中,待客户端调用时,只需要传入key值即可

当服务运行之后,在浏览器地址栏输入127.0.0.1:8500查看已在consul注册的服务

​​

服务监控

在​ServicesManagerController是获取服务列表和服务详情的Api接口控制器

[Route("api/[controller]/[action]")] public class ServicesManagerController:AbpController { private readonly IClientServiceDiscovery clientServiceDiscovery; public ServicesManagerController(IClientServiceDiscovery clientServiceDiscovery) { this.clientServiceDiscovery = clientServiceDiscovery; } [HttpGet] public async Task<List<SoaAddress>> GetAddresses() { var addresses = await clientServiceDiscovery.GetAddressAsync(); return addresses; } [HttpGet] public async Task<List<SoaServiceDesc>> GetServices(string server) { var routes = await clientServiceDiscovery.GetRoutesAsync(); if (routes != null && routes.Any() && !string.IsNullOrEmpty(server)) { return (from route in routes where route.Address.Any(x => x.Code == server) select route.ServiceDescriptor).ToList(); } return (from route in routes select route.ServiceDescriptor).ToList(); } }

运行项目,在swagger中调试请求GetSoaService接口,可以获取所有服务信息

​​

健康监测

健康监测用于确定各服务的健康程度,比如是否运行缓慢,是否链接顺畅等。

用一个简单的监测链接是否超时方式,确定这个服务是否健康。

using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) { SendTimeout = timeout }) { try { await socket.ConnectAsync(server.CreateEndPoint()); server.IsHealth = true; } catch { server.IsHealth = false; } }

在主服务(Soa.Sample.Web)和各个服务Host的appsettings.json中,配置如下:

"HealthCheck": { "Enable": true, "JobCron": "0/5 * * * * ? ", "Timeout": 3000 },

这里健康监测服务的轮询时间是5s,超时时间为3000ms

如何利用Soa库和Abp框架实现微服务项目中的服务发现与健康监控?

运行后关闭一个微服务,若关闭Service2,请求/api/ServicesManager/GetAddresses

可以看到IsHealth变为False

项目地址:

MatoApps/Soa (github.com)