Hi,大家好,我叫consul,翻译成中文叫做“领事”,其实我更喜欢叫自己为中介,因为我觉得自己做的事情和房产中介非常像。比如说想要卖房的房东到我这边登记,我将房屋信息登录到我的表格中(服务注册),有买家来咨询时,我再查询表格将符合条件的房子返回给买家(服务发现),平时我也要做点房源的维护工作,比如每隔一天就打电话问下房东:“你的房子还卖么?(服务健康检查)”。

我的诞生也和现在互联网项目的开发模式有关,从之前的三层架构衍化成现在有微服务架构,把原来BLL和DAL层做事按业务拆成独立的分布式服务(其实很多人就是把CURD放到单独的服务中而已),为了高可用&高扩展,又把这些服务(进程)集群化,就出现一堆的地址和端口。客户端由原来的进程内调用变成跨进程或跨网络调用服务,把这些一堆地址和端口放到配置文件中。这样做其实没什么问题,但维护起来比较麻烦,比如说增加一个服务,就要修改配置文件并重启客户端,同理,删掉一个服务也要同样的操作。

我的作用主要是管理这些集群服务的配置,整体流程是这样子的:服务(进程)启动的时候把服务名和自己的IP、端口通过HTTP告诉我,我将这些信息记到自己的内存表格中,客户端调用时带上要查询的服务名通过HTTP发送给我,我再自己的内存表中找到叫这服务名的所有配置发送给客户端。

平时我还要做一些服务健康检查的事儿,在上面服务启动的时候,服务还要给我配置一个检查接口和检查频率等一些参数,我会按这些参数每隔一段时间,比如10秒钟去请求一下这个接口,如果不通,我就隔5秒再重试下,如果重试3次还不通,我就认定这个服务挂掉了,就从内存表格中删掉这个服务配置,不然客户端要请求到这个不通服务,我就罪过了。

说了这么多,还是看下我的整个流程图吧,一图胜千言:

最后,再用代码实现下吧,语言是C#,其实语言类似,反正都有现成的sdk。

1、VS中建个控制台应用,并通过nuget安装consul包

2、注册几个服务

static void Main(string[] args)
{string serviceName = "OrderService";// 注册服务RegisteService(serviceName, new DnsEndPoint("127.0.0.1", 16005));RegisteService(serviceName, new DnsEndPoint("127.0.0.1", 16007));RegisteService(serviceName, new DnsEndPoint("127.0.0.1", 16008));Console.ReadKey();
}
static bool RegisteService(string serviceName, DnsEndPoint dnsEndPoint)
{var serviceId = GenServiceId(serviceName, dnsEndPoint);var checkId = GenCheckId(serviceName, dnsEndPoint);var checkName = GenCheckName(serviceName, dnsEndPoint);var check = new AgentCheckRegistration{ID = checkId,Name = checkName,TCP = $"{dnsEndPoint.Host}:{dnsEndPoint.Port}",Interval = TimeSpan.FromSeconds(10),Status = HealthStatus.Passing,DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(20),};var service = new AgentServiceRegistration{ID = serviceId,Name = serviceName,Address = dnsEndPoint.Host,Port = dnsEndPoint.Port,Check = check};var _client = new ConsulClient(config =>{var uriBuilder = new UriBuilder("http://localhost:8500");config.Address = uriBuilder.Uri;});var res = _client.Agent.ServiceRegister(service).Result;if (res.StatusCode != HttpStatusCode.OK)return false;return true;
}

3、服务发现

static void Main(string[] args)
{string serviceName = "OrderService";// 服务发现List<string> targets = FindServiceEndpoints(serviceName);foreach (var item in targets){Console.WriteLine(item);}Console.ReadKey();
}
static List<string> FindServiceEndpoints(string serviceName)
{var _client = new ConsulClient(config =>{var uriBuilder = new UriBuilder("http://localhost:8500");config.Address = uriBuilder.Uri;});var targets = new List<string>();try{var r = _client.Health.Service(serviceName, "", true).Result;if (r.StatusCode != HttpStatusCode.OK)throw new ApplicationException($"query consul server error");targets = r.Response.Select(x => $"{x.Service.Address}:{x.Service.Port}").ToList();}catch { }return targets;
}

PS:不要忘了把consul也做成集群~~

