我們在進行開發分散式架構的系統時,有一個不可或缺的工具那就是服務治理元件,我們可以通過它來實現服務的註冊、釋出和呼叫,可以理解為它維護著我們所有服務的花名冊。目前主流的服務治理中心有Zookeeper
、Eureka
、Nacos
等,但是今天這裡我想和大家介紹一下另一種服務治理元件—Consul
。
Nacos的使用可以參考我的部落格:Nacos服務治理中心和設定中心
Consul是一個Spring Cloud
中整合好的開源的分散式的服務註冊發現中心。
由Go
語言編寫。支援健康檢查,多資料中心還支援k-v儲存,採用Raft
一致性演演算法,保證強一致性,可用性。並且和docker
完美相容。
Consul本身也是一種服務治理中心,相對於Eureka
而言:
Consul
犧牲了部分的效能,保證了服務的強一致性。Eureka
只要服務註冊到主節點,就認為服務註冊成功,不關其他節點是否可以正常呼叫。Consul vs Eureka vs Zookeeper
CAP
原理分別指的是,資料一致性、資料可用性、分割區耐受性 ,這裡AP
和CP
分別指的是:
AP模式
: 犧牲強一致性,部分節點宕機,不會影響正常工作的節點。CP模式
: 犧牲資料可用性,為了保證資料的一致性,當一臺機器出現故障時,所有節點的資料都不能使用。一致性演演算法,使一組伺服器在一個值上達成一致,所以活躍的特徵在於最終每個伺服器都可以決定一個值。通過值的一致能夠實現對同一個資料的請求會讓同一個伺服器來處理。Paxos
和Raft
都是通過選取master
來實現多節點下值的一致性。
第一步:下載consul
根據自身的系統從官網選擇合適的版本。我這裡使用的是Mac
,可以直接使用brew
下載
同樣使用Mac的小夥伴可以參考我的部落格:使用Mac系統來進行Java程式設計
brew install consul
第二步:啟動consul
./consul agent -dev -ui -client 0.0.0.0
啟動命令各引數說明:
agent
:Consul
的核心命令,主要作用有維護成員資訊、執行狀態檢測、宣告服務以及處理請求等-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介面
Maven依賴
Consul
對於SpringBoot
和SpringCloud
的版本有著一定的要求,所以這裡展示範例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介面看到新註冊的服務