Consul服務註冊與發現
-- --
Consul官網:https://www.consul.io/
Consul中文文檔:https://www.springcloud.cc/spring-cloud-consul.html
簡介
Consul是一種服務網格解決方案,提供具有服務發現,配置和分段功能的全功能控制平面。這些功能中的每一個都可以根據需要單獨使用,也可以一起使用以構建完整的服務網格。Consul需要一個數據平面,並支持代理和本機集成模型。Consul附帶了一個簡單的內置代理,因此一切都可以直接使用,還支持Envoy等第三方代理集成。
Consul 是一套開源的分佈式中的服務治理、配置中心、控制總線功能。這些功能中的每一個都可以根據需要單獨使用,也可以一起使用以構建全方位的服務網格,總之 Consul 提供了一種完整的服務網格解決方案
它具有很多有點。包括:基於 raft 協議,比較簡潔;支持健康檢查,同時支持HTTP 和 DNS 協議,支持跨數據中心的WAN集群 提供圖形界面,跨平臺,支持 linux mac windows
主要特點
- 服務發現:Consul 的客戶端可以註冊服務,例如 api 或者 mysql ,其他客戶端可以使用 Consul 來發現給定服務的提供者。使用DNS 或者 HTTP ,應用程序可以輕鬆找到他們依賴的服務
- 健康檢查:領事客戶端可以提供任意數量的運行狀況檢查,這些檢查可以與給定服務(“ Web服務器是否返回200 OK”)或本地節點(“內存利用率低於90%”)相關。操作員可以使用此信息來監視群集的運行狀況,服務發現組件可以使用此信息將流量從不正常的主機發送出去。
- KV存儲:應用程序可以將Consul的分層鍵/值存儲用於多種目的,包括動態配置,功能標記,協調,領導者選舉等。簡單的HTTP API使其易於使用。
- 安全的服務通信:領事可以為服務生成並分發TLS證書,以簡歷相互TLS連接。意圖 可用於定義允許那些服務進行通信,可以使用可以實時更改的意圖輕鬆管理服務分段,而不必使用複雜的網絡拓撲和靜態防火牆規則。
- 多數據中心:Consul開箱即用地支持多個數據中心。這意味著Consul的用戶不必擔心會構建其他抽象層以擴展到多個區域。
在docker上安裝啟動consul
#拉取consul鏡像
docker pull consul
#啟動consul
docker run -d -p 8500:8500/tcp --name myConsul consul agent -server -ui -bootstrap-expect=1 -client=0.0.0.0
訪問 : http://http:// xx.xx.xx.xx/:8500 (linux的IP地址加上冒號8500, xx代表服務器ip地址)
服務提供者
- pom文件
<!--SpringCloud consul-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
- yml文件
server:
port: 8006
spring:
application:
name: consul-provider-payment
cloud:
consul:
host: 10.211.55.17 #用linux的ip地址(consul在本機就填localhost)
port: 8500
discovery:
service-name: ${spring.application.name}
- springboot 啟動類增加註解
@EnableDiscoveryClient //該註解用於向使用consul或者Zookeeper作為註冊中心時註冊服務
- 編寫測試Controller
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}") //獲取端口號
private String serverPort;
@RequestMapping("/payment/consul")
public String paymentConsul(){
return "springcloud with zookeeper:" + serverPort + "\t" + UUID.randomUUID().toString();
}
}
- 啟動項目
服務消費者
和消費者相同除了端口
- 控制層 RestTemplate 遠程調用
@RestController
@Slf4j
public class OrderConsulController {
public static final String INVOKE_URL = "http://consul-provider-payment";
@Resource
private RestTemplate restTemplate;
@RequestMapping("/consumer/payment/consul")
public String paymentInfo(){
String result = restTemplate.getForObject(INVOKE_URL + "/payment/consul", String.class);
return result;
}
}
啟動