一、啟動consul server
在安裝好consul的ubuntu虛拟機上啟動consul server,以server方式啟動:
consul agent -ui -server -data-dir=/tmp/consul -bootstrap-expect 1 -bind 10.211.55.10

使用-ui參數啟動server成功後,可以在浏覽器中輸入:http://localhost:8500/ui 看到如下界面
二、啟動consul client
在本機上啟動consul client
consul agent -data-dir /tmp/consul -node=yyh -advertise=192.168.31.188 -join=10.211.55.10
加入server節點成功後的截圖如下
![]()
一、SpringCloud利用Consul實作服務注冊與發現
此時在web ui中檢視節點,會發現多了一個節點,但是沒有任何服務
如何使用Spring Cloud注冊一個服務呢?下面正式開始
三、注冊一個service提供服務
1、建立maven項目consulservice1,引入最新的Spring cloud和Spring boot 依賴
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.0.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.M8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
</dependencies>
2、建立服務注冊程式
@SpringBootApplication
@EnableDiscoveryClient//此注解将自動發現服務并注冊服務
@RestController
public class ConsulService1App {
@Value("${spring.application.name}")
private String name;
@Value("${server.port}")
private int port;
@RequestMapping(value = "/hi")
public String hi(){
return "hello world ! I'm :" + name + ":" + port;
}
public static void main(String[] args){
SpringApplication.run(ConsulService1App.class, args);
}
}
application.properties配置,在此處沒有進行過于過多的複雜的配置,第二節講利用consul作為配置中心
spring.application.name=consulservice1
server.port=
啟動應用程式,當我們在此打開consul web ui 檢視我們的service
隻有當健康檢查全部通過,service才能被其他服務正常調用,接下來使用postman這個軟體在本地調用服務 http://localhost:8001/hi
注意,本例會出現如下情況Could not locate PropertySource: I/O error on GET request 是因為沒有配置config server
四、發現服務
1、建立項目consulclient1引入module consulservice1同樣的依賴
2、applicant.properties中的配置
spring.application.name=consulclient1
server.port=
#作用是在自動注冊服務
spring.cloud.consul.discovery.register=false
3、建立啟動應用程式
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.consul.discovery.ConsulDiscoveryClient;
import org.springframework.web.client.RestTemplate;
import java.util.List;
@SpringBootApplication
@EnableDiscoveryClient
public class ConsulClient1App implements CommandLineRunner{
@Autowired
private ConsulDiscoveryClient consulDiscoveryClient;
public static void main(String[] args){
SpringApplication.run(ConsulClient1App.class,args);
}
@Override
public void run(String... args) throws Exception {
List<ServiceInstance> serviceInstanceList = consulDiscoveryClient.getInstances("consulservice1");
ServiceInstance serviceInstance = serviceInstanceList.get();
System.out.println("服務位址:" + serviceInstance.getUri());
System.out.println("服務名稱:" +serviceInstance.getServiceId());
String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString()+"/hi",String.class);
System.out.println(callServiceResult);
}
}
3、啟動應用程式
可以成功的看到發現了我們注冊的服務consulservice1,同時使用restTemplate調用了consulservice1的接口。
當我在此打開虛拟機上的web ui,發現并未注冊新的服務
五、後續
1、服務是通過serviceId來發現的,注意它和instanceId的差別,serviceId是服務的名稱,instanceId是對服務做另外的标注,作用是在多台伺服器上部署相同的服務,instanceId一樣的話,服務會被覆寫
2、當缺少依賴的時候會出現各種各樣奇怪的錯誤
3、源碼位址:https://github.com/NapWells/spring_cloud_learn/tree/master/discover_server_with_consul/springcloudlearn
4、下一篇,以Consul作為Spring Cloud的服務配置中心