主要内容

  • 服务注册中心: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

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>jdk8cloud2021</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-provider-payment8004</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  18. <groupId>com.atguigu.springcloud</groupId>
  19. <artifactId>cloud-api-commons</artifactId>
  20. <version>${project.version}</version>
  21. </dependency>
  22. <!-- SpringBoot整合zookeeper客户端 -->
  23. <dependency>
  24. <groupId>org.springframework.cloud</groupId>
  25. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-web</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-devtools</artifactId>
  34. <scope>runtime</scope>
  35. <optional>true</optional>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.projectlombok</groupId>
  39. <artifactId>lombok</artifactId>
  40. <optional>true</optional>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-starter-test</artifactId>
  45. <scope>test</scope>
  46. </dependency>
  47. </dependencies>
  48. </project>

2.3 application.yml

  1. #8004表示注册到zookeeper服务器的支付服务提供者端口号
  2. server:
  3. port: 8004
  4. #服务别名----注册zookeeper到注册中心名称
  5. spring:
  6. application:
  7. name: cloud-provider-payment
  8. cloud:
  9. zookeeper:
  10. connect-string: 192.168.190.128:2181

2.4 主启动类

  1. @SpringBootApplication
  2. @EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
  3. public class PaymentMain8004 {
  4. public static void main(String[] args) {
  5. SpringApplication.run(PaymentMain8004.class, args);
  6. }
  7. }

2.5 controller

  1. @RestController
  2. @Slf4j
  3. public class PaymentController {
  4. @Value("${server.port}")
  5. private String serverPort;
  6. @RequestMapping(value = "/payment/zk")
  7. public String paymentzk() {
  8. return "springcloud with zookeeper: " + serverPort + "\t" + UUID.randomUUID().toString();
  9. }
  10. }

2.6 测试:解决jar包冲突

2.6.1 解决jar包冲突

image.png
image.png
如果安装的zookeeper版本高于3.5.3则不会出现冲突报错。我是3.5.7没有报错
报错解决方案:排除引入的3.5.3-beta,引入与安装的zookeeper对应的版本

  1. <dependencies>
  2. <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  3. <groupId>com.atguigu.springcloud</groupId>
  4. <artifactId>cloud-api-commons</artifactId>
  5. <version>${project.version}</version>
  6. </dependency>
  7. <!-- SpringBoot整合zookeeper客户端 -->
  8. <dependency>
  9. <groupId>org.springframework.cloud</groupId>
  10. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  11. <!--先排除自带的zookeeper3.5.3-->
  12. <exclusions>
  13. <exclusion>
  14. <groupId>org.apache.zookeeper</groupId>
  15. <artifactId>zookeeper</artifactId>
  16. </exclusion>
  17. </exclusions>
  18. </dependency>
  19. <!--添加zookeeper3.5.7版本-->
  20. <dependency>
  21. <groupId>org.apache.zookeeper</groupId>
  22. <artifactId>zookeeper</artifactId>
  23. <version>3.5.7</version>
  24. </dependency>

这样又会产生新的错误:SLF4J多次绑定
image.png
zookeeper跟starter-web中都有slf4j产生了冲突
image.png
所以排除掉zookeeper中的slf4j
image.png
再次启动成功

2.6.2 查看服务是否注册成功

虚拟机cd到zookeeper安装目录下:cd /usr/local/moudle/zookeeper-3.5.7
连接zookeeper客户端:bin/zkCli.sh
查看服务是否注册成功:
image.png

2.6.3 测试controller

image.png
通过 get /services/cloud-provider-payment/39f814f5-8ddd-4fa3-9d95-130ff687f736 获取节点信息
image.png
在线解析json串:https://tool.lu/json
image.png

2.7 思考

注册到zookeeper的微服务是一个zNode节点,这个节点是临时节点还是持久节点?

我们在注册的时候会生成一个流水号id,我们将服务断开,发现刚断开时zookeeper还保存着该服务,等待一段时间后,该节点被删除。所以是临时节点。重新启动8004的微服务,可以看到生成了一个新的流水号id
image.png

如果先前配置了zookeeper的集群,请确保一半以上的服务器处于开启状态,否者zookeeper服务无法使用

3 服务消费者

3.1 新建cloud-consumerzk-order80

3.2 pom

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>jdk8cloud2021</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-consumer-order80</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <!--eureka-client-->
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  21. </dependency>
  22. <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  23. <groupId>com.atguigu.springcloud</groupId>
  24. <artifactId>cloud-api-commons</artifactId>
  25. <version>${project.version}</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-web</artifactId>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-starter-actuator</artifactId>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-devtools</artifactId>
  38. <scope>runtime</scope>
  39. <optional>true</optional>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.projectlombok</groupId>
  43. <artifactId>lombok</artifactId>
  44. <optional>true</optional>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-test</artifactId>
  49. <scope>test</scope>
  50. </dependency>
  51. </dependencies>
  52. </project>

3.3 yml

  1. #80表示注册到zookeeper服务器的消费服务提供者端口号
  2. server:
  3. port: 80
  4. #服务别名----注册zookeeper到注册中心名称
  5. spring:
  6. application:
  7. name: cloud-consumer-order
  8. cloud:
  9. zookeeper:
  10. connect-string: 192.168.190.128:2181

3.4. 主启动类

  1. @SpringBootApplication
  2. @EnableDiscoveryClient
  3. public class OrderZKMain80 {
  4. public static void main(String[] args) {
  5. SpringApplication.run(OrderZKMain80.class, args);
  6. }
  7. }

3.5. 配置类

  1. @Configuration
  2. public class ApplicationContextConfig {
  3. @Bean
  4. @LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
  5. public RestTemplate restTemplate() {
  6. return new RestTemplate();
  7. }
  8. }

3.6. 业务类

  1. @RestController
  2. @Slf4j
  3. public class OrderZKController {
  4. public static final String INVOKE_URL = "http://cloud-provider-payment";
  5. @Resource
  6. private RestTemplate restTemplate;
  7. @GetMapping("/consumer/payment/zk")
  8. public String paymentInfo() {
  9. return restTemplate.getForObject(INVOKE_URL + "/payment/zk", String.class);
  10. }
  11. }

3.7. 测试

image.png