主要内容
- 服务注册中心:zookeeper代替eureka
- Consul服务注册与发现
1. 注册中心Zookeeper
zookeeper是一个分布式协调工具,可以实现注册中心功能
关闭linux服务器防火墙后,启动zookeeper服务器
centos:systemctl stop firewalld
Ubuntu:
sudo ufw disable
zookeeper服务器取代Eureka服务器,zk作为服务注册中心
2.服务提供者
2.1 新建cloud-provider-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>jdk8cloud2021</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-provider-payment8004</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><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></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</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 application.yml
#8004表示注册到zookeeper服务器的支付服务提供者端口号server:port: 8004#服务别名----注册zookeeper到注册中心名称spring:application:name: cloud-provider-paymentcloud:zookeeper:connect-string: 192.168.190.128:2181
2.4 主启动类
@SpringBootApplication@EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务public class PaymentMain8004 {public static void main(String[] args) {SpringApplication.run(PaymentMain8004.class, args);}}
2.5 controller
@RestController@Slf4jpublic class PaymentController {@Value("${server.port}")private String serverPort;@RequestMapping(value = "/payment/zk")public String paymentzk() {return "springcloud with zookeeper: " + serverPort + "\t" + UUID.randomUUID().toString();}}
2.6 测试:解决jar包冲突
2.6.1 解决jar包冲突


如果安装的zookeeper版本高于3.5.3则不会出现冲突报错。我是3.5.7没有报错
报错解决方案:排除引入的3.5.3-beta,引入与安装的zookeeper对应的版本
<dependencies><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>
这样又会产生新的错误:SLF4J多次绑定
zookeeper跟starter-web中都有slf4j产生了冲突
所以排除掉zookeeper中的slf4j
再次启动成功
2.6.2 查看服务是否注册成功
虚拟机cd到zookeeper安装目录下:cd /usr/local/moudle/zookeeper-3.5.7
连接zookeeper客户端:bin/zkCli.sh
查看服务是否注册成功:
2.6.3 测试controller

通过 get /services/cloud-provider-payment/39f814f5-8ddd-4fa3-9d95-130ff687f736 获取节点信息
在线解析json串:https://tool.lu/json
2.7 思考
注册到zookeeper的微服务是一个zNode节点,这个节点是临时节点还是持久节点?
我们在注册的时候会生成一个流水号id,我们将服务断开,发现刚断开时zookeeper还保存着该服务,等待一段时间后,该节点被删除。所以是临时节点。重新启动8004的微服务,可以看到生成了一个新的流水号id
如果先前配置了zookeeper的集群,请确保一半以上的服务器处于开启状态,否者zookeeper服务无法使用
3 服务消费者
3.1 新建cloud-consumerzk-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>jdk8cloud2021</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>cloud-consumer-order80</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--eureka-client--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>${project.version}</version></dependency><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>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
#80表示注册到zookeeper服务器的消费服务提供者端口号server:port: 80#服务别名----注册zookeeper到注册中心名称spring:application:name: cloud-consumer-ordercloud:zookeeper:connect-string: 192.168.190.128:2181
3.4. 主启动类
@SpringBootApplication@EnableDiscoveryClientpublic class OrderZKMain80 {public static void main(String[] args) {SpringApplication.run(OrderZKMain80.class, args);}}
3.5. 配置类
@Configurationpublic class ApplicationContextConfig {@Bean@LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力public RestTemplate restTemplate() {return new RestTemplate();}}
3.6. 业务类
@RestController@Slf4jpublic class OrderZKController {public static final String INVOKE_URL = "http://cloud-provider-payment";@Resourceprivate RestTemplate restTemplate;@GetMapping("/consumer/payment/zk")public String paymentInfo() {return restTemplate.getForObject(INVOKE_URL + "/payment/zk", String.class);}}
3.7. 测试

