​上篇文章说过,服务发现和健康监测是面向服务体系架构重要的模块,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

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

可以看到IsHealth变为False

项目地址:

MatoApps/Soa (github.com)

[.Net]使用Soa库+Abp搭建微服务项目框架(五):服务发现和健康监测的更多相关文章

  1. 服务发现与健康监测框架Consul-DNS转发的应用

    关于Consul Consul是一个提供服务注册与发现,健康监测,Key/Value存储以及多数据中心存储的分布式框架.官网地址是https://www.consul.io/,公司初步应用后我们老大觉 ...

  2. Github+yeoman+gulp-angular初始化搭建angularjs前端项目框架

    在上篇文章里面我们说到了Github账号的申请与配置 那么当你有了Github账号并创建了一个自己的Github项目之后,首要的当然是搭建自己的项目框架啦! 本人对自己的定位是web前端狗,常用开发框 ...

  3. 美团分布式服务通信框架及服务治理系统OCTO

     一.什么是OCTO 定义: OCTO是美团的分布式服务通信框架及服务治理系统,属于公司级基础设施,目前尚未开源. 目标: 为公司所有业务提供统一的服务通信框架,使业务具备良好的服务运营能力,轻松实现 ...

  4. SpringCloud:搭建微服务项目框架 microservicecloud

    1.搭建整体父工程 microservicecloud 新建父工程microservicecloud,切记是Packageing是pom模式 主要是定义POM文件,将后续各个子模块公用的jar包等统一 ...

  5. iOS 从零到一搭建组件化项目框架

    随着公司业务需求的不断迭代发展,工程的代码量和业务逻辑也越来越多,原始的开发模式和架构已经无法满足我们的业务发展速度了,这时我们就需要将原始项目进行一次重构大手术了.这时我们应该很清晰这次手术的动刀口 ...

  6. 基于mpvue搭建小程序项目框架

    简介: mpvue框架对于从没有接触过小程序又要尝试小程序开发的人员来说,无疑是目前最好的选择.mpvue从底层支持 Vue.js 语法和构建工具体系,同时再结合相关UI组件库,便可以高效的实现小程序 ...

  7. Cocoapods组件化之搭建组件化项目框架

    一,概述 随着公司业务需求的不断迭代发展,工程的代码量和业务逻辑也越来越多,原始的开发模式和架构已经无法满足我们的业务发展速度了,这时我们就需要将原始项目进行一次重构大手术了.这时我们应该很清晰这次手 ...

  8. Consul-template的简单应用:配置中心,服务发现与健康监测

    简介 Consul-template是Consul的一个方扩展工具,通过监听Consul中的数据可以动态修改一些配置文件,大家比较热衷于应用在Nginx,HAProxy上动态配置健康状态下的客户端反向 ...

  9. Django-0-环境搭建、创建项目、启动服务

    1- 创建虚拟环境名称(在虚拟机中) mkvirtualenv -p /usr/bin/python3 envname   (/usr/bin/python3 - 你自己在虚拟机中的Python解释器 ...

  10. 简单搭建iOS开发项目框架

    今天我们来谈谈如何搭建框架,框架需要做一些什么. 第一步:找到我们的目标我们的目标是让其他开发人员拿到手后即可写页面,不再需要考虑其他的问题. 第二步:我们需要做哪些东西各位跟着我一步一步来进行. 假 ...

随机推荐

  1. VUE3子表格嵌套分页查询互相干扰的问题解决

    VUE3在表格中嵌套子表格子表格的分页查询互相干扰的问题解决 简单嵌套 如果不需要做子表格的分页查询,那么可以直接在主表格中嵌套子表格,有两种方式:一种是主表格加载的同时加载子表格数据,另一种是点击展 ...

  2. 取代传统BIOS的EFI和UEFI究竟是什么?

    传统的蓝白BIOS界面可以说是陪伴着很多玩家共同成长,不过在英特尔发布Sandy Bridge架构处理器的时候,传统BIOS也到了和我们说再见的时间,采用图形化界面的EFI以及UEFI很快就取代了传统 ...

  3. Docker从认识到实践再到底层原理(二-3)|LXC容器

    前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...

  4. 手撕Udp套接字|实现群聊通信|实现Windows & Linux通信交互

    ​ 专栏和Git地址 操作系统https://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482UdpSocke ...

  5. 每日一道Java面试题:说一说Java中的异常

    写在开头 任何一个程序都无法保证100%的正常运行,程序发生故障的场景,我们称之为:异常,在Java中对于异常的处理有一套完善的体系,今天我们就来一起学习一下. 老样子,用一段简单的代码开始今天的学习 ...

  6. ElasticSearch7.3学习(三十四)----生产环境集群部署总结

    1.集群部署 2.结点的三个角色 主结点:master节点主要用于集群的管理及索引 比如新增结点.分片分配.索引的新增和删除等. 数据结点:data 节点上保存了数据分片,它负责索引和搜索操作. 客户 ...

  7. JS 页面离开事件 页面关闭事件,实现登录成功返回上个页面

    壹 ❀ 引 登录成功后跳转到上一个页面是很常见的需求,比如在天猫添加购物车时网站会效验用户登录情况,若未登录则跳转登录,登录成功返回到先前的商品页. 这个功能实现并不困难,但因为我的奇思妙想让我先后了 ...

  8. NC24961 Hotel

    题目链接 题目 题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and ...

  9. Java集合框架学习(十一) Hashtable详解

    Hashtable介绍 1. 继承自Dictionary; 2. 线程安全: 3. 支持Iterator和Enumeration: 4. key和value都不可为null; 5. 一般用于多线程环境 ...

  10. C++ 多线程的错误和如何避免(5)

    要记得对加锁的临界区解锁 前提:在多个线程共享一块资源或者数据时,我们需要加上互斥锁来保护临界区(否则出现数据未定义的行为) 问题:我们往往在写了很多代码之后忘记 unlock 互斥锁,那么等待该资源 ...