【SpringCloud框架之Zookeeper、Consul服务注册与发现】

川长思鸟来 2023-09-24 23:21 125阅读 0赞

本笔记内容为尚硅谷SpringCloud框架开发Zookeeper、Consul部分

目录

SpringCloud整合Zookeeper

一、注册中心Zookeeper

二、服务提供者

1、新建Module

2、POM

3、YML

4、主启动类

5、Controller

6、启动8004注册进zookeeper

三、服务消费者

1、新建Module

2、POM

3、YML

4、主启动

5、业务类

Consul服务注册与发现

一、Consul简介

二、安装并运行Consul

三、服务提供者

1、新建Module

2、POM

3、YML

4、主启动类

5、业务类Controller

验证测试

四、服务消费者

1、新建Module

2、POM

3、YML

4、主启动类

5、配置Bean

6、Controller

验证测试

三个注册中心异同点

CAP

经典CAP图


接上一条笔记【SpringCloud框架之Eureka服务注册与发现】_蛋饼吧的博客-CSDN博客


Eureka2.0停止更新了 https://github.com/Netflix/eureka/wiki

2a7414230b6e4f0494427b015f530f1b.png

SpringCloud整合Zookeeper代替Eureka

SpringCloud整合Zookeeper

一、注册中心Zookeeper


  • zookeeper是一个分布式协调工具,可以实现注册中心功能
  • 关闭Linux服务器防火墙后启动
  • zookeeper服务器zookeeper服务器取代Eureka服务器,zk作为服务注册中心

二、服务提供者


1、新建Module

cloud-provider-payment8004

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>mscloud03</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. <dependencies>
  13. <!-- SpringBoot整合Web组件 -->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-web</artifactId>
  17. </dependency>
  18. <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  19. <groupId>com.atguigu.springcloud</groupId>
  20. <artifactId>cloud-api-commons</artifactId>
  21. <version>${project.version}</version>
  22. </dependency>
  23. <!-- SpringBoot整合zookeeper客户端 -->
  24. <dependency>
  25. <groupId>org.springframework.cloud</groupId>
  26. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-devtools</artifactId>
  31. <scope>runtime</scope>
  32. <optional>true</optional>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.projectlombok</groupId>
  36. <artifactId>lombok</artifactId>
  37. <optional>true</optional>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-test</artifactId>
  42. <scope>test</scope>
  43. </dependency>
  44. </dependencies>
  45. </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. connect-string: 192.168.111.144:2181

4、主启动类

  1. package com.atguigu.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. @SpringBootApplication
  6. @EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
  7. public class PaymentMain8004
  8. {
  9. public static void main(String[] args)
  10. {
  11. SpringApplication.run(PaymentMain8004.class,args);
  12. }
  13. }

5、Controller

  1. package com.atguigu.springcloud.controller;
  2. import org.springframework.web.bind.annotation.RequestMapping;
  3. import org.springframework.web.bind.annotation.RestController;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import java.util.UUID;
  6. @RestController
  7. public class PaymentController
  8. {
  9. @Value("${server.port}")
  10. private String serverPort;
  11. @RequestMapping(value = "/payment/zk")
  12. public String paymentzk()
  13. {
  14. return "springcloud with zookeeper: "+serverPort+"\t"+ UUID.randomUUID().toString();
  15. }
  16. }

6、启动8004注册进zookeeper

启动后问题

434dc41ad3f44031abf54466262dc5bc.png

解决zookeeper版本jar包冲突问题

6dd3acb8417a4b41a4f8a661a7a6cabf.png

排出zk冲突后的新POM

