服務註冊中心-Consul
阿新 • • 發佈:2021-06-30
Consul官方文件
官方文件:https://www.consul.io/docs/intro
中文文件:https://www.springcloud.cc/spring-cloud-consul.html
Consul簡介
Consul是一套開源的分散式服務發現和配置管理系統,由HashiCorp公司用Go語言開發。
提供了微服務系統中的服務治理、配置中心、控制匯流排等功能。這些功能中的每一個都可以根據需要單獨使用,也可以一起使用以構建全方位的服務網格,總之Consul提供了一種完整的服務網格解決方案。
它具有很多優點。包括:基於raft協議,比較簡潔;支援健康檢查,同時支援HTTP和DNS協議;支援跨資料中心的WAN叢集;提供圖形介面;跨平臺,支援Linux、Mac、Windows。
Consul主要特點
Consul 的主要特點是:
- 服務發現:Consul 的客戶端可以註冊一個服務,例如
api
或mysql
,其他客戶端可以使用 Consul 來發現給定服務的提供者。使用 DNS 或 HTTP,應用程式可以輕鬆找到它們所依賴的服務。 - 健康檢查:Consul 客戶端可以提供任意數量的健康檢查,要麼與給定的服務相關聯(“網路伺服器是否返回 200 OK”),要麼與本地節點(“記憶體利用率是否低於 90%”)相關聯。操作員可以使用此資訊來監控叢集健康狀況,並且服務發現元件可以使用它來將流量路由到不健康的主機之外。
- KV 儲存:應用程式可以將 Consul 的分層鍵/值儲存用於多種目的,包括動態配置、功能標記、協調、領導選舉等。簡單的 HTTP API 使其易於使用。
- 安全服務通訊:Consul 可以為服務生成和分發 TLS 證書,以建立相互的 TLS 連線。 意圖 可用於定義允許哪些服務進行通訊。可以通過實時更改意圖輕鬆管理服務分段,而不是使用複雜的網路拓撲和靜態防火牆規則。
- 多資料中心:Consul 支援開箱即用的多個數據中心。這意味著 Consul 的使用者不必擔心構建額外的抽象層以擴充套件到多個區域。
Consul 旨在對 DevOps 社群和應用程式開發人員友好,使其非常適合現代、彈性的基礎設施。
Consul下載
https://www.consul.io/downloads.html
安裝並執行Consul
- 下載完成後只有一個consul.exe檔案,使用開發模式啟動 consul agent -dev。
- 通過http://localhost:8500地址訪問Consul的首頁。
- 結果頁面
Springcloud中Consul的使用
服務提供者
-
新建Module支付服務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檔案
application.ymlserver: # 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; @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;
@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();
}
}
- 驗證執行
啟動PaymentMain8006啟動類,訪問Consul首頁http://localhost:8500檢視是否載入到consul控制中心。
訪問網址http://localhost:8006/payment/consul 檢視是否顯示資訊。
服務消費者
-
新建Module消費服務cloud-consumerconsul-order80
步驟同上
-
POM檔案
application.xml
<!--?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
package com.whpu.springcloud.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; @Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){ return new RestTemplate(); } }
-
Controller
package com.whpu.springcloud.controller; import com.whpu.springcloud.entities.CommonResult; import com.whpu.springcloud.entities.Payment; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; @RestController @Slf4j public class OrderConsulController { //public static final String PAYMENT_URL = "http://localhost:8006"; public static final String INVOKE_URL = "http://cloud-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; } }
-
驗證測試