NIUCLOUD是一款SaaS管理后台框架多应用插件+云编译。上千名开发者、服务商正在积极拥抱开发者生态。欢迎开发者们免费入驻。一起助力发展! 广告
![](https://img.kancloud.cn/10/6e/106e8abbc56feac1de990687d7e835e9_677x378.png) 在前面的章节,我们已经为大家介绍了 * 服务注册的方式,在服务启动的时候主动向服务注册中心注册服务信息 * 服务消费者可以以负载均衡的方式,远程调用服务提供者提供的服务。 服务消费者调用微服务之前,需要向服务注册中心,获取注册服务列表及服务信息。这个过程就是“服务发现”,那么服务发现是通过什么类实现的?服务列表及服务信息又包含哪些内容?本节就带着大家来解开这样的疑惑! ## 一、DiscoveryClient测试用例 DiscoveryClient 代表的就是:服务发现操作对象。 ~~~ public interface DiscoveryClient extends Ordered { int DEFAULT_ORDER = 0; String description(); List<ServiceInstance> getInstances(String serviceId); List<String> getServices(); default int getOrder() { return 0; } } ~~~ 它有两个核心方法: * getServices获取在服务注册中心,注册的所有服务的id。比如:ASERVICE-RBAC、ASERVICE-SMS。 * getInstances根据服务id,获取该服务的所有启动实例的注册信息。即:一个微服务的多个副本的注册信息。 下面是一个基于Spring、Junit的测试用例,使用上面两个方法来实现服务发现。 ~~~ @ExtendWith(SpringExtension.class) @SpringBootTest public class DiscoveryClientTest { @Resource private DiscoveryClient discoveryClient; // 进行eureka的发现服务 @Test void discoveryClientTest() { //获取服务Id List<String> services = discoveryClient.getServices(); services.forEach(System.out::println); //获取每个服务的多个启动实例的注册信息。 for (String service:services){ discoveryClient.getInstances(service) .forEach(s -> { System.out.println("InstanceId=" + s.getHost() + ":" + s.getPort()); System.out.println("Host:Port="+ s.getHost() + ":" + s.getPort()); System.out.println("Uri=" + s.getUri()); System.out.println("InstanceId=" + s.getInstanceId()); System.out.println("Schema=" + s.getScheme()); System.out.println("ServiceId=" + s.getServiceId()); System.out.println("Metadata="+ s.getMetadata()); }); } } } ~~~ 在测试开始之前,我们启动了如下的四个微服务(如果不算eureka server的话是三个服务) ![](https://img.kancloud.cn/32/25/3225f04fad0bac9869706ccffe0d5fb0_439x180.png) 结合测试结果的打印,可以更清楚的知道服务注册及发现相关的信息。理解DiscoveryClient 及其方法的作用。控制台打印结果如下: ![](https://img.kancloud.cn/e4/6c/e46c62424ab08457317faef05c5bd203_589x699.png) ## 二、两种服务发现注解的区别 在Spring Cloud中实现服务发现可以使用两种注解:@EnableDiscoveryClient和@EnableEurekaClient,两者的用法基本上是一样的。但存在区别,简单地说: * 如果服务注册中心是eureka,就需要在服务启动类加上@EnableEurekaClient注解,实现服务发现。 * 如果是其他的注册中心,那么更推荐使用@EnableDiscoveryClient,该注解更加的通用。 在Hello-microservice章节,实现微服务向服务注册中心注册的时候,我们使用了@EnableEurekaClient,是因为我们当时搭建的服务注册中心是基于eureka搭建的。Spring Cloud中还有很多的其他服务注册中心的选项,比如:consul、zookeeper、nacos,这时就不能使用@EnableEurekaClient注解了,需要使用@EnableDiscoveryClient注解。