最近由于要求,需要我們了解consul,然后就看著文檔,寫了一個簡單的入門demo.
consul是什么?
關(guān)于consul實質(zhì)上跟springcloud的Eureka一樣,作為微服務(wù)架構(gòu)中的服務(wù)注冊和發(fā)現(xiàn)的角色出現(xiàn)在我們的面前,至于它具體的內(nèi)部架構(gòu)東西,大家可以看看它的官網(wǎng)consul官網(wǎng),大家也可以跟eureka進行對比,怎么說了各有千秋,雖然官方停止了對Eureka的維護,但作為新手,值得去學習它,話不多說了,接著看.
consul本地安裝過程
進入consul官網(wǎng)之后,選擇對應系統(tǒng)的進行下載如圖所示:
我這里下載的win64位的,然后在對應保存的目錄下直接解壓如圖:
至于圖中的consul.bat大家忽略,這是我寫的consul啟動腳本,主要是為了方便而已,不影響,接著用cmd命令來進行操作consul,如圖:
注意:在consul的安裝目錄下進行cmd命令操作,輸入圖中命令:
consul agent -dev
啟動成功之后直接訪問:http://localhost:8500后來到consul的管理界面如圖:
看到該頁面說明我們的consul啟動成功了,接下來我們來進入今天的主題就是如何用springboot來整合consul的過程
consul整合過程
首先用我們的開發(fā)工具idea來創(chuàng)建一個emptyProject,我這里的項目名為consul-server,接著在該項目的下面創(chuàng)建字模塊項目,我這里服務(wù)的提供者為consul-producer,(注意在創(chuàng)建的過程中使用springboot來搭建,我這里服務(wù)的發(fā)現(xiàn)選擇consul),然后一路next即可
- 接下來是需要導入我們相關(guān)依賴,代碼如下:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
接著看我們的啟動類,代碼如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author cb
*/
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulProducerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulProducerApplication.class, args);
}
我們需要在啟動類上添加注解@EnableDiscoveryClient,其目的是為了讓consul能夠發(fā)現(xiàn)自己的服務(wù),接著來看我們的配置文件,代碼如下:
server.port=8080
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.application.name=consul-producer
#注冊到consul的服務(wù)名稱
spring.cloud.consul.discovery.service-name=${spring.application.name}
上述是簡單的配置,一般自己玩只需要這幾個即可,在實際的開發(fā)中有需求的可以自己去加,我們啟動一下來看一下在consul管理頁面中是否存在我們的服務(wù),運行結(jié)果如圖所示:
如我們想象的一樣,在管理界面中出現(xiàn)了我們的服務(wù),接著我們來創(chuàng)建一個接口來測試一下,代碼如下:
package com.consul.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author cb
*/
@RestController
@RequestMapping("producer")
public class ProducerController {
@RequestMapping("hello")
public String hello(){
return "hello consul";
}
在瀏覽器上輸入地址http://localhost:8080/producer/hello,在頁面中會打印hello consul的字樣,就這樣我們的服務(wù)提供者完成了創(chuàng)建,很簡單吧,為了讓我們體驗下注冊時的負載均衡效果,我們在來創(chuàng)建一個跟上一個一模一樣的服務(wù)提供者我這里的服務(wù)名為consul-producer1,創(chuàng)建過程和pom文件一樣,唯一區(qū)別在于配置文件的端口配置,配置代碼如下:
server.port=8081
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.application.name=consul-producer
#注冊到consul的服務(wù)名稱
spring.cloud.consul.discovery.service-name=${spring.application.name}
接著我們來啟動下我們的子模塊consul-producer1,然后在我們的consul管理界面臺中進行查看,如圖:
在管理臺界面中看到了我們的兩個服務(wù),雖然服務(wù)名相同,但port不一樣,總之使我們想要的結(jié)果,接下來我們需要創(chuàng)建一個服務(wù)的消費方來對我們的服務(wù)進行隨機輪詢訪問,這也體現(xiàn)了微服務(wù)的負載均衡策略.
服務(wù)消費方
首先創(chuàng)建一個名為consul-consumer的子項目,同樣在pom文件需要引入對應的依賴,實際跟我們consul-producer的pom依賴一樣,直接cv即可,這里就不重復了,接著看我們的啟動類,代碼如下:
package com.consul;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author cb
*/
@SpringBootApplication
public class ConsulConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsulConsumerApplication.class, args);
}
接著看配置文件,代碼如下:
server.port=8082
spring.application.name=consul-consumer
spring.cloud.consul.discovery.service-name=${spring.application.name}
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
#消費端不需要注冊到consul中
spring.cloud.consul.discovery.register=false
作為服務(wù)的消費者,這里我們就不必將它作為服務(wù)進行注冊,接著寫個測試接口進行測試,代碼如下:
com.consul.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
*
* @author cb
*/
@RestController
public class ServiceController {
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private DiscoveryClient discoveryClient;
/**
* 獲取所有的服務(wù)
* @return
*/
@RequestMapping("services")
public Object getServices(){
List<ServiceInstance> instances = discoveryClient.getInstances("consul-producer");
System.out.println(instances.toString());
return instances;
}
/**
* 輪訓獲取服務(wù)中的其中一個
* @return
*/
@RequestMapping("discover")
public String discover(){
return loadBalancerClient.choose("consul-producer").toString();
}
我們訪問http://localhost:8082/services來獲取所有的服務(wù)實例,運行結(jié)果如下:
DefaultServiceInstance{instanceId='consul-producer-8080', serviceId='consul-producer', host='DESKTOP-NSAK1VJ', port=8080, secure=false, metadata={secure=false}
DefaultServiceInstance{instanceId='consul-producer-8081', serviceId='consul-producer', host='DESKTOP-NSAK1VJ', port=8081, secure=false, metadata={secure=false}}
上面的結(jié)果使我們進行接口訪問之后的結(jié)果,可以看到的是我們此時有兩個服務(wù)名為consul-producer的服務(wù)實例,再一次通過訪問我們http://localhost:8082/discover,會發(fā)現(xiàn)兩個服務(wù)輪詢訪問,如圖:
上述就是運行結(jié)果,百看不如親自測試一遍,到這里我的入門就講完了,入門級的教程,也是在嘗試中,下篇我會寫一個springboot2.x整合consul再加RabbitMQ的入門級教程.