c4871298ed834c2c9b7536e4a5f79e89.png

  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>mscloud03</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. <dependencies>
  13. <!-- SpringBoot整合Web组件 -->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-web</artifactId>
  17. </dependency>
  18. <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
  19. <groupId>com.atguigu.springcloud</groupId>
  20. <artifactId>cloud-api-commons</artifactId>
  21. <version>${project.version}</version>
  22. </dependency>
  23. <!-- SpringBoot整合zookeeper客户端 -->
  24. <dependency>
  25. <groupId>org.springframework.cloud</groupId>
  26. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  27. <!--先排除自带的zookeeper3.5.3-->
  28. <exclusions>
  29. <exclusion>
  30. <groupId>org.apache.zookeeper</groupId>
  31. <artifactId>zookeeper</artifactId>
  32. </exclusion>
  33. </exclusions>
  34. </dependency>
  35. <!--添加zookeeper3.4.9版本-->
  36. <dependency>
  37. <groupId>org.apache.zookeeper</groupId>
  38. <artifactId>zookeeper</artifactId>
  39. <version>3.4.9</version>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-devtools</artifactId>
  44. <scope>runtime</scope>
  45. <optional>true</optional>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.projectlombok</groupId>
  49. <artifactId>lombok</artifactId>
  50. <optional>true</optional>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.springframework.boot</groupId>
  54. <artifactId>spring-boot-starter-test</artifactId>
  55. <scope>test</scope>
  56. </dependency>
  57. </dependencies>
  58. </project>

测试

482eb90ec5c64a93a62ae164474e1fe9.png

测试2

357acd6455724f578178a057f2e18648.png

服务节点是临时节点

三、服务消费者


1、新建Module

cloud-consumerzk-order80

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>mscloud</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-consumerzk-order81</artifactId>
  12. <dependencies>
  13. <!-- SpringBoot整合Web组件 -->
  14. <dependency>
  15. <groupId>org.springframework.boot</groupId>
  16. <artifactId>spring-boot-starter-web</artifactId>
  17. </dependency>
  18. <!-- SpringBoot整合zookeeper客户端 -->
  19. <dependency>
  20. <groupId>org.springframework.cloud</groupId>
  21. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  22. <!--先排除自带的zookeeper-->
  23. <exclusions>
  24. <exclusion>
  25. <groupId>org.apache.zookeeper</groupId>
  26. <artifactId>zookeeper</artifactId>
  27. </exclusion>
  28. </exclusions>
  29. </dependency>
  30. <!--添加zookeeper3.4.9版本-->
  31. <dependency>
  32. <groupId>org.apache.zookeeper</groupId>
  33. <artifactId>zookeeper</artifactId>
  34. <version>3.4.9</version>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-devtools</artifactId>
  39. <scope>runtime</scope>
  40. <optional>true</optional>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.projectlombok</groupId>
  44. <artifactId>lombok</artifactId>
  45. <optional>true</optional>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework.boot</groupId>
  49. <artifactId>spring-boot-starter-test</artifactId>
  50. <scope>test</scope>
  51. </dependency>
  52. </dependencies>
  53. </project>

3、YML

  1. server:
  2. port: 80
  3. spring:
  4. application:
  5. name: cloud-consumer-order
  6. cloud:
  7. #注册到zookeeper地址
  8. zookeeper:
  9. connect-string: 192.168.111.144:2181

4、主启动

  1. package com.atguigu.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class OrderZK80
  6. {
  7. public static void main(String[] args)
  8. {
  9. SpringApplication.run(OrderZK80.class,args);
  10. }
  11. }

5、业务类

配置Bean

config包下ApplicationContextBean.java

  1. package com.atguigu.springcloud.config;
  2. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.client.RestTemplate;
  6. /**
  7. * @auther zzyy
  8. * @create 2020-01-30 17:33
  9. */
  10. @Configuration
  11. public class ApplicationContextBean
  12. {
  13. @Bean
  14. @LoadBalanced
  15. public RestTemplate getRestTemplate()
  16. {
  17. return new RestTemplate();
  18. }
  19. }

