跳至主要內容

2.1 服务注册与发现

linguicheng...大约 4 分钟

简介

服务注册概念及入门教程请前往 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并不会主动删除这些非健康状态的服务。

上次编辑于:
贡献者: linguicheng