AgileConfig 1.6.0 发布 - 支持服务注册与发现

大家好,好久没有输出博文了,一是因为比较忙,另外一个原因是最近主要的精力是在给 AgileConfig 添加一个新的功能:服务注册与发现。
先说说为什么会添加这个功能。我自己的项目是用 Consul 来做为服务注册发现组件的。自从我上线了 AgileConfig 做为配置中心后,我就很少去 Consul 观察服务的在线状态了,因为 AgileConfig 客户端列表已经在一定程度上能代表服务的状态了。服务注册发现与配置中心其实本质上都是解决了一类问题,那就是配置的动态化,所以大家会看到业界著名的组件很多都是同时实现这2个功能的,如 Consul,Nacos 等。所以我想干脆把这个功能给加上吧,这样可以省去部署一个组件。
当然也有同学说我不务正业,不去好好搞配置中心去搞什么服务注册发现。但是我还是做了。。。不过大家放心 AgileConfig 的主业还是在配置中心上,服务注册发现只是附赠的小菜,可以用也可以不用,决定权完全在你。在实现上我也是对两个功能是完全解耦的。也就是说这2个功能都是互不影响独立运行的。唯一有交集的一个地方是,如果配置中心的客户端的 websocket 通道建立成功的时候,服务的心跳会借用这个通道。
✨✨✨Github地址:https://github.com/dotnetcore/AgileConfig  开源不易,欢迎star✨✨✨

什么是服务注册与发现

首先先让我们回顾下服务注册发现的概念。
在实施微服务之后,我们的调用都变成了服务间的调用。服务间调用需要知道IP、端口等信息。在没有微服务之前,我们的调用信息一般都是写死在调用方的配置文件里(当然这话不绝对,有些公司会把这些信息写到数据库等公共的地方,以方便维护)。又由于业务的复杂,每个服务可能依赖N个其他服务,如果某个服务的IP,端口等信息发生变更,那么所有依赖该服务的服务的配置文件都要去修改,这样显然太麻烦了。有些服务为了负载是有个多个实例的,而且可能是随时会调整实例的数量。如果每次调整实例数量都要去修改其他服务的配置并重启那太麻烦了。为了解决这个问题,业界就有了服务注册发现组件。假设我们有服务A需要调用服务B,并且有服务注册发现组件R。整个大致流程将变成大概3步:
服务B启动向服务R注册自己的信息 服务A从服务R拉取服务B的信息 服务A调用服务B 有了服务注册发现组件之后,当修改A服务信息的时候再也不用去修改其他相关服务了。

a3a8d0961b2c9cb6a800f4479c732e0c.png

参考我的另外一篇:.Net Core with 微服务 - Consul 注册中心

使用服务注册与发现

使用服务注册与发现功能需要更新服务端与客户端至 1.6.0 及以上版本。

启动服务端

服务端更新至 latest 镜像或 v-1.6.0 以上的镜像。
使用 docker 运行服务端实例:

sudo docker run \
--name agile_config \
-e TZ=Asia/Shanghai \
-e adminConsole=true \
-e db:provider=sqlite \
-e db:conn="Data Source=agile_config.db" \
-p 5000:5000 \
#-v /your_host_dir:/app/db \
-d kklldog/agile_config:latest

基本的使用没有太大的变化,只是在界面上添加了服务的相关管理界面,这里不再赘述。
相关教程: .Net Core & Agile Config配置中心

使用客户端

客户端需要从 nuget 上安装 1.6.0 版本以上的 client 包。

Install-Package AgileConfig.Client -Version 1.6.0

新版的 client 简化了使用方式,以下以 .net6 为示例:
调用 UseAgileConfig 扩展方法即可注入 AgileConfig client .

var builder = WebApplication.CreateBuilder(args);//use agileconfig client
builder.Host.UseAgileConfig();...

在 appsettings.json 添加配置信息:

