springcloud-Consul服务注册与发现(三)

Consul简介

  • 是什么
  1. Consul是一套开源的分布式服务发现和配置管理系统, 由Go语言开发.
  2. 提供了微服务系统中的服务治理, 配置中心, 控制总线等功能. 这些功能中的每个都可以根据需要单独使用, 也可以一起使用以构建全方位的服务网格, 总之Consul提供了一种完整的服务网格解决方案.
  3. Consul中文文档: https://www.springcloud.cc/spring-cloud-consul.html
  • 能干什么
  1. 服务发现  ->  提供HTTP和DNS两种发现方式
  2. 健康检测  ->  支持多种协议 HTTP, TCP, Docker, Shell脚本定制化
  3. KV存储  ->  Key, Value的存储方式
  4. 多数据中心  ->  Consul支持多数据中心
  5. 天生自带可视化Web界面.
  • 安装与运行
  1. 下载完解压后只有一个consul.exe文件, 在cmd下查看版本: consul --version
  2. 在cmd下启动: consul agent -dev
  3. 通过一下地址访问Consul的首页: http://localhost:8500

服务提供者注册进Consul

  1. 新建Module支付服务cloud-providerconsul-payment8006
  2. pom中增加如下依赖
    <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
  3. yml
    #consul服务端口号
    server:
      port: 8006
    
    spring:
      application:
        name: consul-provider-payment
      cloud:
        consul: #consul注册中心
          host: localhost
          port: 8500
          discovery:
            service-name: ${spring.application.name}
            #hostname: 127.0.0.1
  4. 主启动类
    @EnableDiscoveryClient
    @SpringBootApplication
    public class PaymentMain8006 {
    
        public static void main(String[] args) {
            SpringApplication.run(PaymentMain8006.class, args);
        }
    }
  5. 业务类Controller
    @RestController
    @Slf4j
    public class PaymentController {
    
        @Value("${server.port}")
        private String serverPort;
    
        @GetMapping("/payment/consul")
        public String paymentConsul() {
    
            return "SpringCloud with consul: " + serverPort + "\t" + UUID.randomUUID().toString();
        }
    }
  6. 测试
    • http://localhost:8006/payment/consul

服务消费者注册进Consul

  1. 新建Module消费服务cloud-consumerconsul-order80
  2. pom
    <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-consul-discovery</artifactId>
            </dependency>
    
            <dependency>
                <groupId>springcloud</groupId>
                <artifactId>cloud-api-commons</artifactId>
                <version>${project.version}</version>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <optional>true</optional>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>
  3. yml
    #consul服务端口号
    server:
      port: 80
    
    spring:
      application:
        name: consul-consumer-order
      cloud:
        consul: #consul注册中心
          host: localhost
          port: 8500
          discovery:
            service-name: ${spring.application.name}
            #hostname: 127.0.0.1
  4. 主启动类
    @SpringBootApplication
    @EnableDiscoveryClient
    public class OrderConsulMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderConsulMain80.class,args);
        }
    }
  5. 配置Bean(RestTemplate)
    @Configuration
    public class ApplicationContextConfig {
    
        @LoadBalanced
        @Bean
        public RestTemplate getRestTemplate() {
            return new RestTemplate();
        }
    }
  6. controller
    @RestController
    @Slf4j
    public class OrderConsulController {
    
        private static final String INVOKE_URL = "http://consul-provider-payment";
    
        @Resource
        private RestTemplate restTemplate;
    
        @GetMapping("/consumer/consul")
        public String paymentInfo() {
    
            String url = INVOKE_URL + "/payment/consul/";
            String result = restTemplate.getForObject(url, String.class);
            return result;
        }
    }
  7. 测试
    • http://localhost/consumer/payment/consul

与Eureka的区别

  • 异同
  • CAP理论
  1. C: Consistency - 强一致性
  2. A: Availability - 可用性
  3. P: Partition tolerance - 分区容错
  4. CAP理论关注的是数据, 而不是整体系统设计的策略
  • 经典的CAP
  1. CAP理论的核心: 一个分布式系统不可能同时很好的满足一致性, 可用性和分区容错性这三个需求.
  2. AP - Eureka
    • 当网络分区出现后, 为了保证可用性, 系统B可以返回旧值, 保证系统的可用性. 但违背了一致性C的要求.
  3. CP -  Consul
    • 当网络分区出现后, 为了保证一致性, 就必须拒接请求, 否则无法保证一致性, 但违背了可用性A的要求.

猜你喜欢

转载自www.cnblogs.com/binwenhome/p/13183665.html