【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