1. 程式人生 > >SpringBoot + Spring Cloud Consul 服務註冊和發現

SpringBoot + Spring Cloud Consul 服務註冊和發現

![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, 這一步完成之後,可以啟動消費者介面,重新整理幾次,從返回結果上能看出來是輪訓呼叫服務提供者介面例項