五分钟了解Consul

栏目: IT技术 · 发布时间: 4年前

内容简介:Hi,大家好,我叫consul,翻译成中文叫做“领事”,其实我更喜欢叫自己为中介,因为我觉得自己做的事情和房产中介非常像。比如说想要卖房的房东到我这边登记,我将房屋信息登录到我的表格中(服务注册),有买家来咨询时,我再查询表格将符合条件的房子返回给买家(服务发现),平时我也要做点房源的维护工作,比如每隔一天就打电话问下房东:“你的房子还卖么?(服务健康检查)”。我的诞生也和现在互联网项目的开发模式有关,从之前的三层架构衍化成现在有微服务架构,把原来BLL和DAL层做事按业务拆成独立的分布式服务(其实很多人就

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

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

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

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

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

五分钟了解Consul

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

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

五分钟了解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;

}

五分钟了解Consul

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也做成集群~~


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

疯传:让你的产品、思想、行为像病毒一样入侵(全新修订版)

疯传:让你的产品、思想、行为像病毒一样入侵(全新修订版)

[美] 乔纳•伯杰(Jonah Berger) / 乔迪、王晋 / 电子工业出版社 / 2016-6 / 68.00

是什么让事物变得流行? 从买轿车、买衣服、吃三明治,到给孩子取名字,你是否知道为什么某些产品会大卖,某些故事被人们口口相传,某些电子邮件更易被转发,或者某些视频链接被疯狂地点击,某些谣言更具传播力,某些思想和行为像病毒一样入侵你的大脑……这本书将为你揭示这些口口相传和社会传播背后的科学秘密,并且告诉你如何将产品、思想、行为设计成具有感染力和传播力的内容。 无论你是大公司的管理者,还是努......一起来看看 《疯传:让你的产品、思想、行为像病毒一样入侵(全新修订版)》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具