1. Consul
在 Spring Cloud 中,大部分套件都有備選方案,例如註冊中心,除了常見 Eureka 之外,像zookeeper 我們也可以直接使用在 Spring Cloud 中,還有另外一個比較重要的方案,就是 Consul。Consul 是 HashiCorp 公司推出來的開源產品。主要提供了:服務發現、服務隔離、服務配置等功能。
相比於 Eureka 和 zookeeper,Consul 配置更加一站式,因為它內建了很多微服務常見的需求:服務發現與註冊、分散式一致性協定實現、健康檢查、鍵值對儲存、多資料中心等,我們不再需要藉助第三 方套件來實現這些功能。
2. 安裝
不同於
Eureka
,
Consul
使用
Go
語言開發,所以,使用
Consul
,我們需要先安裝軟體。在
Linux
中,首先執行如下命令下載
Consul
:
1 | wget https://releases.hashicorp.com/consul/1.6.2/consul_1.6.2_linux_amd64.zip |
然後解壓下載檔案:
1 | unzip consul_1.6.2_linux_amd64.zip |
解壓完成後,我們在當前目錄下就可以看到 consul 檔案,然後執行如下命令,啟動 Consul:
1 | ./consul agent -dev -ui -node=consul-dev -client=192.168.91.128 |
啟動成功後,在物理機中,我們可以直接訪問 Consul 的後台管理頁面(注意,這個訪問要確保 8500連接埠可用,或者直接關閉防火牆):

3. Consul 使用
簡單看一個註冊消費的範例。
首先我們來建立一個服務提供者。就是一個普通的 Spring Boot 專案,新增如下依賴:

專案建立成功後,新增如下配置:
|
spring.application.name=consul-provider server.port=2000 # Consul 相關配置 spring.cloud.consul.host=192.168.91.128 spring.cloud.consul.port=8500 spring.cloud.consul.discovery.service-name=consul-provider |
在專案啟動類上開啟服務發現的功能:
|
@SpringBootApplication @EnableDiscoveryClient public class ConsulProviderApplication { public static void main(String[] args) { SpringApplication.run(ConsulProviderApplication.class, args); } } |
最後新增一個測試介面:
|
@RestController public class HelloController { @GetMapping("/hello") public String hello() { return "hello"; } } |
接下來就是啟動專案,專案啟動成功後,訪問 consul 後台管理頁面,看到如下訊息,表示 consul 已經註冊成功了。

4. Consul 叢集註冊
為了區分叢集中的哪一個 provider 提供的服務,我們修改一下 consul 中的介面:
|
@RestController public class HelloController { @Value("${server.port}") Integer port; @GetMapping("/hello") public String hello() { return "hello>>" + port; } } |
修改完成後,對專案進行打包。打包成功後,命令列執行如下兩行命令,啟動兩個 provider 例項:
|
java -jar consul-provider-0.0.1-SNAPSHOT.jar --server.port=2000 java -jar consul-provider-0.0.1-SNAPSHOT.jar --server.port=2001 |
啟動成功後,再去 consul 後台管理頁面,就可以看到有兩個例項了:

???????5. 消費
首先建立一個消費例項,建立方式和 provider 一致。
建立成功後,新增如下配置:
|
spring.application.name=consul-consumer server.port=2002 spring.cloud.consul.host=192.168.91.128 spring.cloud.consul.port=8500 spring.cloud.consul.discovery.service-name=consul-consumer |
開啟服務發現,並新增 RestTemplate:
|
@SpringBootApplication @EnableDiscoveryClient public class ConsulConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsulConsumerApplication.class, args); } @Bean RestTemplate restTemplate() { return new RestTemplate(); } } |
最後,提供一個服務呼叫的方法:
|
@RestController public class HelloController { @Autowired LoadBalancerClient loadBalancerClient; @Autowired RestTemplate restTemplate; @GetMapping("/hello") public void hello() { ServiceInstance choose = loadBalancerClient.choose("consul-provider"); System.out.println("服務地址:" + choose.getUri()); System.out.println("服務名稱:" + choose.getServiceId()); String s = restTemplate.getForObject(choose.getUri() + "/hello", String.class); System.out.println(s); } } |
這裡,我們透過 loadBalancerClient 例項,可以取得要呼叫的 ServiceInstance。取得到呼叫地址之後,再用 RestTemplate 去呼叫。
然後,啟動專案,瀏覽器輸入 http://localhost:2002/hello ,檢視請求結果,這個請求自帶負載均衡功能。