gRPC之Consul注册中心

142 阅读2分钟

跟孙哥学java

孙哥主页

服务注册的本质

Consul服务注册的本质是服务发现以及服务注册。当服务Producer启动时,会将自己的IP/host等信息通过发送请求告知Consul,Consul接收到Producer的注册信息后,每个10s(默认)会向Producer发送一个健康检查的请求,检验Producer是否监控。服务调用当Consumer请求Producer时,会先从Consul中拿到Producer服务的IP和Port的临时表(temp table),从temp table表中任选一个Producer的IP和Port,然后根据这个IP和Port,发送访问请求;temp table表中只包含通过了健康检查的Producer信息,并且每隔10s(默认)更新。 consul进行服务注册时,不关心服务的名字,服务的功能,做什么。ip+port 一个grpc功能的集群:定义一个逻辑名字 consul会自己进行健康检查:本质 我们提供的这个服务的ip+port 是不是可以通信

consul java注册中心服务端开发

 public static void main(String[] args) throws IOException, InterruptedException {
      //1. 模拟服务
      ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
      serverSocketChannel.bind(new InetSocketAddress(9000));
      //2.sonsul java client 进行注册服务
      // 连接consul服务器  ,模式连接localhost 8500
      Consul consulConnection=Consul.builder().build();
      //获得consul的客户端对象
      AgentClient agentClient = consulConnection.agentClient();
      //进行服务的注册
      String serviceId="Server-"+ UUID.randomUUID().toString();
      Registration service= ImmutableRegistration.builder()
              //当前服务唯一标识:id
                      .id(serviceId)
              //一组grpc集群一个逻辑名字
                              .name("grpc-server")
                                      .address("localhost")
                                              .port(9000)
                                                      .tags(Collections.singletonList("server"))
                                                              .meta(Collections.singletonMap("version","1.0"))
              //健康检查 ttl  http  tcp
                                                                      .check(Registration.RegCheck.tcp("localhost:9000",10))
                                                                              .build();
      agentClient.register(service);


      Thread.sleep(100*1000);
   }

http://127.0.0.1:8500/v1/agent/service/deregister/Server-b37769f1-8422-4919-b3a7-c1235d1cdc22

健康检查 .check(Registration.RegCheck.tcp("localhost:9000",10)) 如果不做检查检查,consul是无法确定服务是否存活,底层 开了新的线程 通过延迟队列与 对应的ip+port进行通信。

consul java注册中心客户端开发

客户端根据集群的name 获得一组健康的服务,然后再根据负载均衡的算法获取实际通信RPC

   public static void main(String[] args) {
      Consul consulConnection = Consul.builder().build();
      HealthClient healthClient = consulConnection.healthClient();
      ConsulResponse<List<ServiceHealth>> allServiceInstances = healthClient.getHealthyServiceInstances("/grpc-server");
      List<ServiceHealth> response = allServiceInstances.getResponse();
      for (ServiceHealth serviceHealth : response) {
         System.out.println(serviceHealth.getService());
      }
   }

注意: 获取健康实例的时候 ,consul可能同步不准确,这是因为检查是否健康是有间隔的 客户端负载均衡:由负载均衡决定,客户端访问哪个服务