SpringCloud+Consul服務(wù)注冊(cè)+服務(wù)發(fā)現(xiàn)實(shí)戰(zhàn)

一、介紹

Consul是一個(gè)服務(wù)網(wǎng)格解決方案,提供了一個(gè)功能齊全的控制平面,具有服務(wù)發(fā)現(xiàn)、配置和分段功能。這些功能中的每一項(xiàng)都可以根據(jù)需要單獨(dú)使用,也可以一起使用來構(gòu)建一個(gè)完整的服務(wù)網(wǎng)格。-- 引用自Consul中文文檔

在基于SpringCloud的微服務(wù)架構(gòu)中,Consul用來做服務(wù)注冊(cè)、服務(wù)發(fā)現(xiàn)、配置中心等功能。平替的解決方案還有Nacos、Zookeeper等等。

本文主要是將Consul服務(wù)注冊(cè)+服務(wù)發(fā)現(xiàn)集成進(jìn)SpringCloud項(xiàng)目中。

二、下載安裝

1、以Windows環(huán)境為例,下載壓縮包

C439F197-EC6F-4153-8150-952E16183C9E.png

2、解壓后運(yùn)行命令,啟動(dòng)Consul面板

PS F:\wwwroot\consul_1.17.1_windows_amd64> .\consul.exe agent -dev

命令行結(jié)果如下:

D5574941-20E8-40dd-920F-BDC1A9D5A81A.png

打開瀏覽器查看面板,鏈接:http://localhost:8500/

7952D2A4-1289-4aa1-AFB2-4EC8B1384BE5.png

可以看到面板已經(jīng)成功啟動(dòng)了

三、開始擼代碼

新建spring-cloud父工程,工程pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>zhu.bruce.springcloud</groupId>
    <artifactId>spring-cloud</artifactId>
    <version>${revision}</version>
    <packaging>pom</packaging>
    <modules>
        <module>jd-consul</module>
        <module>user-consul</module>
    </modules>

    <properties>
        <revision>1.0-SNAPSHOT</revision>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <lombok.version>1.18.24</lombok.version>
        <maven.spring.boot.verison>2.3.0.RELEASE</maven.spring.boot.verison>
        <spring-boot.version>2.7.14</spring-boot.version>
        <spring-cloud.version>2021.0.5</spring-cloud.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${maven.spring.boot.verison}</version>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

這里,我們選用springboot2.7.14版本、springcloud2021.0.5版本。springboot與springcloud的版本對(duì)應(yīng)關(guān)系如下,如果配置錯(cuò)誤,會(huì)出現(xiàn)意想不到的錯(cuò)誤

3AD6B65D-B4DC-4bc3-B20C-D3745A3FFFC2.png

父工程的依賴包也很簡(jiǎn)約,主要是把springboot和springcloud組件的依賴清單加入依賴管理。

接下來新建jd-consul和user-consul子模塊

jd-consul模塊的pom文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>zhu.bruce.springcloud</groupId>
        <artifactId>spring-cloud</artifactId>
        <version>${revision}</version>
    </parent>

    <artifactId>jd-consul</artifactId>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!-- 基于Spring Boot的Web應(yīng)用程序 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- 提供HTTP端點(diǎn)的系統(tǒng)監(jiān)控 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- Netflix Ribbon廢棄后,SpringCloud官方的負(fù)載均衡組件 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>
        <!-- Consul服務(wù)注冊(cè)+發(fā)現(xiàn) -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

</project>

在jd-consul模塊中resources目錄下,新建application.yml與application-dev.yml。springboot的配置文件與多環(huán)境配置,這里不再贅述。

application.yml

server:
  port: 8040
spring:
  application:
    name: jd-consul-service
  profiles:
    active: dev

application-dev.yml

spring:
  cloud:
    consul:
      host: 127.0.0.1
      # consul面板的默認(rèn)端口
      port: 8500
      discovery:
        service-name: ${spring.application.name}

接下來新建啟動(dòng)類JDConsulApplication,加載好依賴包后,就可以啟動(dòng)了。jd-consul模塊的文件目錄結(jié)構(gòu)如下:

D5DB2D7D-5E8F-414a-86F8-540F1DB0D581.png

啟動(dòng)成功之后,再次打開consul面板,http://localhost:8500/,就可以看到j(luò)d-consul服務(wù)已經(jīng)成功注冊(cè)上去了

07BE22CD-DE46-432c-B154-4CE63736E146.png

同理,user-consul模塊也如法炮制即可。到此,consul的服務(wù)注冊(cè)就擼好了。

接下來,我們把jd-consul服務(wù)作為服務(wù)消費(fèi)者,user-consul作為服務(wù)提供者。也就是jd-consul向user-consul發(fā)起服務(wù)調(diào)用,直白點(diǎn)說就是:user寫個(gè)api,jd去調(diào)用

user-consul寫個(gè)簡(jiǎn)單的api,UserConsulController如下:

package zhu.bruce.springcloud.userConsul.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/userConsul")
@Slf4j
public class UserConsulController {
    @GetMapping(value = "/{id}")
    public String query(@PathVariable("id") String id) {
        return id;
    }
}

jd-consul發(fā)起調(diào)用:

簡(jiǎn)單點(diǎn)的話,在jd模塊下,可以用ip:port的方式直接訪問user的api,比如:127.0.0.1:8030/userConsul/100。但是這樣就發(fā)揮不了服務(wù)發(fā)現(xiàn)的作用了,這里我們換個(gè)方式,采用springcloud官方的客戶端負(fù)載均衡器。它支持http://<service>這種方式來訪問api。

這里我們引入RestTemplate組件作為Http客戶端,平替的解決方案還有OkHttp、Apache的HttpClient、以及OpenFeign。OpenFeign是比較流行且優(yōu)雅的Http客戶端,我們后面也會(huì)專門開專題講解。

客戶端負(fù)載均衡器組件,SpringCloud Loadbalancer在上述pom文件中已經(jīng)引入。它可以配合RestTemplate組件使用,實(shí)現(xiàn)負(fù)載均衡,方式也很簡(jiǎn)單,在RestTemplate組件上添加@LoadBalanced注解即可:

package zhu.bruce.springcloud.jdConsul.config;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class JDConsulConfiguration {
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

開始發(fā)起調(diào)用,JDConsulController:

package zhu.bruce.springcloud.jdConsul.controller;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

@RestController
@RequestMapping("/jdConsul")
public class JDConsulController {
    public static final String USER_CLOUD_URL = "http://user-consul-service/userConsul";

    @Resource
    private RestTemplate restTemplate;

    @GetMapping(value = "/user/{id}")
    public String queryUser(@PathVariable("id") String id) {
        ResponseEntity<String> entity = restTemplate.getForEntity(USER_CLOUD_URL + "/" + id, String.class);
        return entity.getBody();
    }
}

接口調(diào)用結(jié)果如下:

6078232E-66F5-4076-85D7-A70796D6377D.png

結(jié)束!

一個(gè)簡(jiǎn)單的,SpringCloud+Consul服務(wù)注冊(cè)+服務(wù)發(fā)現(xiàn),宣告完成。

源代碼已上傳Gitee。倉(cāng)庫(kù)地址:https://gitee.com/bruce_chu/spring-cloud,分支:develop

千里之行始于足下,每天緊握一顆稻草,最后就會(huì)長(zhǎng)出參天大樹。喜歡的朋友可以關(guān)注/贊賞一下,你的鼓勵(lì)將給我莫大的動(dòng)力!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容