SpringCloud&alibaba学习笔记系列
该笔记仅作为个人学习使用。
第三章zookeeper的服务发现与注册
官网:https://zookeeper.apache.org/
使用zookeeper代替eureka
3.1注册中心zookeeper
3.1.1概述
ZooKeeper是Hadoop的正式子项目,它是一个针对大型分布式系统的可靠协调系统,提供的功能包括:配置维护、名字服务、分布式同步、组服务等。也可以实现注册中心功能;
3.1.2下载安装
下载安装这里就不赘述,详见我我的博客《离线安装zookeeper》。
3.2服务提供者
下面我们实际演示通过zookeeper作为服务注册中心和如何注册到zookeeper。
1.新建cloud-provider-payment8004
2.pom文件
直接从8001拷贝过来依赖
<?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.jzt</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-provider-payment8004</artifactId>
<dependencies>
<!--zookeeper客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<!--解决zookeeper版本冲突问题-->
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
<dependency>
<groupId>com.jzt</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</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>
<version>1.18.14</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.yml配置
server:
port: 8004
spring:
application:
name: cloud-provider-payment
cloud:
zookeeper:
connect-string: 192.168.31.111:2181
4.主启动类
package com.jzt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
//import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* 功能描述:
*
* @Author: sj
* @Date: 2020/10/25 11:26
*/
@SpringBootApplication
//@EnableEurekaClient
@EnableDiscoveryClient //使用consul或者zookeeper作为注册中心时注册服务
public class PaymentService8004 {
public static void main(String[] args) {
SpringApplication.run(PaymentService8004.class, args);
}
}
5.controller
package com.jzt.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;
/**
* 功能描述:
*
* @Author: sj
* @Date: 2020/10/25 15:46
*/
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String port;
@RequestMapping(value = "/payment/zk")
public String paymentzk(){
return "zookeeper :"+port+"\t"+ UUID.randomUUID().toString();
}
}
6.解决jar包冲突问题
启动后的问题:
这是因为springcloud的zookeeper组件自带zookeeper包,这与自己引入的zookeeper的版本不一致,最终导致出错。
可以使用 标签来去除springcloud自身依赖的zookeeper包:
<!--zookeeper客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
7.测试
http://localhost:8004/payment/zk
进入zookeeper,查看节点信息:
在zookeeper服务器中也能够查看到我们创建的服务了!说明我们的cloud-payment-service8004已经成功注册到zookeeper注册中心。
服务节点是临时节点还是持久节点
zookeeper的节点时临时性的。当zookeeper接收不到注册服务的心跳时会立刻删除该服务节点。zookeeper在CAP理论中属性CP模型
3.3服务消费者
下面我们构建一个服务消费者,将它也注册到zookeeper中。
1.新建cloud-consumerzk-order80
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.jzt</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-consumerzk-order80</artifactId>
<dependencies>
<!--zookeeper客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
<!--解决zookeeper版本冲突问题-->
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
<dependency>
<groupId>com.jzt</groupId>
<artifactId>cloud-api-common</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</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>
<version>1.18.14</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
3.配置yml文件
server:
port: 80
spring:
application:
name: cloud-comsumerzk-order
cloud:
zookeeper:
connect-string: 192.168.31.111:2181
4.主启动类
package com.jzt;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* 功能描述:
*
* @Author: sj
* @Date: 2020/11/10 7:21
*/
@SpringBootApplication
@EnableDiscoveryClient
public class OrderZkOrder80 {
public static void main(String[] args) {
SpringApplication.run(OrderZkOrder80.class, args);
}
}
5.业务类
配置类
package com.jzt.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;
/**
* 功能描述:
*
* @Author: sj
* @Date: 2020/11/10 7:24
*/
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced //开启负载均衡功能
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
controller
package com.jzt.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
* 功能描述:
*
* @Author: sj
* @Date: 2020/11/10 7:29
*/
@RestController
public class OrderZKController {
public static final String INVOKE_URL = "http://cloud-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping(value = "consumer/payment/zk")
public String paymentInfo(){
String result = restTemplate.getForObject(INVOKE_URL+"/payment/zk", String.class);
return result;
}
}
6.测试
查看zookeeper节点信息,发现cloud-consumer-order服务已经注册到zk中。
服务调用也能正常执行。