跟孙哥学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可能同步不准确,这是因为检查是否健康是有间隔的 客户端负载均衡:由负载均衡决定,客户端访问哪个服务