将用Hangfire来作为服务发现与健康监测的定时执行库
具体配置信息请参考
服务发现配置各个服务的地址列表,或者在服务启动时注册的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官网下载二进制文件
安装直接下载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
运行后关闭一个微服务,若关闭Service2,请求/api/ServicesManager/GetAddresses
可以看到IsHealth变为False
项目地址: