文章目录
1、Zookeeper的安装
①、拉取Zookeeper镜像
#拉取Zookeeper镜像
docker pull zookeeper
#启动Zookeeper
docker run --name zookeeper_1 -p 2181:2181 --restart always -d zookeeper
②、开放安全组
此步骤针对云服务器,本地虚拟机可关闭防火墙
2、注册服务提供者
①、建module
②、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>SpringCloudDemo</artifactId>
<groupId>com.phz.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>CloudProviderPayment8004</artifactId>
<dependencies>
<!--SpringBoot整合Zookeeper客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<!--web和actuator在spring-boot中几乎是绑定到一块的,后面的图形化显示和坐标监控,图形处理都非常重要-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.phz.springcloud</groupId>
<artifactId>CloudAPI</artifactId>
<version>1.0-SNAPSHOT</version>
</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>
</dependency>
</dependencies>
</project>
③、YML
server:
port: 8004
spring:
application:
name: cloud-payment-service
cloud:
zookeeper:
connect-string: 39.105.43.3:2181
discovery:
enabled: true
#这是本机IP
instance-host: 192.168.1.6
④、主启动类
/**
* @author PengHuAnZhi
* @createTime 2021/2/6 11:55
* @projectName SpringCloudDemo
* @className PaymentMain8004.java
* @description TODO
*/
@SpringBootApplication
@EnableDiscoveryClient//该主解用于向使用consul或者zookeeper作为注册中心注册服务
public class PaymentMain8004 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8004.class, args);
}
}
⑤、业务
/**
* @author PengHuAnZhi
* @createTime 2021/2/6 11:59
* @projectName SpringCloudDemo
* @className PaymentController.java
* @description TODO
*/
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@RequestMapping(value = "/payment/zookeeper")
public String paymentZookeeper() {
return "SpringCloud with zookeeper: " + serverPort + "\t" + UUID.randomUUID().toString();
}
}
⑥、测试
在容器中查看服务
#以交互模式进入容器
docker exec -it zookeeper_1 /bin/bash
#进去zookeeper
zkCli.sh
#查看启动的服务
ls /service
如果你的
Zookeeper
版本和你引入的spring-cloud-starter-zookeeper-discovery
依赖中自带的Zookeeper
包版本不一致,就会因为jar
包冲突而启动不起来
这里就应该手动排除这个冲突,并手动引入指定版本的
jar
包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<!--排除自带的zookeeper3.5.3-->
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--添加zookeeper3.4.9版本(引入对应版本的依赖)-->
<dependency>-->
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
查看zookeeper中服务的流水号
#可以打印出该服务的流水号
ls /services/cloud-payment-service
根据流水号查看服务的详细信息
#查看详细信息
get /services/cloud-payment-service/3d1ddb0d-89c5-46d9-8376-c7dbcd2a1909
//解析出来就是这样的
{
"name": "cloud-payment-service",
"id": "3d1ddb0d-89c5-46d9-8376-c7dbcd2a1909",
"address": "1",
"port": 8004,
"sslPort": null,
"payload": {
"@class": "org.springframework.cloud.zookeeper.discovery.ZookeeperInstance",
"id": "cloud-payment-service",
"name": "cloud-payment-service",
"metadata": {
"instance_status": "UP"
}
},
"registrationTimeUTC": 1612585018184,
"serviceType": "DYNAMIC",
"uriSpec": {
"parts": [
{
"value": "scheme",
"variable": true
},
{
"value": "://",
"variable": false
},
{
"value": "address",
"variable": true
},
{
"value": ":",
"variable": false
},
{
"value": "port",
"variable": true
}
]
}
}
⑦、结论
我们的每一个微服务作为一个节点保存在Zookeeper
中,且这个微服务是一个临时节点
,当这个微服务节点停止以后,Zookeeper
也会像Eureka
一样持续给它发送心跳包,当连续的一段时间没有收到回应后,Zookeeper
也会把它干掉,当服务重新启动后,它再次会加入到Zookeeper
节点中,但是流水号就不再和以前一样了
3、注册服务消费者
①、建module
②、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>SpringCloudDemo</artifactId>
<groupId>com.phz.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>CloudConsumerOrder8005</artifactId>
<dependencies>
<!--SpringBoot整合Zookeeper客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
</dependency>
<!--web和actuator在spring-boot中几乎是绑定到一块的,后面的图形化显示和坐标监控,图形处理都非常重要-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.phz.springcloud</groupId>
<artifactId>CloudAPI</artifactId>
<version>1.0-SNAPSHOT</version>
</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>
</dependency>
</dependencies>
</project>
③、YML
server:
port: 8005
spring:
application:
name: cloud-consumer-order
cloud:
#注册到zookeeper中
zookeeper:
connect-string: 39.105.43.3:2181
discovery:
enabled: true
#这是本机IP
instance-host: 192.168.1.6
④、主启动类
/**
* @author PengHuAnZhi
* @createTime 2021/2/6 13:44
* @projectName SpringCloudDemo
* @className OrderMain8005.java
* @description TODO
*/
@SpringBootApplication
@EnableDiscoveryClient
public class OrderMain8005 {
public static void main(String[] args) {
SpringApplication.run(OrderMain8005.class, args);
}
}
⑤、全局配置类
注入RestTemplate
/**
* @author PengHuAnZhi
* @createTime 2021/2/6 13:46
* @projectName SpringCloudDemo
* @className ApplicationContextConfig.java
* @description TODO
*/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
⑥、业务类
/**
* @author PengHuAnZhi
* @createTime 2021/2/6 13:48
* @projectName SpringCloudDemo
* @className OrderController.java
* @description TODO
*/
@RestController
@Slf4j
public class OrderController {
@Resource
private RestTemplate restTemplate;
//调用地址
private static final String INVOKE_URL = "http://localhost:8004";
@GetMapping(value = "/consumer/payment/zookeeper")
public String paymentInfo() {
return restTemplate.getForObject(INVOKE_URL + "/payment/zookeeper", String.class);
}
}
⑦、测试
4、关于集群
注意到我已经添加了
@LoadBalanced
,已经可以通过负载均衡依赖服务名从注册中心拉取服务URL
了,所以集群相当于也搭建成功,区别仅仅在于我只添加了一个服务而已,新增一个毫无疑问也是可以成功的。