2.1 服务注册与发现
简介
服务注册概念及入门教程请前往 1.2 章节
服务发现概念及入门教程请前往 1.4 章节
为什么要使用服务注册与发现?
屏蔽、解耦服务之间相互依赖的细节
我们知道服务之间的远程调用必须要知道对方的IP、端口信息。我们可以在调用方直接配置被调用方的IP、端口,这种调用方直接依赖IP、端口的方式存在明显的问题,如被调用的IP、端口变化后,调用方法也要同步修改。通过服务发现,将服务之间IP与端口的依赖转化为服务名的依赖,服务名可以根据具微服务业务来做标识,因此,屏蔽、解耦服务之间的依赖细节是服务发现与注册解决的第一个问题。
对服务进行动态管理
在微服务架构中,服务众多,服务之间的相互依赖也错综复杂,无论是服务主动停止,意外挂掉,还是因为流量增加对服务实现进行扩容,这些服务数据或状态上的动态变化,都需要尽快的通知到被调用方,被调用方再采取相应的措施。因此,对于服务注册与发现要实时管理着服务的数据与状态,包括服务的注册上线、服务主动下线,异常服务的剔除。
服务发现将服务IP、端口等细节通过一个服务名抽象给调用者,并动态管理着各个微服务的状态检测、状态更新,服务上线,下线等,这些都是微服务治理的基础,包括负载均衡,链路跟踪。
注册中心配置
Consul:Url服务注册中心地址
Consul:Interval服务注册信息定时同步刷新到本地的时间间隔,单位:秒,小于等于0时将实时获取
Consul:DataCenter数据中心
配置示例
{
"Consul": {
"Url": "http://localhost:8500",
//定时同步数据时间间隔,单位:秒 小于等于0表示立即响应
"Interval": 10,
//数据中心
"DataCenter": "dc1"
}
}
服务信息配置
Consul:Service:Option服务类别,Http表示http服务,Grpc表示grpc服务
Consul:Service:HealthCheck:Url健康检查地址,http服务框架默认生成一个/health接口,grpc服务需自行按标准生成健康检查接口,参考示例 1.4,http默认:{Scheme}://{Host}:{Port}/health,grpc默认:{Host}:{Port}
Consul:Service:HealthCheck:Timeout健康检查超时时间间隔,单位:秒,默认:10
Consul:Service:HealthCheck:Interval健康检查时间间隔,单位:秒,默认:10
Consul:Service:Name服务名称,如果名称相同,将判定为同一个服务的不同节点
Consul:Service:Host服务IP或域名
Consul:Service:Port服务端口
Consul:Service:LoadBalancer:Option负载均衡算法,RoundRobin表示轮询,WeightRoundRobin表示加权轮询,LeastConnection表示最小连接数,ConsistentHash表示一致性哈希
Consul:Service:LoadBalancer:Weight加权轮询权重
Consul:Service:Schemehttp或https
Consul:Service:Developer开发者
配置示例
{
"Consul": {
"Url": "http://localhost:8500",
"Service": {
//Http Grpc
"Option": "Grpc",
"HealthCheck": {
"Url": "localhost:2110",
//单位:秒
"Timeout": 10,
//单位:秒
"Interval": 10
},
"Name": "Wing.Demo_2.1",
"Host": "localhost",
"Port": 2110,
"Tag": "",
"LoadBalancer": {
//RoundRobin WeightRoundRobin LeastConnection ConsistentHash
"Option": "WeightRoundRobin",
//权重
"Weight": 4
},
"Scheme": "http",
"Developer": "linguicheng"
},
//定时同步数据时间间隔,单位:秒 小于等于0表示立即响应
"Interval": 10,
//数据中心
"DataCenter": "dc1",
//等待时间,单位:分钟
"WaitTime": 3
}
}
服务调用
注入服务接口IServiceFactory,异步调用方法InvokeAsync,同步调用方法Invoke,实参传服务名称,回调函数可以获取服务实际地址,调用示例参照 1.4 章节
[HttpGet("hello")]
public Task<string> SayHello()
{
return _serviceFactory.InvokeAsync("Wing.Demo_1.4", async serviceAddr =>
{
var channel = GrpcChannel.ForAddress(serviceAddr.ToString());
var greeterClient = new Greeter.GreeterClient(channel);
var result = await greeterClient.SayHelloAsync(new HelloRequest { Name = "Wing" });
return result.Message;
});
}
服务状态
请注意Wing的服务状态有4种,分别是健康、警告、死亡、维护,服务状态更新的频率是根据你设置的健康检查的时间间隔。而服务调用只会查找健康状态的服务,Wing并不会主动删除这些非健康状态的服务。
