内容简介:Hi,大家好,我叫consul,翻译成中文叫做“领事”,其实我更喜欢叫自己为中介,因为我觉得自己做的事情和房产中介非常像。比如说想要卖房的房东到我这边登记,我将房屋信息登录到我的表格中(服务注册),有买家来咨询时,我再查询表格将符合条件的房子返回给买家(服务发现),平时我也要做点房源的维护工作,比如每隔一天就打电话问下房东:“你的房子还卖么?(服务健康检查)”。我的诞生也和现在互联网项目的开发模式有关,从之前的三层架构衍化成现在有微服务架构,把原来BLL和DAL层做事按业务拆成独立的分布式服务(其实很多人就
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也做成集群~~
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 你了解HTTPS,但你可能不了解X.509
- 你真的了解Mybatis的${}和#{}吗?是否了解应用场景?
- 你所了解的 array_diff_uassoc 真的是你了解的那样吗?
- 图文了解 Kubernetes
- 深入了解 JSONP
- 一文了解 Kubernetes
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Ajax Design Patterns
Michael Mahemoff / O'Reilly Media / 2006-06-29 / USD 44.99
Ajax, or Asynchronous JavaScript and XML, exploded onto the scene in the spring of 2005 and remains the hottest story among web developers. With its rich combination of technologies, Ajax provides a s......一起来看看 《Ajax Design Patterns》 这本书的介绍吧!