五分钟了解Consul相关推荐

  1. 五分钟搭建一个基于BERT的NER模型

    BERT 简介 BERT是2018年google 提出来的预训练的语言模型,并且它打破很多NLP领域的任务记录,其提出在nlp的领域具有重要意义.预训练的(pre-train)的语言模型通过无监督的学 ...

  2. B 站神曲damedane:精髓在于换脸,五分钟就能学会

    导读:AI 换脸技术层出不穷,但一代更比一代强.最近,一个发表在 NeurIPs 2019 的 AI 换脸模型 first order motion model 火了起来,其表情迁移效果胜过同领域其它 ...

  3. 五分钟搭建BERT服务,实现1000+QPS​,这个Service-Streamer做到了

    作者 | 刘欣 简介:刘欣,Meteorix,毕业于华中科技大学,前网易游戏技术总监,现任香侬科技算法架构负责人.之前专注游戏引擎工具架构和自动化领域,2018年在GDC和GoogleIO开源Airt ...

  4. matlab批量储存变量_科协五分钟|用Matlab工具包处理音频信号

    科协近期大事汇总 1. 9月28日晚,硬件人才计划顺利验收. 2. 9月28日下午,仪器设计大赛综合组交流. 3. 五系联合实验室参观筹办中,预计第六第七周举办 4. 仪器设计大赛新生组开发稳步进行. ...

  5. 启程 - 《每日五分钟搞定大数据》

    <每日五分钟搞定大数据>原创系列,每周不定期更新.欢迎关注公众号:大叔据   想了很久,准备开始写一系列的文章,记录这些年来的所得所想,感觉内容比较多不知从哪里开始,画了个思维导图确定了大 ...

  6. 五分钟DBA:浅谈伪分布式数据库架构

    [IT168 技术]12月25日消息,2010互联网行业技术研讨峰会今日在上海华东理工大学召开.本次峰会以"互联网行业应用最佳实践"为主题,定位于互联网架构设计.应用开发.应用运维 ...

  7. 五分钟内搭建的混沌电路

    简 介: 针对一种简单的混沌电路进行测试,没有能够复现电路的工作状态.具体原因尚未清楚. 关键词: 混沌电路,相移单管电路 #mermaid-svg-QPl6WYe8NnE6m9yt .label{f ...

  8. 五分钟示范“教会”演员说外语,还可无缝切换语种,这家AI配音公司刚获2000万美元A轮融资...

    行早 发自 凹非寺 量子位 | 公众号 QbitAI 只需要演员五分钟的声音素材,就可以让他在电影里说另外一种语言? 在没看到这段视频之前我是不相信的,来听听这段效果如何: 这段视频取自<博多之 ...

  9. 算法:五分钟了解一致性hash算法

    五分钟了解一致性hash算法 前言 一致性哈希算法的设计目标是为了解决因特网中的热点问题,现在也被广泛应用在分布式系统中. 比如针对负载均衡问题,对hash值取模的算法扩展性差,当增加或者减少服务器时 ...

最新文章

  1. java rect平移_如何在Java Swing中使用鼠标平移图像
  2. substring 在C#,Javascript,SQL 中index开始值
  3. TPLinker 联合抽取 实体链接方式+源码分析
  4. [转] Centos 6.4 python 2.6 升级到 2.7
  5. iStack与CSS配置实例
  6. 数据分析告诉你,韦小宝跟他七个老婆哪个最亲?
  7. k3 审核流程图_金蝶K3操作流程图详解
  8. Amesim更改为中文
  9. 云计算机怎么给学生机安装软件,如何在云计算机服务器中安装学生机应用程序? 在云计算机服务器中安装学生机应用程序的方法?...
  10. 如何获取节假日的方法
  11. PPT母版和PPT模板
  12. 数据库:order by排序语句的用法
  13. 3D 打印没那么玄乎
  14. 那些10万变百万的矿工,都是从选对挖矿币种开始的!
  15. Dubbo Cloud Native 实践与思考 1
  16. 计算机专业必读的经典书籍
  17. 批量识别图片大致不相同图片_电脑图片太多,其中不少是重复的,有无什么软件可以识别相同图片!...
  18. 深度剖析CMOS、FinFET、SOI和GaN工艺技术
  19. IDEA的Project与Structure依赖jar包的方式
  20. 企业喜欢用容易被记住的电话号码(树解法)

热门文章

  1. (笔记)堆和栈的区别-两种不同的数据结构
  2. oracle基于时间恢复整个数据库
  3. mysql 删除5天前 备份_mysql自动备份删除5天前的备份
  4. 什么是“ rpcsvchost”,以及为什么它在Mac上运行?
  5. 下载spotify音乐_如何在Spotify上播放更高质量的音乐
  6. pidgin qq_Pidgin入门指南,通用消息客户端
  7. js时间戳转成日期格式
  8. 打造自己的装机U盘(二)
  9. [ JS 进阶 ] Repaint 、Reflow 的基本认识和优化 (2)
  10. 丢失日志文件的风险与对策