SpringBoot + Spring Cloud Consul 服務注冊和發現



image.png

什么是Consul

Consul 是 HashiCorp 公司推出的開源工具,用於實現分布式系統的服務發現與配置。與其它分布式服務注冊與發現的方案,Consul 的方案更“一站式”,內置了服務注冊與發現框架、分布一致性協議實現、健康檢查、Key/Value 存儲、多數據中心方案,不再需要依賴其它工具(比如 ZooKeeper 等)。使用起來也較為簡單。Consul 使用 Go 語言編寫,因此具有天然可移植性(支持Linux、windows和Mac OS X);安裝包僅包含一個可執行文件,方便部署,與 Docker 等輕量級容器可無縫配合。

Consul安裝

官網(consul.io)最新版本1.8.0 提供了MacOS,Windows, Linux, 如果你不知道怎么安裝,官方還提供了視頻。
截屏2020-07-2223.27.02.png
我這里使用docker安裝,安裝過程總結起來為三句話:
docker search consul
docker pull consul
docker run --name consul -d -p 8600:8500 consul


沒問題的話,本機訪問http://localhost:8600則可以打開consul自帶的管理系統,默認情況下沒有服務注冊進來
截屏2020-07-2223.31.31.png

准備工作

  • 新建父工程, 主要約定SpringCloud, SpringBoot版本號,我使用的是Hoxton.SR1, SpringBoot2.2
  • 新建3個子Module,這里兩個service,一個consumer, 兩個service我用8001和8002端口來區分,主要是想在服務消費時反應客戶端負載均衡。


項目結構如下圖
截屏2020-07-2223.36.30.png
父工程pom.xml

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

服務提供者

服務注冊中心有了,那么我們來開發兩個服務提供者,這里新建了兩個Module,端口8001和8002。兩個Module代碼相同,主要為了演示負載使用。

新建Module,添加spring-cloud-starter-consul-disconvery依賴

截屏2020-07-2223.41.10.png

pom.xml

 <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.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

添加配置(application.yml)

server:
  port: 8001
spring:
  application:
    name: consul-student-service
  cloud:
    consul:
      port: 8600
      host: 127.0.0.1
      discovery:
        service-name: ${spring.application.name}

修改啟動類,添加服務

這里我直接寫了一個測試接口放在啟動類里。這里我只貼了端口8001的代碼,8002代碼結構相同,只是端口不同。

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulStudentService8001 {

    public static void main(String[] args) {
        SpringApplication.run(ConsulStudentService8001.class,args);
    }

    @GetMapping("/student/version")
    public String version(){
        return "8001,202007222300";
    }
}

OK,到這一步,啟動兩個服務,不出異常的情況下,可在注冊中心查看當前的服務實例。
截屏2020-07-2223.46.48.png
截屏2020-07-2223.47.13.png
截屏2020-07-2223.47.39.png

Consul消費者

服務注冊中心有了,服務提供者也有了,我們再來開發一個服務消費者。

新建Module,同樣添加spring-cloud-starter-consul-disconvery依賴

pom.xml

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

添加配置(application.yml)

server:
  port: 8080

spring:
  application:
    name: consul-student-consumer
  cloud:
    consul:
      host: 127.0.0.1
      port: 8600
      discovery:
        service-name: ${spring.application.name}
        # 不需要注冊到consul中
        register: false

修改啟動類,調用服務

開發RestTemplate配置類,調用REST接口時使用。

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

修改啟動類

@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class ConsulStudentConsumer {

    public static void main(String[] args) {
        SpringApplication.run(ConsulStudentConsumer.class,args);
    }

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/consul/student/version")
    public String version(){
        //這里使用服務實例名調用REST接口
        return restTemplate.getForObject("http://consul-student-service/student/version",String.class);
    }
}


OK, 這一步完成之后,可以啟動消費者接口,刷新幾次,從返回結果上能看出來是輪訓調用服務提供者接口實例。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM