Consul 服务注册与发现

Dear 丶 2022-12-29 04:41 388阅读 0赞

Consul 服务注册与发现

  • 1-Consul 概述
    • 1.1-是什么
    • 1.2-能干嘛
    • 1.3-去哪下
    • 1.4-怎么玩
  • 2-Consul 安装
    • 2.1-Consul 下载
    • 2.1-Consul 安装
  • 3-Consul 服务注册
    • 3.1-提供者服务 cloud-providerconsul-payment8006
    • 3.2-消费者服务 cloud-consumerconsul-order80
  • 4-注册中心(Eureka、Zookeeper、Consul)异同点
    • 4.1-经典 CAP 图
    • 4.2-AP(Eureka)
    • 4.3- CP(Zookeeper、Consul)

1-Consul 概述

1.1-是什么

https://www.consul.io/intro/index.html
在这里插入图片描述
Consul 是一套开源的分布式服务发现和配置管理系统,由 HashiCorp 公司用 Go 语言开发

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

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

1.2-能干嘛

SpringCloud Consul 特性:

  • 服务发现

    提供 Http 和 DNS 两种发现方式。

  • 健康监测

    支持多种协议,Http、Tcp、Docker、Shell 脚本定制化。

  • KV存储

    Key、Value 的存储方式。

  • 多数据中心

    Consul 支持多数据中心。

  • 可视化 Web 界面

1.3-去哪下

https://www.consul.io/downloads.html

1.4-怎么玩

https://www.springcloud.cc/spring-cloud-consul.html


2-Consul 安装

官网:https://learn.hashicorp.com/tutorials/consul/get-started-install

2.1-Consul 下载

  • 官方:https://www.consul.io/downloads
  • 百度云:

    • 链接:https://pan.baidu.com/s/1ThUbzsVuM8RRgPsrRa-_hA
    • 提取码:1104

2.1-Consul 安装

a、解压 Consul 压缩包(consul_1.9.1_windows_amd64.zip)
在这里插入图片描述
在这里插入图片描述
b、查看 Consul 版本信息

  1. consul --version

在这里插入图片描述
c、启动 Consul(开发模式)

  1. consul agent -dev

在这里插入图片描述
d、查看 Consul 首页:http://localhost:8500
在这里插入图片描述


3-Consul 服务注册

3.1-提供者服务 cloud-providerconsul-payment8006

a、右击父工程 mscloud,新建子模块 cloud-providerconsul-payment8006
在这里插入图片描述
b、修改子模块 cloud-providerconsul-payment8006 中 pom.xml

  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. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <artifactId>cloud2020</artifactId>
  8. <groupId>com.atguigu.springcloud</groupId>
  9. <version>1.0-SNAPSHOT</version>
  10. </parent>
  11. <artifactId>cloud-providerconsul-payment8006</artifactId>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>com.atguigu.springcloud</groupId>
  19. <artifactId>cloud-api-commons</artifactId>
  20. <version>${project.version}</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-actuator</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-devtools</artifactId>
  33. <scope>runtime</scope>
  34. <optional>true</optional>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.projectlombok</groupId>
  38. <artifactId>lombok</artifactId>
  39. <optional>true</optional>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-starter-test</artifactId>
  44. <scope>test</scope>
  45. </dependency>
  46. </dependencies>
  47. </project>

c、修改子模块 cloud-providerconsul-payment8006,目录 /src/main/resources 中新建 application.yml

  1. server:
  2. port: 8006
  3. spring:
  4. application:
  5. name: consul-provider-payment
  6. cloud:
  7. consul:
  8. host: localhost
  9. port: 8500
  10. discovery:
  11. service-name: ${spring.application.name}

d、修改子模块 cloud-providerconsul-payment8006,目录 /src/main/java 中新建包 com.atguigu.springcloud

e、修改子模块 cloud-providerconsul-payment8006,包 com.atguigu.springcloud 中新建启动类 PaymentMain8006.java

  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. public static void main(String[] args) {
  9. SpringApplication.run(PaymentMain8006.class, args);
  10. }
  11. }

f、修改子模块 cloud-providerconsul-payment8006,目录 /src/main/java 中新建包 com.atguigu.springcloud.controller

g、修改子模块 cloud-providerconsul-payment8006,包 com.atguigu.springcloud.controller 中新建 PaymentController.java

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

h、测试子模块 cloud-providerconsul-payment8006

  • 启动子模块 cloud-providerconsul-payment8006
  • http://localhost:8006/payment/consul
    在这里插入图片描述
  • http://localhost:8500
    在这里插入图片描述
    在这里插入图片描述

3.2-消费者服务 cloud-consumerconsul-order80

a、右击父工程 mscloud,新建子模块 cloud-consumerconsul-order80
在这里插入图片描述
b、修改子模块 cloud-consumerconsul-order80 中 pom.xml

  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. <modelVersion>4.0.0</modelVersion>
  6. <parent>
  7. <artifactId>cloud2020</artifactId>
  8. <groupId>com.atguigu.springcloud</groupId>
  9. <version>1.0-SNAPSHOT</version>
  10. </parent>
  11. <artifactId>cloud-consumerconsul-order80</artifactId>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework.cloud</groupId>
  15. <artifactId>spring-cloud-starter-consul-discovery</artifactId>
  16. </dependency>
  17. <dependency>
  18. <groupId>com.atguigu.springcloud</groupId>
  19. <artifactId>cloud-api-commons</artifactId>
  20. <version>${project.version}</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-actuator</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework.boot</groupId>
  32. <artifactId>spring-boot-devtools</artifactId>
  33. <scope>runtime</scope>
  34. <optional>true</optional>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.projectlombok</groupId>
  38. <artifactId>lombok</artifactId>
  39. <optional>true</optional>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-starter-test</artifactId>
  44. <scope>test</scope>
  45. </dependency>
  46. </dependencies>
  47. </project>

c、修改子模块 cloud-consumerconsul-order80,目录 /src/main/resources 中新建 application.yml

  1. server:
  2. port: 80
  3. spring:
  4. application:
  5. name: consul-consumer-order
  6. cloud:
  7. consul:
  8. host: localhost
  9. port: 8500
  10. discovery:
  11. service-name: ${spring.application.name}

d、修改子模块 cloud-consumerconsul-order80,目录 /src/main/java 中新建包 com.atguigu.springcloud

e、修改子模块 cloud-consumerconsul-order80,包 com.atguigu.springcloud 中新建启动类 OrderConsulMain80.java

  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 OrderConsulMain80 {
  8. public static void main(String[] args) {
  9. SpringApplication.run(OrderConsulMain80.class, args);
  10. }
  11. }

f、修改子模块 cloud-consumerconsul-order80,目录 /src/main/java 中新建包 com.atguigu.springcloud.config

g、修改子模块 cloud-consumerconsul-order80,包 com.atguigu.springcloud.config 中新建 ApplicationContextConfig.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 ApplicationContextConfig {
  8. @Bean
  9. @LoadBalanced
  10. public RestTemplate getRestTemplate() {
  11. return new RestTemplate();
  12. }
  13. }

h、修改子模块 cloud-consumerconsul-order80,目录 /src/main/java 中新建包 com.atguigu.springcloud.controller

i、修改子模块 cloud-consumerconsul-order80,包 com.atguigu.springcloud.controller 中新建 OrderConsulController.java

  1. package com.atguigu.springcloud.controller;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.web.bind.annotation.GetMapping;
  4. import org.springframework.web.bind.annotation.RestController;
  5. import org.springframework.web.client.RestTemplate;
  6. import javax.annotation.Resource;
  7. @RestController
  8. @Slf4j
  9. public class OrderConsulController {
  10. public static final String INVOME_URL = "http://consul-provider-payment";
  11. @Resource
  12. private RestTemplate restTemplate;
  13. @GetMapping("/consumer/payment/consul")
  14. public String payment() {
  15. String result = restTemplate.getForObject(INVOME_URL + "/payment/consul", String.class);
  16. return result;
  17. }
  18. }

j、测试子模块 cloud-consumerconsul-order80

  • 启动子模块 cloud-providerconsul-payment8006
  • http://localhost:8006/payment/consul
    在这里插入图片描述
  • 启动子模块 cloud-consumerconsul-order80
  • http://localhost:8500
    在这里插入图片描述
  • http://localhost/consumer/payment/consul
    在这里插入图片描述

4-注册中心(Eureka、Zookeeper、Consul)异同点

CAP

  • C:Consistency(强一致性)
  • A:Availability(可用性)
  • P:Partition Tolerance(分区容错)

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

4.1-经典 CAP 图

在这里插入图片描述
最多只能同时较好的满足两个

CAP 理论的核心是:一个分布式系统不可能同时很好的满足一致性、可用性、分区容错性这三个需求。因此根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三大类:

  • CA:单点集群、满足一致性、可用性的系统。通常在可扩展性上不太强大。
  • CP:满足一致性、分区容忍必的系统。通常性能不是特别高。
  • AP:满足可用性、分区容忍性的系统。通堂可能对—致性要求低一些。

4.2-AP(Eureka)

AP 架构

当网络分区出现后,为了保证可用性,系统 B 可以返回旧值,保证系统的可用性。

结论:违背了一致性 C 的要求,只满足可用性和分区容错,即 AP
在这里插入图片描述

4.3- CP(Zookeeper、Consul)

CP 架构:

当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性。

结论:违背了可用性 A 的要求,只满足一致性和分区容错,即 CP
在这里插入图片描述


发表评论

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

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

相关阅读