SpringCloud使用Consul作為服務治理中心

2020-10-02 16:00:07

SpringCloud使用Consul作為服務治理中心

前言

我們在進行開發分散式架構的系統時,有一個不可或缺的工具那就是服務治理元件,我們可以通過它來實現服務的註冊、釋出和呼叫,可以理解為它維護著我們所有服務的花名冊。目前主流的服務治理中心有ZookeeperEurekaNacos等,但是今天這裡我想和大家介紹一下另一種服務治理元件—Consul

Nacos的使用可以參考我的部落格Nacos服務治理中心和設定中心

正文

Consul

Consul是一個Spring Cloud 中整合好的開源的分散式的服務註冊發現中心。
Go語言編寫。支援健康檢查,多資料中心還支援k-v儲存,採用Raft一致性演演算法,保證強一致性,可用性。並且和docker完美相容。

Consul本身也是一種服務治理中心,相對於Eureka而言:

  • Consul犧牲了部分的效能,保證了服務的強一致性。
  • Eureka只要服務註冊到主節點,就認為服務註冊成功,不關其他節點是否可以正常呼叫。

Consul vs Eureka vs Zookeeper

在這裡插入圖片描述

CAP原理分別指的是,資料一致性、資料可用性、分割區耐受性 ,這裡APCP分別指的是:

  • AP模式: 犧牲強一致性,部分節點宕機,不會影響正常工作的節點。
  • CP模式: 犧牲資料可用性,為了保證資料的一致性,當一臺機器出現故障時,所有節點的資料都不能使用。

一致性演演算法,使一組伺服器在一個值上達成一致,所以活躍的特徵在於最終每個伺服器都可以決定一個值。通過值的一致能夠實現對同一個資料的請求會讓同一個伺服器來處理。PaxosRaft都是通過選取master來實現多節點下值的一致性。

Consul的安裝及啟動

第一步:下載consul
根據自身的系統從官網選擇合適的版本。我這裡使用的是Mac,可以直接使用brew下載
同樣使用Mac的小夥伴可以參考我的部落格:使用Mac系統來進行Java程式設計

brew install consul

第二步:啟動consul

./consul agent -dev -ui -client 0.0.0.0

啟動命令各引數說明:

  • agentConsul的核心命令,主要作用有維護成員資訊、執行狀態檢測、宣告服務以及處理請求等
  • -server:就是代表server模式
  • -ui:代表開啟web 控制檯
  • -bootstrap-expect:代表想要建立的叢集數目,官方建議3或者5
  • -data-dir:資料儲存目錄
  • -node:代表當前node的名稱
  • -client:應該是一個使用者端服務註冊的地址,可以和當前server的一致也可以是其他主機地址,系統預設是127.0.0.1
  • -bind:叢集通訊地址
  • -join:加入的叢集地址

第三步:進入http://localhost:8500/ui/dc1/services進入Consul UI介面
在這裡插入圖片描述

SpringCloud使用Consul作為服務治理中心

Maven依賴

  • Consul對於SpringBootSpringCloud的版本有著一定的要求,所以這裡展示範例demo相對完整的依賴。
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.2.RELEASE</version>
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <lombok-version>1.18.2</lombok-version>
</properties>

<dependencies>
<!--actuator用於檢查節點健康-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

<!--Spring Cloud Consul-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

<!--spring boot-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!--lombok-->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>${lombok-version}</version>
    <optional>true</optional>
</dependency>

</dependencies>

<!--加入Spring Cloud 的Dalston版本的設定依賴-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR4</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

application.properties:設定類

server.port=8080
spring.application.name=springcloud-demo-producer

#consul
spring.cloud.consul.host=127.0.0.1
spring.cloud.consul.port=8500
#健康檢查路徑
spring.cloud.consul.discovery.health-check-path=/actuator/health
spring.cloud.consul.discovery.health-check-interval=15s
spring.cloud.consul.discovery.hostname=127.0.0.1
spring.cloud.consul.discovery.register=true
spring.cloud.consul.discovery.port=${server.port}


#consul service name
spring.cloud.consul.discovery.serviceName=springcloud-demo-producer
spring.cloud.consul.discovery.heartbeat.enabled=true

SpringCloudProducerApp:啟動類

  • @EnableDiscoveryClient:用於向consul或者zookeeper作為註冊中心的時候提供註冊服務
@Slf4j
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
public class SpringCloudProducerApp extends SpringBootServletInitializer {
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SpringCloudProducerApp.class);
    }
    /**
     * 專案的啟動方法
     *
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(SpringCloudProducerApp.class, args);
        log.info("======服務已經啟動========");
    }
}

驗證

啟動專案,進入http://localhost:8500/ui/dc1/servicesConsul UI介面看到新註冊的服務
在這裡插入圖片描述

在這裡插入圖片描述

溪源的奇思妙想 CSDN認證部落格專家 Java Redis 架構
微信公眾號:溪源的奇思妙想
溪源,一個在IT技術圈和經濟學之間的求知者——既對人工智慧、物聯網等前沿技術興致勃勃,又對機會成本、邊際收益等經濟學理論流連忘返。人生是一場孤獨的旅行,只是我還是僥倖期待有同路人,我希望認識同樣熱愛技術、迷戀經濟學的你。