Controller

  1. package com.atguigu.springcloud.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import org.springframework.web.client.RestTemplate;
  6. @RestController
  7. public class OrderZKController
  8. {
  9. public static final String INVOKE_URL = "http://cloud-provider-payment";
  10. @Autowired
  11. private RestTemplate restTemplate;
  12. @RequestMapping(value = "/consumer/payment/zk")
  13. public String paymentInfo()
  14. {
  15. String result = restTemplate.getForObject(INVOKE_URL+"/payment/zk", String.class);
  16. System.out.println("消费者调用支付服务(zookeeper)--->result:" + result);
  17. return result;
  18. }
  19. }

验证测试

512e73e3c4264541be354cb1054757af.png

访问测试地址

http://localhost/consumer/payment/zk

Consul服务注册与发现

一、Consul简介


What is Consul? | Consul | HashiCorp Developer

Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发。

提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。

它具有很多优点。包括: 基于 raft 协议,比较简洁; 支持健康检查, 同时支持 HTTP 和 DNS 协议 支持跨数据中心的 WAN 集群 提供图形界面 跨平台,支持 Linux、Mac、Windows

Spring Cloud Consul 具有如下特性:

e9babd344e444e4d8fd8d8f37b498e36.png

  • 服务发现——提供HTTP和DNS两种发现方式。
  • 健康监测——支持多种方式,HTTP、TCP、Docker、Shell脚本定制化
  • KV存储——监控Key、Value的存储方式
  • 多数据中心——Consul支持多数据中心
  • 可视化Web界面

下载地址 Install | Consul | HashiCorp Developer

文档 Spring Cloud Consul 中文文档 参考手册 中文版

二、安装并运行Consul


官网安装说明 Deploy Consul server | Consul | HashiCorp Developer

下载完成后只有一个consul.exe文件,硬盘路径下双击运行,查看版本号信息

3f51926285e74404b161553b8f0f72e6.png

使用开发模式启动

#cmd命令窗口执行命令

consul agent -dev

通过以下地址可以访问Consul的首页:http://localhost:8500

结果页面

2ba48a8bf13f41cdb0824597be239e2f.png

三、服务提供者


1、新建Module

支付服务:cloud-providerconsul-payment8006

2、POM

b8d8aa1bef2e405fb8d9c14164199604.png

  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>mscloud</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-providerconsul-payment8006</artifactId>
  12. <dependencies>
  13. <!--SpringCloud consul-server -->
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  17. </dependency>
  18. <!-- SpringBoot整合Web组件 -->
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-actuator</artifactId>
  26. </dependency>
  27. <!--日常通用jar包配置-->
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-devtools</artifactId>
  31. <scope>runtime</scope>
  32. <optional>true</optional>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.projectlombok</groupId>
  36. <artifactId>lombok</artifactId>
  37. <optional>true</optional>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-test</artifactId>
  42. <scope>test</scope>
  43. </dependency>
  44. </dependencies>
  45. </project>

3、YML

  1. ###consul服务端口号
  2. server:
  3. port: 8006
  4. spring:
  5. application:
  6. name: consul-provider-payment
  7. ####consul注册中心地址
  8. cloud:
  9. consul:
  10. host: localhost
  11. port: 8500
  12. discovery:
  13. #hostname: 127.0.0.1
  14. service-name: ${spring.application.name}

4、主启动类

  1. package com.atguigu.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. @SpringBootApplication
  6. @EnableDiscoveryClient
  7. public class PaymentMain8006
  8. {
  9. public static void main(String[] args)
  10. {
  11. SpringApplication.run(PaymentMain8006.class,args);
  12. }
  13. }

5、业务类Controller

  1. package com.atguigu.springcloud.controller;
  2. import org.springframework.beans.factory.annotation.Value;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import java.util.UUID;
  6. @RestController
  7. public class PaymentController
  8. {
  9. @Value("${server.port}")
  10. private String serverPort;
  11. @GetMapping("/payment/consul")
  12. public String paymentInfo()
  13. {
  14. return "springcloud with consul: "+serverPort+"\t\t"+ UUID.randomUUID().toString();
  15. }
  16. }

