一、背景
我们的微服务环境中,需要动态知道服务的情况,也就是服务发现,在SpringCloud中,分布式注册中心用的是Eureka,这里我们也可以用zookeeper来,zookeeper的临时节点和监听特性刚好可以用来做这个功能。下面举个例子吧,Eureka的可以参考我的笔记:https://www.suibibk.com/topic/556511662811643904

二、例子
这里就举个简单的例子,分布式注册中的原理什么的这里就不说了,这里举个服务提供者和服务消费者的例子即可。
三、代码实例
1、服务提供者
1-1、新建maven项目,pom.xml加入如下依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.suibibk</groupId><artifactId>springcloud-zk-provider</artifactId><version>0.0.1-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.5.RELEASE</version></parent><!-- 管理依赖 --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Finchley.M7</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- SpringBoot整合Web组件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Springboot整合zookeeper客户端--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zookeeper-discovery</artifactId></dependency></dependencies><!-- 注意: 这里必须要添加, 否者各种依赖有问题 --><repositories><repository><id>spring-milestones</id><name>Spring Milestones</name><url>https://repo.spring.io/libs-milestone</url><snapshots><enabled>false</enabled></snapshots></repository></repositories></project>
1-2、application.yml
server:# 表示注册到zookeeper服务的支付服务提供者端口号port: 8004spring:application:# 服务别名 ---注册zookeeper到注册中心名称name: springcloud-zk-providercloud:zookeeper:connect-string: 192.168.209.4:2181
1-3、服务
@SpringBootApplication@EnableDiscoveryClient // 该注解用于向使用consul或者zookeeper作为注册中心时注册服务@RestControllerpublic class ProviderController {@Value("${server.port}")private String serverPort;@RequestMapping("/zk")public String paymentzk(){return "springcloud with zookeeper: "+ serverPort+'\t'+ UUID.randomUUID().toString();}public static void main(String[] args) {SpringApplication.run(ProviderController.class,args);}}
1-4、启动
上面的例子很简单,相关注释也有,右键run启动然后再zookeeper控制台可以看到:

可以发现,服务已经注册到zookeeper了,其中/services ,/services/springcloud-zk-provider 是持久节点/services/springcloud-zk-provider/ca174228-5f60-4c0e-8d93-cae11cb6f3c3 是临时节点。
2、服务消费者
这里再建立一个服务消费者,其实代码结构跟提供者是类似的,改一下pom.xml的项目名称,改为springcloud-zk-consumer。
2-1、application.yml
server:# 表示注册到zookeeper服务的支付服务提供者端口号port: 8080spring:application:# 服务别名 ---注册zookeeper到注册中心名称name: springcloud-zk-consumercloud:zookeeper:connect-string: 192.168.209.4:2181
2-2、消费
@SpringBootApplication@EnableDiscoveryClient // 该注解用于向使用consul或者zookeeper作为注册中心时注册服务@RestControllerpublic class ConsumerController {private static final String INVOKE_URL ="http://springcloud-zk-provider";@Value("${server.port}")private String serverPort;@Autowiredprivate RestTemplate restTemplate;@GetMapping("/getZk")public String paymentInfo(){String result = restTemplate.getForObject(INVOKE_URL + "/zk", String.class);return result;}@Bean@LoadBalancedpublic RestTemplate getRestTemplate(){return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(ConsumerController.class,args);}}
启动,访问浏览器测试,结果如下:
zk客户端

浏览器

2-3、停止应用
停止应用后,过一段时间,在zk控制台可以看到临时节点被删掉了。

收工!
