SpringCloud整合zookeeper

x33g5p2x  于2021-10-16 转载在 Spring  
字(8.6k)|赞(0)|评价(0)|浏览(373)

前言

SpringCloud----环境搭建

SpringCloud—Eureka

支付服务注册进zookeeper

  • 注册中心Zookeeper

zookeeper是一个分布式协调工具,可以实现注册中心功能

关闭Linux服务器防火墙后,启动zookeeper服务器

用到的Linux命令行:

  • systemctl stop firewalld关闭防火墙
  • systemctl status firewalld查看防火墙状态
  • ipconfig查看IP地址
  • ping查验结果

zookeeper服务器取代Eureka服务器,zk作为服务注册中心

具体步骤

1.新建名为cloud-provider-payment8004的Maven工程。

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>cloud_Parent</artifactId>
  7. <groupId>dhy.xpy</groupId>
  8. <version>520.521.finally</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>dhy_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. <!-- SpringBoot整合Web组件 -->
  18. <dependency>
  19. <groupId>org.springframework.boot</groupId>
  20. <artifactId>spring-boot-starter-web</artifactId>
  21. </dependency>
  22. <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  23. <groupId>dhy.xpy</groupId>
  24. <artifactId>cloud-api-commons</artifactId>
  25. <version>520.521.finally</version>
  26. </dependency>
  27. <!-- SpringBoot整合zookeeper客户端 -->
  28. <dependency>
  29. <groupId>org.springframework.cloud</groupId>
  30. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-devtools</artifactId>
  35. <scope>runtime</scope>
  36. <optional>true</optional>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.projectlombok</groupId>
  40. <artifactId>lombok</artifactId>
  41. <optional>true</optional>
  42. </dependency>
  43. <dependency>
  44. <groupId>org.springframework.boot</groupId>
  45. <artifactId>spring-boot-starter-test</artifactId>
  46. <scope>test</scope>
  47. </dependency>
  48. </dependencies>
  49. </project>

3.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. #一个zookeeper机器的ip加端口号
  11. connect-string: 192.168.112.128:2181

4.主启动类

  1. @SpringBootApplication
  2. //让注册中心能够发现,扫描到当前微服务
  3. //@EnableEurekaClient只适用于Eureka作为注册中心
  4. @EnableDiscoveryClient//该注解用于向使用consul或者zookeeper作为注册中心时注册服务
  5. public class PaymentMain8004
  6. {
  7. public static void main(String[] args)
  8. {
  9. SpringApplication.run(PaymentMain8004.class, args);
  10. }
  11. }

5.Controller

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

6.启动8004注册进zookeeper(要先启动zookeeper的server)

  • 验证测试:浏览器 - http://localhost:8004/payment/zk
  • 验证测试2 :接着用zookeeper客户端操作

zk的客户端可以发现多个一个微服务节点上线

当前微服务节点的详细信息用JSON字符串封装来进行表示

通过JSON字符串格式化工具,可以得到下面的结果:

  1. {
  2. "name": "cloud-provider-payment",
  3. "id": "59fa22e6-d0e1-493a-ad03-85cb1ad4946d",
  4. "address": "LAPTOP-PEE1UMNH",
  5. "port": 8004,
  6. "sslPort": null,
  7. "payload": {
  8. "@class": "org.springframework.cloud.zookeeper.discovery.ZookeeperInstance",
  9. "id": "application-1",
  10. "name": "cloud-provider-payment",
  11. "metadata": {
  12. }
  13. },
  14. "registrationTimeUTC": 1634218867331,
  15. "serviceType": "DYNAMIC",
  16. "uriSpec": {
  17. "parts": [
  18. {
  19. "value": "scheme",
  20. "variable": true
  21. },
  22. {
  23. "value": "://",
  24. "variable": false
  25. },
  26. {
  27. "value": "address",
  28. "variable": true
  29. },
  30. {
  31. "value": ":",
  32. "variable": false
  33. },
  34. {
  35. "value": "port",
  36. "variable": true
  37. }
  38. ]
  39. }
  40. }

ZooKeeper的服务节点是临时节点,并且当微服务一段时间没有发送心跳给zk,那zk就会将其踢出去

