---
url: /diary/spring/consul/index.md
description: Spring Cloud 学习笔记第三篇，Consul 服务注册与发现，包括安装配置和服务提供者消费者的实现。
---
## 安装

1. win10使用consul
   * [安装地址](https://developer.hashicorp.com/consul/install)
   * [安装使用教程](https://learn.hashicorp.com/consul/getting-started/install)

## 提供者

### 添加pom依赖

```xml

<dependencies>
    <!--SpringCloud consul-server -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
</dependencies>
```

### 配置application.yml

```yml
###consul服务端口号
server:
  port: 8006

spring:
  application:
    name: consul-provider-payment
  ####consul注册中心地址
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        #hostname: 127.0.0.1
        service-name: ${spring.application.name}
```

### 主启动

```java
@SpringBootApplication
@EnableDiscoveryClient //用于zookeeper 和 consul 服务发现 
public class ConsulMain8006 {
    public static void main(String[] args) {
        SpringApplication.run(ConsulMain8006.class, args);
    }
}
```

### 流程代码

```java
@RestController
public class PaymentController {

    @Value("${server.port}")
    private String serverPort;


    @RequestMapping("/payment/consul")
    public String paymentConsul() {
        return "springCloud whit consul:" + serverPort + "\t" + UUID.randomUUID().toString();
    }
}
```

## 消费者

### 添加pom依赖

```xml

<dependencies>
    <!--SpringCloud consul-server -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
</dependencies>
```

### 修改 application.yml

```yml
###consul服务端口号
server:
  port: 80

spring:
  application:
    name: cloud-consumer-order
  ####consul注册中心地址
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        #hostname: 127.0.0.1
        service-name: ${spring.application.name}
```

### 主启动

```java
@SpringBootApplication
@EnableDiscoveryClient  //用于zookeeper 和 consul 服务发现 eureka消费者模块不用
public class OrderConsulMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderConsulMain80.class, args);
    }
}
```

### 开启负载均衡

```java
@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced  //开启负载均衡
    public  RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

}
```

### 流程代码

```java
@RestController
@Slf4j
public class OrderController {
    public static final String INVOKE_URI = "http://consul-provider-payment";

    @Resource
    private RestTemplate restTemplate;


    @GetMapping("/consumer/payment/consul")
    public String paymentInfo() {
        return restTemplate.getForObject(INVOKE_URI + "/payment/consul", String.class);
    }
}
```

## 总结

### consul zookeeper eureka 区别

|    组件     |  语言  | CAP | 服务健康检查 |  对外暴露接口  | SpringCloud集成 |
|:---------:|:----:|:---:|:------:|:--------:|:-------------:|
|  Eureka   | Java | AP  |  可配支持  |   HTTP   |      已集成      |
|  Consul   |  Go  | CP  |   支持   | HTTP/DNS |      已集成      |
| Zookeeper | Java | CP  |   支持   |   客户端    |      已集成      |

### CAP

| 标题 | 描述                           |
|----|------------------------------|
| C  | Consistency（强一致性）            |
| A  | Availability (可用性)           |
| P  | Partition tolerance  (分区容错性) |

CAP理论关注粒度是数据，而不是整体系统设计。

### consul zookeeper eureka 的CAP选型

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

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

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

| 组合 | 结论                              |
|----|---------------------------------|
| CA | 单点集群，满足一致性，可用性的系统，通常在可扩展性上不太强大。 |
| CP | 满足一致性，分区容忍性的系统，通常性能不是特别高        |
| AP | 满足可用性，分区容忍性的系统，通常可能对一致性要求低一些。   |
