1. 程式人生 > 實用技巧 >【SpringCloud】Consul服務註冊與發現

【SpringCloud】Consul服務註冊與發現

Consul服務註冊與發現

Consul簡介

是什麼

https://www.consul.io/intro/index.html


Consul是一開源的分散式服務發現和配置管理系統,由HashiCorp公司用Go語言開發。

提供了微服務系統中的服務治理、配置中心控制匯流排等功能。這些功能中的每一個都可以根據需要單獨使用,也可以-起使用以構建全方位的服務網格,總之Consul提供了一種完整的服務網格解決方案。

它具有很多優點。包括:基於raft協議,比較簡潔;支援健康檢查, 同時支援HTTP和DNS協議支援跨資料中心的WAN叢集提供圖形介面跨平臺,支援Linux、Mac、 Windows

能幹嘛

服務發現

提供HTTP/DNS兩種發現方式

健康檢測

支援多種方式,HTTP、TCP、Docker、shell指令碼定製化

KV儲存

Key、Value的儲存方式

多資料中心

Consul支援多資料中心

視覺化介面

去哪下

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

怎麼玩

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

安裝並執行Consul

官網說明

https://learn.hashicorp.com/consul/getting-started/install.html

下載完成後只有一個consul.exe檔案 硬碟路徑下雙擊執行,檢視版本資訊

consul --version

使用開發模式啟動

consul agent -dev

通過以下地址可以訪問Consul的首頁: http://localhost:8500

結果頁面

服務提供者

新建Module支付服務provider8006

cloud-providerconsul-payment8006

POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-providerconsul-payment8006</artifactId>
    <description>支付服務的提供者之註冊中心consul</description>

    <dependencies>
        <!--SpringCloud consul-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-common</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>
</project>

YML

server:
  # consul服務埠
  port: 8006
spring:
  application:
    name: cloud-provider-payment
  cloud:
    consul:
      # consul註冊中心地址
      host: localhost
      port: 8500
      discovery:
        hostname: 127.0.0.1
        service-name: ${spring.application.name}

主啟動類

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 *
 * @author zzyy
 * @create 2020/2/17 21:13
 **/
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8006 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8006.class, args);
    }
}

業務類Controller

package com.atguigu.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

/**
 * @author zzyy
 * @create 2020-01-30 16:55
 **/
@RestController
@Slf4j
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @RequestMapping(value = "payment/consul")
    public String paymentConsul() {
        return "SpringCloud with consul:" + serverPort + "\t" + UUID.randomUUID().toString();
    }
}

驗證測試

http://localhost:8006/payment/consul

服務消費者

新建Module消費服務order80

cloud-consumerconsul-order80

POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud2020</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumerconsul-payment80</artifactId>
    <description>服務消費者之註冊中心consul</description>

    <dependencies>
        <!--SpringCloud consul-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-common</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>


</project>

YML

server:
  port: 80
spring:
  application:
    name: cloud-consumer-order
  cloud:
    consul:
      # consul註冊中心地址
      host: localhost
      port: 8500
      discovery:
        hostname: 127.0.0.1
        service-name: ${spring.application.name}

主啟動類

package com.atguigu.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @author zzyy
 * @date 2020/02/18 17:20
 **/
@SpringBootApplication
@EnableDiscoveryClient
public class OrderConsulMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderConsulMain80.class, args);
    }
}

配置bean

配置一個和其他order一樣的ApplicationContextConfig

Controller

@RestController
@Slf4j
public class OrderConsulController {


    private static  final String INVOKE_URL = "http://consul-provider-payment";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "/consumer/payment/consul")
    public String paymentInfo() {
        String result = restTemplate.getForObject(INVOKE_URL+"/payment/consul",String.class);
        return result;
    }
}

驗證測試

訪問測試地址

http://localhost/consumer/payment/consul

三個註冊中心異同點

元件名 語言 CAP 服務健康檢查 對外暴露介面 SpringCloud整合
Eureka Java AP 可配支援 HTTP 已整合
Consul Go CP 支援 HTTP/DNS 已整合
Zookeeper Java CP 支援 客戶端 已整合

CAP

在分散式中,分割槽容錯性要保證,所以要麼是CP,要麼是AP

  • C: Consistency(強一致性)
  • A: Availability(可用性)
  • P: Parttition tolerance(分割槽容錯性)

CAP理論關注粒度是否是資料,而不是整體系統設計的策略

經典CAP圖

最多隻能同時較好的滿足兩個。
CAP理論的核心是:一個分散式系統不可能同時很好的滿足一致性,可用性和分割槽容錯性這三個需求,
因此,根據CAP原理將NoSQL資料庫分成了滿足CA原則、滿足CP原則和滿足AP原則三大類:

  • CA:單點叢集,滿足一致性,可用性的系統,通常在可擴充套件性壞太強大。
  • CP:滿足一致性,分割槽容忍必的系統,通常效能不是特別高。
  • AP:滿足可用性,分割槽容忍性的系統,通常可能對一致性要求低一些。

AP(eureka)

CP(Zookeeper/Consul)

CP架構
當網路分割槽出現後,為了保證一致性,就必須拒絕請求,否則無法保證一致性
結論:違背了可用性A的要求,只滿足一致性和分割槽容錯,即CP