Eureka停更了?試試Zookpper和Consul
阿新 • • 發佈:2020-03-13
在Spring Cloud Netflix中使用Eureak作為註冊中心,但是Eureka2.0停止更新,Eureka1.0 進入了維護狀態。就像win7一樣,同樣可以用,但是官方對於新出現的問題並不能及時修復,所以我們就需要使用替代品。目前可用的註冊中心替代品主要有:Zookeeper、Consul、Nacos等,這裡主要講前兩個,Nacos是Spring Cloud Alilibaba中的元件,後期會說到。
### 使用Zookeeper作為註冊中心
#### 一、安裝Zookeeper並啟動服務
> 這一步非本文重點,請自行百度,很簡單的
#### 二、將原有的微服務註冊進Zookeeper
* 使用過Dubbo的小夥伴對Zookeeper一定不陌生。使用Eureka時,我們是建立一個新的SpringBoot Web專案(如果是Eureka叢集的話,就要建立多個專案),然後將其他微服務註冊進去,而Zookeeper卻不用新建專案,只需要通過修改配置和簡單的編碼就可以進行註冊
* 為了和之前的專案衝突,我們先將之前的專案複製兩個新的專案```zookeeper-provider-8001```和```zookeeper-consumer-80```
##### 先修改```zookeeper-provider-8001```這個提供者專案
* 在pom.xml中引入依賴
```xml
org.springframework.cloud
spring-cloud-starter-zookeeper-discovery
org.apache.zookeeper
zookeeper
org.apache.zookeeper
zookeeper
3.4.13
```
> 一個小細節,為什麼要排除這個依賴,然後引入一個新的依賴?這波騷操作?
1. 主要是在zookeeper-discovery中的zookeeper版本是3.4.8
2. 而這個版本一定要和我們在伺服器安裝的zookeeper版本一致,不然你在註冊的時候,會報錯。當然,如果你在伺服器本來安裝的是3.4.8就不用這麼麻煩了。
* 在application.yml中配置上zookeeper的地址
```yaml
server:
port: 8001
spring:
application:
# 這個應用的名稱,用來註冊在註冊中心的名稱
name: zookeeper-provider
cloud:
zookeeper:
# 如果是zookeeper叢集,在這個地址後邊加上就可以,用逗號分開
connect-string: 192.168.25.131:2181
```
* 在啟動類中添加註解
```java
@SpringBootApplication
@EnableDiscoveryClient //注意這個註解是SpringCloud包中的
public class ApplicationDemo {
public static void main(String[] args) {
SpringApplication.run(ApplicationDemo.class, args);
}
}
```
* 啟動這個專案,然後在伺服器中檢視下zookeeper的節點
![使用Zookeeper作為Spring Cloud註冊中心](https://gitee.com/lyn4ever/picgo-img/raw/master/img/20200312205017.png)
##### **同樣的方法,修改消費者專案zookeeper-consumer-80**
* pom.xml(和上邊一樣引入zookeeper依賴)
* appliction.yml
```yaml
server:
port: 80
spring:
cloud:
zookeeper:
connect-string: 192.168.25.131:2181
```
* 和Eureka不同的是,我們同時也要將消費者註冊進Zookeeper中
```java
@SpringBootApplication
@EnableDiscoveryClient
public class ApplicationDemo {
public static void main(String[] args) {
SpringApplication.run(ApplicationDemo.class, args);
}
}
```
* 我們使用的是Ribbon用服務名進行訪問的方式,所以還要修改它的controller類
```java
@GetMapping("consumer/hello/{id}")
public String hello(@PathVariable("id") String id){
//遠端呼叫provider中的介面
return restTemplate.getForObject("http://zookeeper-provider/provider/hello/"+id,String.class);
}
```
* 然後啟動這個專案,使用瀏覽器訪問```http://localhost/consumer/hello/999```沒問題
![](https://gitee.com/lyn4ever/picgo-img/raw/master/img/20200312210436.png)
### 使用Consul作為註冊中心
[檢視它的中文文件](https://www.springcloud.cc/spring-cloud-consul.html)
Consul是使用go語言開發,是一個服務網格(微服務間的 TCP/IP,負責服務之間的網路呼叫、限流、熔斷和監控)解決方案,它是一個一個分散式的,高度可用的系統,而且開發使用都很簡便。它提供了一個功能齊全的控制平面,主要特點是:服務發現、健康檢查、鍵值儲存、安全服務通訊、多資料中心。
#### 一、安裝Consul
這個安裝要比Zookeeper簡單,我只說下windows安裝操作,其他的檢視官網[https://www.consul.io/](https://www.consul.io/)
> 如果你下載很慢的話,我在專案程式碼中上傳了這個安裝包。看文未獲取程式碼地址。
* 在官網上下載安裝包,windows的下載解壓後就是一個.exe檔案。使用cmd開啟當前目錄(在當前目錄下按住Shift+滑鼠右鍵,選擇Open commond window here 或者在位址列中輸入cmd然後回車)然後執行如下命令:
```shell
consul agent -dev
```
* Consul和Eureka是有圖形化介面的,啟動Consul後直接用瀏覽器開啟```localhost:8500```就可以看到。
![使用Consul作為註冊中心](https://gitee.com/lyn4ever/picgo-img/raw/master/img/20200312232819.png)
#### 二、將原有微服務註冊進Consul
> 同樣,我們複製兩個新專案consul-provider-8001 和 consul-consumer-80。
>
> 而且和Zookeeeper一樣,提供者和消費者都要註冊進去。只貼出修改的程式碼,其他的參見原始碼
* pom.xml
```xml
org.springframework.cloud
spring-cloud-starter-consul-discovery
```
* application.yml(提供者和服務者除了埠號和application.name外,其他的不變)
```yaml
server:
port: 8001
spring:
application:
# 這個應用的名稱,用來註冊在註冊中心的名稱
name: consul-provider
cloud:
consul:
host: localhost
port: 8500
discovery:
# 這個就是要註冊進consul中的服務名,直接使用了上邊定義的微服務名
service-name: ${spring.application.name}
```
* 在主啟動類上添加註解(提供者和服務者都需要)
```java
@SpringBootApplication
@EnableDiscoveryClient
public class ApplicationDemo {
public static void main(String[] args) {
SpringApplication.run(ApplicationDemo.class, args);
}
}
```
* 注意修改Controller中的遠端呼叫服務名
```java
@GetMapping("consumer/hello/{id}")
public String hello(@PathVariable("id") String id){
//遠端呼叫provider中的介面
return restTemplate.getForObject("http://consul-provider/provider/hello/"+id,String.class);
}
```
* 然後啟動這個專案,先在瀏覽器中輸入```localhost:8500```看一下我們的註冊中心是否有這兩個微服務。然後再次進行測試。
* 但是我們啟動後,在Consul後臺發現我們服務是註冊進去了,但是報錯了。這是因為Consul和其他的註冊中心不一樣,它要檢查這個SpringBoot的健康值,就是要訪問每個服務的"/health"介面。所以我們要在每一個微服務中引入SpringBoot的健康檢查的依賴(之前用過這個的小夥伴就很熟悉了)
```xml
org.springframework.boot
spring-boot-starter-actuator
```
* 這裡有一個小插曲,就算當我們引入這個包後我們的```http://localhost:8001/health```返回還是down,也就是說我們的健康檢查還是不通過.。因為我們使用的SpringBoot和Spring Cloud版本的問題。我還沒找到解決方案。但是我們可以關閉Consul對當前服務的健康檢查,新增如下配置:
```yaml
spring:
application:
# 這個應用的名稱,用來註冊在註冊中心的名稱
name: consul-consumer
cloud:
consul:
host: localhost
port: 8500
discovery:
# 這個就是要註冊進consul中的服務名,直接使用了上邊定義的微服務名
service-name: ${spring.application.name}
# 取消Consule對當前服務的健康檢查
register-health-check: false
```
最後,能在Consul控制檯看到這個
![使用Consul作為註冊中心](https://gitee.com/lyn4ever/picgo-img/raw/master/img/20200313001910.png)
上邊這個錯誤標誌忽略就好了。然後我們就可以使用瀏覽器和之前一樣進行服務的訪問了
### 總結:
1. 這兩個註冊中心在和Spring Cloud整合時,它們的理念和步驟是一樣的。
***引依賴***——》***修改application.yml將這個微服務註冊進註冊中心***——》***在主啟動類中添加註解***
2. 和Eureka不同就是,在註冊中心能同時看到提供者和消費者
3. 後期在Spring Cloud Alilibaba中,我們會使用Nacos(阿里自研的)作為註冊中心
### 專案程式碼及更多學習教程
請關注微信公眾號,回覆“SpringCloud”獲取。
![](https://lyn4ever.gitee.io/img/wx/gz