"AgileConfig": {"appId": "test_app","secret": "test_app","nodes": "http://agileconfig_server.xbaby.xyz/","name": "client123","tag": "tag123","serviceRegister": { //服务注册信息,如果不配置该节点,则不会启动任何跟服务注册相关的服务 可选"serviceId": "net6", //服务id,全局唯一,用来唯一标示某个服务"serviceName": "net6MVC服务测试", //服务名,可以重复,某个服务多实例部署的时候这个serviceName就可以重复"ip": "127.0.0.1", //服务的ip 可选"port": 5005, //服务的端口 可选}

其中 appId , secret 等配置同原来配置中心的使用方式没有任何改变。
serviceRegister 节点描述的是服务注册信息(如果删除这个节点那么服务注册功能就不会启动):

  • serviceId
    服务id,全局唯一,用来唯一标示某个服务

  • serviceName
    服务名,可以重复,某个服务多实例部署的时候这个serviceName就可以重复

  • ip
    服务的ip 可选

  • port
    服务的端口 可选

  • metaData
    一个字符串数组,可以携带一些服务的相关信息,如版本等 可选

  • alarmUrl
    告警地址 可选。
    如果某个服务出现异常情况,如一段时间内没有心跳,那么服务端会往这个地址 POST 一个请求并且携带服务相关信息,用户可以自己去实现提醒功能,比如发短信,发邮件等:

{"serviceId":"0001","serviceName":"xxxx","time":"2022-01-01T12:00:000","status":"Unhealty","message": "服务不健康"
}
  • heartbeat:mode
    指定心跳的模式,server/client 。server代表服务端主动检测,client代表客户端主动上报。不填默认client模式 可选

  • heartbeat:interval
    心跳的间隔,默认时间30s 可选

  • heartbeat:url
    心跳模式为 server 的时候需要填写健康检测地址,如果是httpstatus为200段则判定存活,其它都视为失败 可选

服务的注册

当配置好客户端后,启动对应的应用程序,服务信息会自动注册到服务端并且开始心跳。如果服务正确注册到服务端,控制台的服务管理界面可以查看:

186e56e2542ec3b3b04835844c3dbeb1.png

服务发现

现在服务已经注册上去了,那么怎么才能拿到注册中心所有的服务呢?同样非常简单,在程序内只要注入IDiscoveryService 接口就可以通过它拿到所有的注册的服务。

public interface IDiscoveryService{string DataVersion { get; }List<ServiceInfo> UnHealthyServices { get; }List<ServiceInfo> HealthyServices { get; }List<ServiceInfo> Services { get; }Task RefreshAsync();}

除了接口内置的方法,还有几个扩展方法方便用户使用,比如随机一个服务:

public static class DiscoveryServiceExtension{public static IEnumerable<ServiceInfo> GetByServiceName(this IDiscoveryService ds, string serviceName){return ds.Services.GetByServiceName(serviceName);}public static ServiceInfo GetByServiceId(this IDiscoveryService ds, string serviceId){return ds.Services.GetByServiceId(serviceId);}public static ServiceInfo RandomOne(this IDiscoveryService ds, string serviceName){return ds.Services.RandomOne(serviceName);}}

至此服务的注册与发现就已经完成了。

一些重要的信息

以上就是服务注册发现的简单使用,但是还有一些比较重要的信息希望大家在使用之前能够了解,这样有利于更好的使用以及出现问题的时候定位问题。

高可用

同 AgileConfig 的配置中心功能一样,服务注册后最后都是写到了数据库里。AgileConfig 的服务端可以部署多个来防止单点故障,同时可以分担压力。所以高可用的最佳实践就是部署 2 个以上的服务端节点,然后数据库做高可用方案。这样足够应付大多数要求不是特别高的场景。

强一致性

同上 AgileConfig 通过数据库保证多个节点部署的时候的一致性问题。

服务的健康检测

服务的健康检测一般有2种方案:

  1. 服务端主动询问

  2. 客户端主动心跳
    AgileConfig 同时支持以上2个方案。AgileConfig client 默认实现了主动心跳。AgileConfig client 的主动心跳有2个渠道:

  • websockt
    长连接,如果AgileConfig client做为配置中心客户端是正常工作的,那么心跳会走websocket通道

  • http
    如果 websocket 不可用,那么会直接发起 http 请求做为心跳。
    但是对于一些应用主动的心跳并不能代表服务真的是可以用的,因为心跳从服务已启动就会开始,但是某些接口可能还没真正的做好准备被调用。那么这个时候就可以选择服务端主动询问(heartbeat:mode=server)对应的检测接口来确定服务是否真的可用。
    AgileConfig 其实还实现了第三种方式:

  1. 不检测
    如果一个服务你确定它会永远在线,或者是没办法集成 AgileConfig client 的 sdk ,那么你可以标记它为不检测,这样它会一直是健康状态。

服务发现是如何即时更新的

我们的 client 在启动后会拉取一次全量的服务列表。但是服务是会不断的上线,下线的,所以服务状态的更新是需要通知客户端的,然后客户端去拉取新的服务列表。AgileConfig 同样有2个策略来保证服务列表的即时刷新:

  1. 当服务状态变化的时候,服务端通过 websocket 即时通知所有的 client 主动刷新配置列表

  2. 如果服务端的主动通知由于网络等原因失效的时候,client 会在每次心跳的时候比较本地服务列表 md5 版本跟服务端的列表的 md5 信息,如果不一致,那么 client 会主动拉取一次新的服务列表。

关闭服务注册与发现

删除 serviceRegister 配置节点或不要配置任何信息。

最后

✨✨✨Github地址:https://github.com/dotnetcore/AgileConfig  开源不易,欢迎star✨✨✨

演示地址:http://agileconfig_server.xbaby.xyz/  超级管理员账号:admin 密码:123456

关注我的公众号一起玩转技术


04f9c1023a0dbf2c1bcc1016703cc983.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快速排序算法_Python实现快速排序算法

排序是算法的入门知识&#xff0c;应用广泛&#xff0c;且在程序员面试中&#xff0c;经常被提及&#xff0c;其中最常考的两大排序算法为快速排序与归并排序&#xff0c;本篇将使用Python语言来分析了解快速排序算法。思想 快速排序是一种非常高效的排序算法&#xff0c;采用 …

用户反馈KB3189866累积更新出现卡在95%进度情况

伴随着本月的补丁星期二活动&#xff0c;微软面向Windows 10推出了三款累积更新。和以往相同&#xff0c;部分用户反馈称无法安装本次更新并导致出现各种问题。很多读者反馈称KB3189866累积更新会在45%或95%的时候卡住不动&#xff0c;无法执行和完成安装。 在尝试过几种临时解…

UVa1607 poj1435 UVaLive1686 Gates

填坑系列(p.246) 由函数连续性得满足二分性 1 #include<cstdio>2 #include<cstring>3 #include<cstdlib>4 #include<algorithm>5 #include<iostream>6 7 using namespace std;8 9 void setIO(const string& s) { 10 freopen((s ".…

c语言入门数组,C语言入门之数组(2)

二维数组前面介绍的数组只有一个下标&#xff0c;称为一维数组&#xff0c; 其数组元素也称为单下标变量。在实际问题中有很多量是二维的或多维的&#xff0c; 因此C语言允许构造多维数组。多维数组元素有多个下标&#xff0c; 以标识它在数组中的位置&#xff0c;所以也称为多…

IOS开发--TextField

2019独角兽企业重金招聘Python工程师标准>>> //初始化text field的位置和大小UITextField *text [[UITextField alloc] initWithFrame:CGRectMake(20, 20, 130, 130)];//设置边框样式//样式有很多种&#xff0c;点进去查看text.borderStyle UITextBorderStyleRoun…

IOS之学习笔记十五(协议和委托的使用)

1、协议和委托的使用 1)、协议可以看下我的这篇博客 IOS之学习笔记十四(协议的定义和实现) https://blog.csdn.net/u011068702/article/details/80963731 2)、委托可以叫代理&#xff0c;实现协议的类的对象可以叫委托对象或者代理对象 3)、关键就是我们在控制器里类(获取数…

Dapr 源码解析 系列文章汇总

Dapr背后的架构模式是符合未来架构趋势&#xff08;多运行时架构&#xff09;和云原生发展趋势的。知乎 iyacontrol 对 Dapr的意义有一个很好的概括&#xff1a;对于小公司&#xff0c;甚至没有基础架构和中间件团队的公司&#xff0c;Dapr 提供了开箱即用的基础设施功能&#…

cstring判断包含字符串_Python字符串方法之-解决判断问题

19、endswith()描述&#xff1a;判断字符串是否以指定字符或子字符串结尾。语法&#xff1a;str.endswith("suffix", start, end) 或str[start,end].endswith("suffix") 用于判断字符串中某段字符串是否以指定字符或子字符串结尾。—> bool 返回值为布尔…

Angular变化检测机制

2019独角兽企业重金招聘Python工程师标准>>> 在使用Angular进行开发中&#xff0c;我们常用到Angular中的绑定——模型到视图的输入绑定、视图到模型的输出绑定以及视图与模型的双向绑定。而这些绑定的值之所以能在视图与模型之间保持同步&#xff0c;正是得益于Ang…

nx二次开发c语言,NX二次开发-UFUN API函数编程基础

1.NXOpen C 的函数函数名称的约定NX Open C 共有2类名称约定&#xff1a;一个是标准的NX Open C 的函数名称约定&#xff1b;另一个是以前版本的原有的名称约定。1.标准名称约定【格式】UF__【说明】(1)UF:User Funciton的简写&#xff0c;表示该函数为NX Open C 函数。(2)&…

JMeter压力测试入门教程[图文]

Apache JMeter是Apache组 织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试但后来扩展到其他测试领域。 它可以用于测试静态和动态资源例如静态文件、Java小服务程序、CGI脚本、Java 对象、数据库&#xff0c; FTP服务器, 等等。…

.NET6之MiniAPI(二十九):UnitTest

MiniAPI的单元测试与asp.net web api的单元测试大体是相同的&#xff08;毕竟都是asp.net core&#xff09;&#xff0c;只是在小细节上有一些差异&#xff0c;文章中会说到这点。本文测试框架是XUnit&#xff0c;Mock框架是Moq&#xff0c;关于这两个框架和库的学习&#xff0…

vue data数据修改_Vue 超清晰思维导图(7张),详细知识点梳理!

Vue思维导图目录MVC与MVVM的区别Vue基本代码结构Vue指令Vue组件class和style动态绑定computed计算属性EventBusfilter过滤器方法Vue是一套构建用户界面的框架&#xff0c;只关注视图层&#xff0c;它不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。&#xff08;Vue有…

界面连接数据库

1、获取本机的SQL Server服务器名 private void Form2_Load(object sender, EventArgs e){listBox1.Items.Clear();SQLDMO.Application SQLServer = new SQLDMO.Application();SQLDMO.NameList strServer = SQLServer.ListAvailableSQLServers();if (strServer.Count > 0){f…

Xamarin效果第二十篇之GIS中加载三维白模

在前面文章中简单玩了玩GIS的基本操作、Mark相关、AR和测距,今天再次分享一下N年前就像玩耍的效果;啥也不说了都在效果里:再来看看手机端的效果:1、关于效果我也是偶然见看到了别人实现:https://blog.csdn.net/arcgis_all/article/details/769991042、关于实现就是在三维场景图…

visa虚拟卡生成器_虚拟卡有哪些功能?赶紧了解一下

现在很多人都会有机会出国&#xff0c;或者是直接在国外生活&#xff0c;他们时不时的会到国内办理一些事情&#xff0c;而这个时候为了确保信用卡在使用的时候安全&#xff0c;有些人就会申请使用虚拟信用卡&#xff0c;这样不但可以解决跨国支付的麻烦&#xff0c;从而确保在…

android编程绘图,Android编程绘图操作之弧形绘制方法示例

本文实例讲述了Android编程绘图操作之弧形绘制方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;/*** 绘制弧形图案* description&#xff1a;* author ldm* date 2016-4-25 下午4:37:01*/public class ArcsActivity extends Activity {Overrideprotected void onCr…

BeetleX实现MessagePack和Protobuf消息控制器调用websocket服务详解

最近有用户问如何使用BeetleX封装一个基于Protobuf格式的websocket服务并支持控制器调用&#xff1b;其实BeetleX.FastHttpApi是支持Websocket服务和自定义数据格式的&#xff0c;但需要对组件有一定了解的情况才能进行扩展&#xff1b;接下来通过封装一个支持Protobuf和Messag…

vue 获取url地址的参数_2020年 vue常见面试问题总结(干货)!

1.什么是mvvm模式&#xff0c;谈谈你的理解&#xff1f; MVVM - Model View ViewModel&#xff0c;数据&#xff0c;视图&#xff0c;视图模型view 可以通过 事件绑定 的方式影响 model&#xff0c;model 可以通过 数据绑定 的形式影响到view&#xff0c;viewModel是把 model 和…

CSS 定位之绝对与相对

static,relative,absolute,fixed含义 static(静态定位):元素框正常生成。块级元素生成一个矩形框&#xff0c;作为文档流的的一部分&#xff0c;行内元素则会常见一个或多个行框&#xff0c;至于其父元素中。默认值。没有定位&#xff0c;元素出现在正常的流中&#xff08;忽略…