如果linux上面的zk是3.4+,而idea上面的默认引入的是3.5+,那么可能会出现jar包冲突问题,解决方法如下

  1. <!-- SpringBoot整合zookeeper客户端 -->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  5. <!--先排除自带的zookeeper3.5.3 防止与3.4.9起冲突-->
  6. <exclusions>
  7. <exclusion>
  8. <groupId>org.apache.zookeeper</groupId>
  9. <artifactId>zookeeper</artifactId>
  10. </exclusion>
  11. </exclusions>
  12. </dependency>
  13. <!--添加zookeeper3.4.9版本-->
  14. <dependency>
  15. <groupId>org.apache.zookeeper</groupId>
  16. <artifactId>zookeeper</artifactId>
  17. <version>3.4.9</version>
  18. </dependency>

订单服务注册进zookeeper

1.新建cloud-consumerzk-order80

2.POM

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <parent>
  4. <artifactId>cloud_Parent</artifactId>
  5. <groupId>dhy.xpy</groupId>
  6. <version>520.521.finally</version>
  7. </parent>
  8. <modelVersion>4.0.0</modelVersion>
  9. <artifactId>dhy-cloud-consumerzk-order80</artifactId>
  10. <properties>
  11. <maven.compiler.source>8</maven.compiler.source>
  12. <maven.compiler.target>8</maven.compiler.target>
  13. </properties>
  14. <dependencies>
  15. <!-- SpringBoot整合Web组件 -->
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-web</artifactId>
  19. </dependency>
  20. <!-- SpringBoot整合zookeeper客户端 -->
  21. <dependency>
  22. <groupId>org.springframework.cloud</groupId>
  23. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-devtools</artifactId>
  28. <scope>runtime</scope>
  29. <optional>true</optional>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.projectlombok</groupId>
  33. <artifactId>lombok</artifactId>
  34. <optional>true</optional>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-starter-test</artifactId>
  39. <scope>test</scope>
  40. </dependency>
  41. </dependencies>
  42. </project>

3.YML

  1. server:
  2. port: 80
  3. #服务别名----注册zookeeper到注册中心名称
  4. spring:
  5. application:
  6. name: cloud-consumer-order
  7. cloud:
  8. zookeeper:
  9. connect-string: 192.168.112.128:2181

4.主启动

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

5.业务类

  1. @Configuration
  2. public class ApplicationContextConfig
  3. {
  4. @Bean
  5. //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
  6. @LoadBalanced
  7. public RestTemplate getRestTemplate()
  8. {
  9. return new RestTemplate();
  10. }
  11. }
  1. @RestController
  2. @Slf4j
  3. public class OrderZKController
  4. {
  5. //zk上面微服务的名字
  6. //通过 @LoadBalanced注解的拦截器拦截restTemplate实例对象发出的请求
  7. //做服务名到ip的映射
  8. public static final String INVOKE_URL = "http://cloud-provider-payment";
  9. @Resource
  10. private RestTemplate restTemplate;
  11. @GetMapping(value = "/consumer/payment/zk")
  12. public String paymentInfo()
  13. {
  14. //返回值为String类型,无请求参数
  15. String result = restTemplate.getForObject(INVOKE_URL+"/payment/zk",String.class);
  16. return result;
  17. }
  18. }

6.验证测试

运行ZooKeeper服务端,cloud-consumerzk-order80,cloud-provider-payment8004。

打开ZooKeeper客户端:

  1. {
  2. "name": "cloud-consumer-order",
  3. "id": "95218618-544c-4e37-a692-25fbb6f0e218",
  4. "address": "LAPTOP-PEE1UMNH",
  5. "port": 80,
  6. "sslPort": null,
  7. "payload": {
  8. "@class": "org.springframework.cloud.zookeeper.discovery.ZookeeperInstance",
  9. "id": "application-1",
  10. "name": "cloud-consumer-order",
  11. "metadata": {
  12. }
  13. },
  14. "registrationTimeUTC": 1634222801335,
  15. "serviceType": "DYNAMIC",
  16. "uriSpec": {
  17. "parts": [
  18. {
  19. "value": "scheme",
  20. "variable": true
  21. },
  22. {
  23. "value": "://",
  24. "variable": false
  25. },
  26. {
  27. "value": "address",
  28. "variable": true
  29. },
  30. {
  31. "value": ":",
  32. "variable": false
  33. },
  34. {
  35. "value": "port",
  36. "variable": true
  37. }
  38. ]
  39. }
  40. }

7.访问测试地址 - http://localhost/consumer/payment/zk

相关文章