SpringBoot + Spring Cloud Consul 服務註冊和發現
阿新 • • 發佈:2020-07-23
![image.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595433507631-6d8b936d-72dc-4ec2-8148-15ae46e5ee12.png#align=left&display=inline&height=360&margin=%5Bobject%20Object%5D&name=image.png&originHeight=720&originWidth=1280&size=299025&status=done&style=none&width=640)
### 什麼是Consul
Consul 是 HashiCorp 公司推出的開源工具,用於實現分散式系統的服務發現與配置。與其它分散式服務註冊與發現的方案,Consul 的方案更“一站式”,內建了服務註冊與發現框架、分佈一致性協議實現、健康檢查、Key/Value 儲存、多資料中心方案,不再需要依賴其它工具(比如 ZooKeeper 等)。使用起來也較為簡單。Consul 使用 Go 語言編寫,因此具有天然可移植性(支援Linux、windows和Mac OS X);安裝包僅包含一個可執行檔案,方便部署,與 Docker 等輕量級容器可無縫配合。
### Consul安裝
官網(consul.io)最新版本1.8.0 提供了MacOS,Windows, Linux, 如果你不知道怎麼安裝,官方還提供了視訊。
![截圖2020-07-2223.27.02.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595431765966-b700e237-8781-44b5-924f-44749b17dab7.png#align=left&display=inline&height=1324&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.27.02.png&originHeight=1324&originWidth=2696&size=335459&status=done&style=none&width=2696)
我這裡使用docker安裝,安裝過程總結起來為三句話:
docker search consul
docker pull consul
docker run --name consul -d -p 8600:8500 consul
沒問題的話,本機訪問http://localhost:8600則可以開啟consul自帶的管理系統,預設情況下沒有服務註冊進來
![截圖2020-07-2223.31.31.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595431918468-bcfc1618-9b5d-473d-9207-ba4dbbe4acfb.png#align=left&display=inline&height=964&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.31.31.png&originHeight=964&originWidth=1684&size=74733&status=done&style=none&width=1684)
### 準備工作
- 新建父工程, 主要約定SpringCloud, SpringBoot版本號,我使用的是Hoxton.SR1, SpringBoot2.2
- 新建3個子Module,這裡兩個service,一個consumer, 兩個service我用8001和8002埠來區分,主要是想在服務消費時反應客戶端負載均衡。
專案結構如下圖
![截圖2020-07-2223.36.30.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595432208992-cde2d4c8-2a48-4aee-87e5-11e5fddb9909.png#align=left&display=inline&height=2100&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.36.30.png&originHeight=2100&originWidth=3360&size=764356&status=done&style=none&width=3360)
父工程pom.xml
```java
org.springframework.boot
spring-boot-dependencies
2.2.2.RELEASE
pom
import
org.springframework.cloud
spring-cloud-dependencies
Hoxton.SR1
pom
import
```
### 服務提供者
服務註冊中心有了,那麼我們來開發兩個服務提供者,這裡新建了兩個Module,埠8001和8002。兩個Module程式碼相同,主要為了演示負載使用。
#### 新建Module,新增spring-cloud-starter-consul-disconvery依賴
![截圖2020-07-2223.41.10.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595432537286-2ae0749d-5ca3-403a-9672-89ca14547d27.png#align=left&display=inline&height=882&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.41.10.png&originHeight=882&originWidth=884&size=116536&status=done&style=none&width=884)
#### pom.xml
```java
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-consul-discovery
org.springframework.boot
spring-boot-starter-test
```
#### 新增配置(application.yml)
```java
server:
port: 8001
spring:
application:
name: consul-student-service
cloud:
consul:
port: 8600
host: 127.0.0.1
discovery:
service-name: ${spring.application.name}
```
#### 修改啟動類,新增服務
這裡我直接寫了一個測試介面放在啟動類裡。這裡我只貼了埠8001的程式碼,8002程式碼結構相同,只是埠不同。
```java
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulStudentService8001 {
public static void main(String[] args) {
SpringApplication.run(ConsulStudentService8001.class,args);
}
@GetMapping("/student/version")
public String version(){
return "8001,202007222300";
}
}
```
OK,到這一步,啟動兩個服務,不出異常的情況下,可在註冊中心檢視當前的服務例項。
![截圖2020-07-2223.46.48.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595432820305-bce0a4a8-e76c-4b0b-adec-9542b05441e6.png#align=left&display=inline&height=974&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.46.48.png&originHeight=974&originWidth=1914&size=95558&status=done&style=none&width=1914)
![截圖2020-07-2223.47.13.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595432844079-cec3ff61-24a5-4451-9e6a-d39400aab48f.png#align=left&display=inline&height=1032&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.47.13.png&originHeight=1032&originWidth=1700&size=143793&status=done&style=none&width=1700)
![截圖2020-07-2223.47.39.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595432870478-840ef3b2-27d1-4422-b3a6-e0beddaa56b2.png#align=left&display=inline&height=1572&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.47.39.png&originHeight=1572&originWidth=2724&size=262595&status=done&style=none&width=2724)
### Consul消費者 服務註冊中心有了,服務提供者也有了,我們再來開發一個服務消費者。 #### 新建Module,同樣新增spring-cloud-starter-consul-disconvery依賴 #### pom.xml ```java
org.springframework.boot
spring-boot-starter-web
org.springframework.cloud
spring-cloud-starter-consul-discovery
org.springframework.boot
spring-boot-starter-test
```
#### 新增配置(application.yml)
```java
server:
port: 8080
spring:
application:
name: consul-student-consumer
cloud:
consul:
host: 127.0.0.1
port: 8600
discovery:
service-name: ${spring.application.name}
# 不需要註冊到consul中
register: false
```
#### 修改啟動類,呼叫服務
開發RestTemplate配置類,呼叫REST介面時使用。
```java
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
```
修改啟動類
```java
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulStudentConsumer {
public static void main(String[] args) {
SpringApplication.run(ConsulStudentConsumer.class,args);
}
@Autowired
RestTemplate restTemplate;
@GetMapping("/consul/student/version")
public String version(){
//這裡使用服務例項名呼叫REST介面
return restTemplate.getForObject("http://consul-student-service/student/version",String.class);
}
}
```
OK, 這一步完成之後,可以啟動消費者介面,重新整理幾次,從返回結果上能看出來是輪訓呼叫服務提供者介面例項
![截圖2020-07-2223.27.02.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595431765966-b700e237-8781-44b5-924f-44749b17dab7.png#align=left&display=inline&height=1324&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.27.02.png&originHeight=1324&originWidth=2696&size=335459&status=done&style=none&width=2696)
docker search consul
docker pull consul
docker run --name consul -d -p 8600:8500 consul
沒問題的話,本機訪問http://localhost:8600則可以開啟consul自帶的管理系統,預設情況下沒有服務註冊進來
![截圖2020-07-2223.31.31.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595431918468-bcfc1618-9b5d-473d-9207-ba4dbbe4acfb.png#align=left&display=inline&height=964&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.31.31.png&originHeight=964&originWidth=1684&size=74733&status=done&style=none&width=1684)
專案結構如下圖
![截圖2020-07-2223.36.30.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595432208992-cde2d4c8-2a48-4aee-87e5-11e5fddb9909.png#align=left&display=inline&height=2100&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.36.30.png&originHeight=2100&originWidth=3360&size=764356&status=done&style=none&width=3360)
![截圖2020-07-2223.46.48.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595432820305-bce0a4a8-e76c-4b0b-adec-9542b05441e6.png#align=left&display=inline&height=974&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.46.48.png&originHeight=974&originWidth=1914&size=95558&status=done&style=none&width=1914)
![截圖2020-07-2223.47.13.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595432844079-cec3ff61-24a5-4451-9e6a-d39400aab48f.png#align=left&display=inline&height=1032&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.47.13.png&originHeight=1032&originWidth=1700&size=143793&status=done&style=none&width=1700)
![截圖2020-07-2223.47.39.png](https://cdn.nlark.com/yuque/0/2020/png/359374/1595432870478-840ef3b2-27d1-4422-b3a6-e0beddaa56b2.png#align=left&display=inline&height=1572&margin=%5Bobject%20Object%5D&name=%E6%88%AA%E5%B1%8F2020-07-2223.47.39.png&originHeight=1572&originWidth=2724&size=262595&status=done&style=none&width=2724)
### Consul消費者 服務註冊中心有了,服務提供者也有了,我們再來開發一個服務消費者。 #### 新建Module,同樣新增spring-cloud-starter-consul-disconvery依賴 #### pom.xml ```java
OK, 這一步完成之後,可以啟動消費者介面,重新整理幾次,從返回結果上能看出來是輪訓呼叫服務提供者介面例項