验证测试

5f3bea7d3ddc4c3289044fa4281fcde5.png

四、服务消费者


1、新建Module

消费服务:cloud-consumerconsul-order80

2、POM

c01446a8df7043a489f96a8aacbb3fbf.png

  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>mscloud</artifactId>
  7. <groupId>com.atguigu.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>cloud-consumerconsul-order82</artifactId>
  12. <dependencies>
  13. <!--SpringCloud consul-server -->
  14. <dependency>
  15. <groupId>org.springframework.cloud</groupId>
  16. <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  17. </dependency>
  18. <!-- SpringBoot整合Web组件 -->
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework.boot</groupId>
  25. <artifactId>spring-boot-starter-actuator</artifactId>
  26. </dependency>
  27. <!--日常通用jar包配置-->
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-devtools</artifactId>
  31. <scope>runtime</scope>
  32. <optional>true</optional>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.projectlombok</groupId>
  36. <artifactId>lombok</artifactId>
  37. <optional>true</optional>
  38. </dependency>
  39. <dependency>
  40. <groupId>org.springframework.boot</groupId>
  41. <artifactId>spring-boot-starter-test</artifactId>
  42. <scope>test</scope>
  43. </dependency>
  44. </dependencies>
  45. </project>

3、YML

  1. ###consul服务端口号
  2. server:
  3. port: 80
  4. spring:
  5. application:
  6. name: cloud-consumer-order
  7. ####consul注册中心地址
  8. cloud:
  9. consul:
  10. host: localhost
  11. port: 8500
  12. discovery:
  13. #hostname: 127.0.0.1
  14. service-name: ${spring.application.name}

4、主启动类

  1. package com.atguigu.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
  5. @SpringBootApplication
  6. @EnableDiscoveryClient //该注解用于向使用consul或者zookeeper作为注册中心时注册服务
  7. public class OrderConsulMain80
  8. {
  9. public static void main(String[] args)
  10. {
  11. SpringApplication.run(OrderConsulMain80.class,args);
  12. }
  13. }

5、配置Bean

config包下ApplicationContextBean.java

  1. package com.atguigu.springcloud.config;
  2. import org.springframework.cloud.client.loadbalancer.LoadBalanced;
  3. import org.springframework.context.annotation.Bean;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.client.RestTemplate;
  6. @Configuration
  7. public class ApplicationContextBean
  8. {
  9. @Bean
  10. @LoadBalanced
  11. public RestTemplate getRestTemplate()
  12. {
  13. return new RestTemplate();
  14. }
  15. }

6、Controller

  1. package com.atguigu.springcloud.controller;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. import org.springframework.web.client.RestTemplate;
  7. @RestController
  8. public class OrderConsulController
  9. {
  10. public static final String INVOKE_URL = "http://cloud-provider-payment"; //consul-provider-payment
  11. @Autowired
  12. private RestTemplate restTemplate;
  13. @GetMapping(value = "/consumer/payment/consul")
  14. public String paymentInfo()
  15. {
  16. String result = restTemplate.getForObject(INVOKE_URL+"/payment/consul", String.class);
  17. System.out.println("消费者调用支付服务(consule)--->result:" + result);
  18. return result;
  19. }
  20. }

验证测试

87faf50c0c06410a98f0ead05ab4e806.png

访问测试地址:http://localhost/consumer/payment/consul

#

三个注册中心异同点


CAP

C:Consistency(强一致性)

A:Availability(可用性)

P:Partition tolerance(分区容错性)

CAP理论关注粒度是数据,而不是整体系统设计的策略

经典CAP图

最多只能同时较好的满足两个。

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,

因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:

CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。

CP - 满足一致性,分区容忍必的系统,通常性能不是特别高。

AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

c2c606db9fb64611a49183c25db54ce1.png

结束!

发表评论

表情:
评论列表 (有 0 条评论,125人围观)

还没有评论,来说两句吧...

相关阅读