天天看點

一、SpringCloud利用Consul實作服務注冊與發現

一、啟動consul server

在安裝好consul的ubuntu虛拟機上啟動consul server,以server方式啟動:

consul agent -ui -server -data-dir=/tmp/consul -bootstrap-expect 1 -bind 10.211.55.10
一、SpringCloud利用Consul實作服務注冊與發現

使用-ui參數啟動server成功後,可以在浏覽器中輸入:http://localhost:8500/ui 看到如下界面

一、SpringCloud利用Consul實作服務注冊與發現

二、啟動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中檢視節點,會發現多了一個節點,但是沒有任何服務

一、SpringCloud利用Consul實作服務注冊與發現

如何使用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

一、SpringCloud利用Consul實作服務注冊與發現

隻有當健康檢查全部通過,service才能被其他服務正常調用,接下來使用postman這個軟體在本地調用服務 http://localhost:8001/hi

一、SpringCloud利用Consul實作服務注冊與發現

注意,本例會出現如下情況Could not locate PropertySource: I/O error on GET request 是因為沒有配置config server

一、SpringCloud利用Consul實作服務注冊與發現

四、發現服務

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、啟動應用程式

一、SpringCloud利用Consul實作服務注冊與發現

可以成功的看到發現了我們注冊的服務consulservice1,同時使用restTemplate調用了consulservice1的接口。

當我在此打開虛拟機上的web ui,發現并未注冊新的服務

一、SpringCloud利用Consul實作服務注冊與發現

五、後續

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的服務配置中心