常见的服务注册中心:
image.png

Consul 官网:https://www.consul.io/
Consul 服务注册中心:Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册于发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其它工具(比如 Zookeeper 等)

Consul 角色

  • client:客户端,无状态,将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群
  • server:服务端,保存配置信息,高可用集群,每个数据中心的 server 数量推荐为 3 个或者 5 个(奇数个)

Consul 工作原理

Consul - 图2

image.png

  • 服务发现以及注册:当服务 Producer 启动后,会将自己的 ip/host 等信息通过发送请求告知 consul,consul 接收到 Producer 的注册信息后,每个 10 秒(默认)会向 Producer 发送一个健康检查的请求,检验 Producer 是否健康
  • 服务调用:当Consumer请求Producer时,会先从 Consul 中拿存储 Product 服务的 IP 和 Port 的临时表(temp table),从 temp table 表中任选一个 Producer 的 IP 和 Port ,然后根据这个 IP 和 Port,发送访问请求;temp table表只包含通过了健康检查的 Producer 信息,并且每隔 10s (默认)更新

Consul 安装

Linux 下载地址:https://releases.hashicorp.com/consul/1.9.1/consul_1.9.1_linux_amd64.zip
Windows 下载地址:https://releases.hashicorp.com/consul/1.9.1/consul_1.9.1_windows_amd64.zip

1、单节点:

在 Windows 下使用 cmd 启动:

  • -server:以服务端身份启动
  • -bind:绑定到哪个ip,针对多网卡的主机
  • -client:指定客户端访问的ip,0.0.0.0表示不限制客户端ip
    1. # -dev表示开发模式运行,-server表示服务模式运行
    2. # -client=0.0.0.0表示允许所有的IP访问
    3. consul agent -dev -client=0.0.0.0
    访问管理后台:http://localhost:8500
    image.png

1、创建父项目:

  1. <packaging>pom</packaging>
  2. <parent>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-parent</artifactId>
  5. <version>2.4.1</version>
  6. </parent>
  7. <dependencyManagement>
  8. <dependencies>
  9. <dependency>
  10. <groupId>org.springframework.cloud</groupId>
  11. <artifactId>spring-cloud-dependencies</artifactId>
  12. <version>2020.0.0</version>
  13. </dependency>
  14. </dependencies>
  15. </dependencyManagement>

2、创建 service-provider 模块,并导入依赖:

  1. <dependencies>
  2. <!-- spring cloud consul 依赖 -->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  6. </dependency>
  7. <!-- spring boot web 依赖 -->
  8. <dependency>
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-web</artifactId>
  11. </dependency>
  12. <!-- spring boot actuator 依赖 -->
  13. <dependency>
  14. <groupId>org.springframework.boot</groupId>
  15. <artifactId>spring-boot-starter-actuator</artifactId>
  16. </dependency>
  17. <!-- lombok依赖 -->
  18. <dependency>
  19. <groupId>org.projectlombok</groupId>
  20. <artifactId>lombok</artifactId>
  21. <scope>provided</scope>
  22. </dependency>
  23. <!-- spring boot test 依赖 -->
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-starter-test</artifactId>
  27. <exclusions>
  28. <exclusion>
  29. <groupId>org.junit.vintage</groupId>
  30. <artifactId>junit-vintage-engine</artifactId>
  31. </exclusion>
  32. </exclusions>
  33. </dependency>
  34. </dependencies>

3、创建配置类

  1. # 服务端口
  2. server:
  3. port: 9000
  4. spring:
  5. application:
  6. name: service-provider-consul #应用名称
  7. # 配置Consul注册中心
  8. cloud:
  9. consul:
  10. # 注册中心的访问地址
  11. host: localhost
  12. port: 8500
  13. # 服务提供者信息
  14. discovery:
  15. register: true # 是否需要注册
  16. instance-id: ${spring.application.name}-01 # 注册实例id(必须唯一)
  17. service-name: ${spring.application.name} # 服务名称
  18. port: ${server.port} # 服务端口
  19. prefer-ip-address: true # 是否使用ip地址注册
  20. ip-address: ${spring.cloud.client.ip-address} # 服务请求ip

3、实体类:ProductDto

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class ProductDto implements Serializable {
  5. private Integer id;
  6. private String productName;
  7. private Integer productNum;
  8. private Double productPrice;
  9. }

4、Service:

  1. @Service
  2. public class ProductService {
  3. public List<ProductDto> selectProductList() {
  4. return Arrays.asList(
  5. new ProductDto(1, "华为手机", 2, 5888D),
  6. new ProductDto(2, "联想笔记本", 1, 6888D),
  7. new ProductDto(3, "小米平板", 5, 2666D)
  8. );
  9. }
  10. }

5、Controller:

  1. @RestController
  2. @RequestMapping("/product")
  3. public class ProductController {
  4. @Autowired
  5. private ProductService productService;
  6. @GetMapping("/list")
  7. public List<ProductDto> selectProductList() {
  8. return productService.selectProductList();
  9. }
  10. }

6、启动类

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