SpringCloud — Consul的安裝及使用

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 ,檢視請求結果,這個請求自帶負載均衡功能。