Consul服務註冊與發現
學習地址:https://www.bilibili.com/video/BV18E411x7eT?p=31
Cousul簡介
官網: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支援多資料中心
- 視覺化Web介面
安裝執行
官網安裝說明:https://learn.hashicorp.com/consul/getting-started/install.html
# 檢視版本資訊 consul --version
# 使用開發模式啟動
consul agent -dev
// 訪問Web首頁
http://localhost:8500
服務提供者
cloud-providerconsul-payment8006
-
建module
-
寫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>springcloud2020</artifactId> <groupId>com.nuc.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-providerconsul-payment8006</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>com.nuc.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> </project>
- 寫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}
- 主啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain8006 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8006.class,args);
}
}
- 業務類
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/consul")
public String paymentConsul(){
return "springcloud with consul: "+serverPort+"\t"+ UUID.randomUUID().toString();
}
}
- 測試
http://localhost:8006/payment/consul
服務消費者
cloud-consumerconsul-order80
-
建module
-
寫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>springcloud2020</artifactId>
<groupId>com.nuc.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-consumerconsul-order80</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.nuc.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>
</project>
- 寫YML
server:
port: 80
spring:
application:
name: consul-consumer-order
cloud:
consul:
host: localhost
port: 8500
discovery:
service-name: ${spring.application.name}
- 主啟動類
@SpringBootApplication
@EnableDiscoveryClient
public class OrderConsulMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderConsulMain80.class,args);
}
}
- 業務類
- 配置Bean
@Configuration
public class ApplicationContextConfig {
@LoadBalanced
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
- Controller
@RestController
@Slf4j
public class OrderConsulController {
public static final String INVOME_URL = "http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/consul")
public String payment() {
String result = restTemplate.getForObject(INVOME_URL + "/payment/consul", String.class);
return result;
}
}
- 測試
http://localhost/consumer/payment/consul
三個註冊中心異同點
Eureka、Consul、Zookeeper比較
元件名 | 語言 | CAP | 服務健康檢查 | 對外暴露介面 | Spring Cloud整合 |
---|---|---|---|---|---|
Eureka | Java | AP | 可配支援 | HTTP | 已整合 |
Consul | Go | CP | 支援 | HTTP/DNS | 已整合 |
Zookeeper | Java | CP | 支援 | 客戶端 | 已整合 |
CAP
-
C:Consistency(強一致性)
-
A:Availability(可用性)
-
P:Partition tolerance(分割槽容錯)
- CAP理論關注粒度是資料,而不是整體系統設計的策略
-
最多隻能同時較好的滿足兩個。
-
CAP理論的核心是:一個分散式系統不可能同時很好滿足一致性,可用性和分割槽容錯性這三個需求,因此,根據CAP原理將NoSQL資料庫分成了滿足CA原則、滿足CP原則和滿足AP原則三大類:
-
CA-單點叢集,滿足一致性,可用性的系統,通常在可擴充套件性上不太強大。
-
CP-滿足一致性,分割槽容忍性的系統,通常效能不是特別高。
-
AP-滿足可用性,分割槽容忍性的系統,通常可能對一致性要求低一些。
-
AP(Eureka)
AP框架,當網路分割槽出現後,為了保證可用性,系統B可以返回舊值,保證系統的可用性。
違背了一致性C的要求,只滿足可用性和分割槽容錯,即AP
CP(Zookeeper/Consul)
CP架構,當網路分割槽出現後,為了保證一致性,就必須拒接請求,否則無法保證一致性
違背了可用性A的要求,只滿足一致性和分割槽容錯,即CP