SpringCloud实战---第十篇:使用Zookeeper服务注册中心
前言
说起来容易做起来难,一步一步都干完!!!
学习一定要自己动手搞一搞,不能只眼会。
学习笔记是跟着尚硅谷的视频学的:传送门
场景大纲
我们以这样一个场景来学习、构建我们的微服务
安装zookeeper
zookeeper是Eureka的最简单的替换方案,只需要将注册中心改成Zoookeeper即可。
安装教程: Zookeeper安装教程
创建使用zookeeper的服务提供者
1. 创建cloud-provider-payment8004模块
cloud-provider-payment8004
具体创建模块的步骤不赘述了,可以参照之前的博客:https://blog.csdn.net/weixin_43464964/article/details/121980366
工程结构
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>cloud2021</artifactId>
<groupId>com.atguigu.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-provider-payment8004</artifactId>
<dependencies>
<!-- SpringBoot整合Web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>com.atguigu.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!-- SpringBoot整合zookeeper客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<!--先排除自带的zookeeper3.5.3-->
<!--<exclusions>-->
<!--<exclusion>-->
<!--<groupId>org.apache.zookeeper</groupId>-->
<!--<artifactId>zookeeper</artifactId>-->
<!--</exclusion>-->
<!--</exclusions>-->
</dependency>
<!--添加zookeeper3.5.7版本-->
<!--<dependency>-->
<!--<groupId>org.apache.zookeeper</groupId>-->
<!--<artifactId>zookeeper</artifactId>-->
<!--<version>3.5.7</version>-->
<!--</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. application.yml
server:
port: 8004
#服务别名----注册zookeeper到注册中心名称
spring:
application:
name: cloud-provider-payment
cloud:
zookeeper:
connect-string: 10.10.101.78:2181
4. 启动类
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @Author: Daisen.Z
* @Date: 2021/12/22 11:53
* @Version: 1.0
* @Description:
*/
// @EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到改服务。
// 不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8004 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8004.class,args);
}
}
5. PaymentController
package com.atguigu.springcloud.controller;
import com.atguigu.springcloud.entities.Payment;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: Daisen.Z
* @Date: 2021/12/22 11:59
* @Version: 1.0
* @Description:
*/
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/zk")
public String paymentzk(){
return "port:"+serverPort;
}
}
创建工程目录将配置及各个类创建完成
测试检查环境
1. 启动测试
先启动服务器上zookeeper,再启动程序
进入zookeeper的bin目录
./zkServer.sh start
然后启动程序
虽然我们现在的环境是能启动成功的,但是还是要补充一下,spring-cloud-starter-zookeeper-discovery会自带的有一个zookeeper依赖,如果你服务器上安装的zookeeper比较新,和spring-cloud-starter-zookeeper-discovery版本自带的依赖不同,程序会报一个zookeeper版本冲突的问题,这里我们直接说下解决方式。
2. 解决Zookeeper版本冲突
修改POM,排除掉spring-cloud-starter-zookeeper-discovery自带的zookeeper
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<!--先排除自带的zookeeper3.5.3-->
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
添加与服务器上zookeeper版本号相同的依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
再次启动,就不会再报zookeeper版本冲突的错误了。
测试服务注册
zookeeper基本命令合集(bin目录下执行)
操作 | 命令 |
---|---|
启动 | ./zkServer.sh start |
查看状态 | ./zkServer.sh status |
进入客户端 | ./zkCli.sh |
退出客户端 | quit |
关闭zookeeper | ./zkServer.sh stop |
1. 登录服务器上Zookeeper-client
先关闭我们的java程序
到Zookeeper安装目录的bin目录下,执行以下命令进入客户端
./zkCli.sh
查看zookeeper上的内容
ls /
只有一个zookeeper,查看zookeeper
ls /zookeeper
有一些zookeeper相关的信息,证明zookeeper是正常的
2. 启动程序,注册到zk上
启动我们的程序
再次在zookeeper客户端上执行ls /,查看根目录
发现多了个services,查看下这个文件下有什么
ls /services
发现我们的服务已经注册上来啦!!!
3. 查看注册上来的服务的信息
在zk的客户端上执行下面命令
ls /services/cloud-provider-payment
发现cloud-provider-payment服务文件夹下有一个流水号
好,接下来我们get一下
get /services/cloud-provider-payment/21339f58-c80f-42d8-8583-715f48130c46
获取出来了一个JSON串,用在线解析工具解析一下,能够看出是我们的微服务注册的信息,至此说明微服务成功注册进了zk。
与Eureka做对比
上篇我们知道,Eureka是CAP中的AP机制,他是带一个自我保护机制的服务挂掉后不会立马被删除,那么ZK是怎样的呢?
大家可以自己测试一下,自己动动手,把微服务注册到zk上,使用ls命令看着你注册的那个微服务,然后把微服务程序关掉,看过段时间zk是否会把微服务清理掉。
这里先说下结论,微服务注册进入zk使用的是临时节点,当微服务一段时间没发心跳会会被立马清除(没有自我保护机制),这种机制是cap中的cp,当你重新启动微服务时会重新在zookeeper上面注册(服务下面用于获取json的那个流水号会改变)。
改造80工程,通过zk调用payment/zk接口
1. 创建cloud-customerzk-order80模块
cloud-customerzk-order80
2. 添加pom依赖,pom依赖和8004一样
3. 添加配置,将8004工程的配置粘贴过来
4. 创建基础包
com.atguigu.springcloud
5. 编写启动类OrderZKMain80
package com.atguigu.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @auther zzyy
* @create 2020-02-19 15:19
*/
@SpringBootApplication
@EnableDiscoveryClient
public class OrderZKMain80
{
public static void main(String[] args) {
SpringApplication.run(OrderZKMain80.class, args);
}
}
6. 添加RestTemplate
7. 编写OrderZkController
这里我们还没有讲到Feign等远程调用,暂时还是使用RestTemplate去通过服务名调用
package com.atguigu.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;
/**
* @auther zzyy
* @create 2020-02-19 15:21
*/
@RestController
@Slf4j
public class OrderZKController
{
public static final String INVOKE_URL = "http://cloud-provider-payment";
@Resource
private RestTemplate restTemplate;
// 调用8004的服务
@GetMapping(value = "/consumer/payment/zk")
public String paymentInfo()
{
String result = restTemplate.getForObject(INVOKE_URL+"/payment/zk",String.class);
return result;
}
}
8. 启动
启动zk-80和8004两个工程
到ZK客户端查看一下
ls /services
两个服务都注册上来了
9. 访问页面,测试
http://localhost/consumer/payment/zk
成功调用接口
总结
- zookeeper安装教程: https://blog.csdn.net/weixin_43464964/article/details/122079762
- zookeeper命令,进入zk的bin目录执行:
操作 | 命令 |
---|---|
启动 | ./zkServer.sh start |
查看状态 | ./zkServer.sh status |
进入客户端 | ./zkCli.sh |
退出客户端 | quit |
关闭zookeeper | ./zkServer.sh stop |
- 通过在服务器上zk客户端执行命令可以查看已注册服务的信息。
ls /services/服务名/流水号
- 微服务注册到zk上属于使临时节点,当微服务一段时间没发心跳会会被立马清除(与Eureka不同,没有自我保护机制),这种机制是cap中的cp,当你重新启动微服务时会重新在zookeeper上面注册(服务下面用于获取json的那个流水号会改变)。
- zk集群的整合也很简单,搭建zk集群,然后在程序的yml配置中把zk的地址写成多个,用逗号隔开即可,zk不是重点,不再多说。
- 点赞
- 收藏
- 关注作者
评论(0)