一. 基础解释
只是简单记录一下推荐看大神的博文
- 最早的时候服务发现注册都是通过DiscoveryClient来实现的,随着版本变迁把DiscoveryClient服务注册抽离出来变成了 ServiceRegistry 抽象,专门负责服务注册,DiscoveryClient 专门负责服务发现。还提供了负载均衡的发现 LoadBalancerClient 抽象
- 在 SpringCloud + 注册中心 实现微服务远程调用,服务启动类上添加 @EnableEurekaClient (Eureka 作为注册中心时使用) 或添加 @EnableDiscoveryClient (ZooKeeper 与 Consul作为注册中心时使用),开启服务注册与发现,其底层就是通过 DiscoveryClient 实现服务注册, 实现服务发现
二. DiscoveryClient 发现
DiscoveryClient 是一个接口,以 Eureka 服务发现为例,通过该接口的具体实现类 EurekaDiscoveryClient 在 Eureka 注册中心获取注册的服务信息
DiscoveryClient 的使用示例(底层也是调用这些方法去获取Eureka上注册的服务信息)
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping(value = "/testDiscoveryClient", method = RequestMethod.GET)
@ResponseBody
public void testDiscoveryClient(){
//获取注册中心上注册的所有服务
List<String> serviceList = discoveryClient.getServices();
serviceList.stream().forEach(s ->System.out.println("当前eureka注册的服务"+s));
//根据服务名称,获取注册中心上指定服务实例,集群环境可能存在多个返回list
List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
serviceInstanceList.stream().forEach(
instance ->{
//获取指定服务的指定信息
System.out.println("服务id:"+instance.getServiceId());
System.out.println("服务主机名称:"+instance.getHost());
System.out.println("服务端口号:"+instance.getPort());
System.out.println("服务uri地址:"+instance.getUri());
}
);
}
三. ServiceRegistry 注册
(不要看了可能是错的,我只是记录一下)
ServiceRegistry 是一个接口,以 Eureka 服务注册为例,通过该接口的具体实现类 EurekaServiceRegistry 向 Eureka 注册中心注册的服务