1、Zookeeper
1.1 Zookeeper简介
Zookeeper是一个分布式协调工具,可以实现注册中心功能;当Eureka停更之后,Zookeeper服务器取代Eureka服务器,zk可以作为服务注册中心
1.2 安装Zookeeper
进docker hub的官网搜索zookeeper:https://hub.docker.com/_/zookeeper?tab=tags
然后使用docker命令安装zookeeper:docker pull zookeeper:3.6.0 (这里安装的3.6.0版本)
启动docker:docker run --privileged=true -d --name zookeeper --publish 2181:2181 -d 4f58c04512fb
关闭防火墙:systemctl stop firewalld
查看防火墙状态:systemctl status firewalld
查看启动的容器:docker ps
进入zookeeper容器:docker exec -it d765fcf8af45 /bin/bash (d765fcf8af45 是zookeeper容器的ID)
进入bin目录下面:cd bin
查看bin下面的文件:ls
然后启动客户端:./zkCli.sh
然后就会看到下面的界面:
我们可以使用红框里面的命令,查看现在zookeeper里面的信息。现在是没有任何节点连接上zookeeper的,等我们的其他微服务连接上之后,再次查看就会发现其他的节点。
到此,linux上面通过docker安装zookeeper是成功的,下面开始微服务的编写并连接到zookeeper。
2、创建服务提供者payment8004
2.1 建Module
创建新的Module:cloud-provider-zk-payment8004
2.2 改pom
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>springcloud2020</artifactId>
<groupId>com.zdw.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-provider-zk-payment8004</artifactId>
<description>Zookeeper服务提供者</description>
<dependencies>
<dependency>
<groupId>com.zdw.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<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>
<exclusions>
<!--先排除自带的zookeeper3.5.3-->
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加zookeeper3.6.0版本-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2.3 写yml
server:
# 8004表示注册到zookeeper服务器的支付服务提供者端口号
port: 8004
spring:
application:
# 服务别名---注册zookeeper到注册中心的名称
name: cloud-provider-zk-payment
cloud:
zookeeper:
# 默认localhost:2181,我是连接Linux上面的zookeeper
connect-string: 10.254.14.56:2181
2.4 主启动
package com.zdw.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient //这个注解一定要加,不能忘记
public class PaymentZkMain8004 {
public static void main(String[] args) {
SpringApplication.run(PaymentZkMain8004.class,args);
}
}
@EnableDiscoveryClient 这个注解用于注册服务到Zookeeper注册中心
2.5 业务编写
2.5.1 controller编写
package com.zdw.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
@RestController
@Slf4j
public class PaymentZkController {
@Value("${server.port}")
private String serverPort;
@RequestMapping("payment/zk")
public String paymentZk(){
return "SpringCloud with zookeeper:" + serverPort + "\t" + UUID.randomUUID().toString();
}
}
2.6 测试
启动cloud-provider-zk-payment8004,然后浏览器访问:http://localhost:8004/payment/zk 是正常的。
此时我们再次查看linux上面的zookeeper的信息:
可以看到,zookeeper下面多了一个services,services里面有我们的cloud-provider-zk-payment服务。所以支付服务8004注册到zookeeper是成功的。
3、创建订单消费者order80
3.1 建Module
创建新的Module:cloud-consumer-zk-order80
3.2 改pom
<?xml version="1.0" encoding="UTF-8"?>
<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">
<parent>
<artifactId>springcloud2020</artifactId>
<groupId>com.zdw.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-consumer-zk-order80</artifactId>
<description>订单消费者之注册中心zookeeper</description>
<dependencies>
<dependency>
<groupId>com.zdw.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<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>
<exclusions>
<!--先排除自带的zookeeper3.5.3-->
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加zookeeper3.6.0版本-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.3 写yml
server:
# 80表示注册到zookeeper服务器的订单消费者端口号
port: 80
spring:
application:
# 服务别名---注册zookeeper到注册中心的名称
name: cloud-consumer-zk-order
cloud:
zookeeper:
# 默认localhost:2181,我是连接Linux上面的zookeeper
connect-string: 10.254.14.56:2181
3.4 主启动
package com.zdw.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient //这个注解至关重要,不能漏掉了
public class OrderZkMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderZkMain80.class,args);
}
}
@EnableDiscoveryClient //这个注解至关重要,不能漏掉了
3.5 业务编写
3.5.1 配置RestTemplate
package com.zdw.springcloud.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class OrderZkConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
3.5.2 controller编写
package com.zdw.springcloud.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
@Slf4j
public class OrderZkController {
//cloud-provider-zk-payment 是支付服务者注册到zookeeper的名称
public static final String INVOKE_URL = "http://cloud-provider-zk-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/zk")
public String paymentInfo() {
//通过RestTemplate调用 cloud-provider-zk-payment 的服务
return restTemplate.getForObject(INVOKE_URL + "/payment/zk", String.class);
}
}
3.6 测试
我们启动主启动类,之前的payment8004也是启动的,浏览器访问:http://localhost:8004/payment/zk 和 http://localhost/consumer/payment/zk 都是成功的,此时我们再次查看zookeeper的信息:
到此,服务提供者和服务消费者都已经注册成功。
可以通过在线json解析工具查看详情:https://www.json.cn
4、注册到Zookeeper的节点是临时还是持久
服务节点是临时节点还是持久节点?
我们可以停掉服务payment8004,然后等一会之后,我们再次查看zookeeper的信息,会发现cloud-provider-zk-payment8004就没有了,已经被zookeeper剔除掉了;这和Eureka的自我保护机制不同,Eureka默认开启自我保护机制,如果服务停掉了,不会立马剔除该微服务。而Zookeeper是无情的立即剔除,不会保留。所以在Zookeeper中,服务节点是临时节点。
当我们再次启动payment8004服务之后,再次查看zookeeper信息,cloud-provider-zk-payment8004又会注册成功,但是此时的流水号已经改变了。