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

一、介紹

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

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

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

二串远、下載安裝

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

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

2澡罚、解壓后運行命令伸但,啟動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)成功啟動了

三留搔、開始擼代碼

新建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的版本對應(yīng)關(guān)系如下,如果配置錯誤括眠,會出現(xiàn)意想不到的錯誤

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

父工程的依賴包也很簡約管呵,主要是把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端點的系統(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ù)注冊+發(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}

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

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

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

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

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

接下來患亿,我們把jd-consul服務(wù)作為服務(wù)消費者传蹈,user-consul作為服務(wù)提供者。也就是jd-consul向user-consul發(fā)起服務(wù)調(diào)用步藕,直白點說就是:user寫個api惦界,jd去調(diào)用

user-consul寫個簡單的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)用:

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

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

客戶端負(fù)載均衡器組件,SpringCloud Loadbalancer在上述pom文件中已經(jīng)引入添忘。它可以配合RestTemplate組件使用采呐,實現(xiàn)負(fù)載均衡,方式也很簡單搁骑,在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é)束!

一個簡單的仲器,SpringCloud+Consul服務(wù)注冊+服務(wù)發(fā)現(xiàn)煤率,宣告完成。

源代碼已上傳Gitee乏冀。倉庫地址:https://gitee.com/bruce_chu/spring-cloud蝶糯,分支:develop

千里之行始于足下,每天緊握一顆稻草辆沦,最后就會長出參天大樹昼捍。喜歡的朋友可以關(guān)注/贊賞一下,你的鼓勵將給我莫大的動力肢扯!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妒茬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蔚晨,更是在濱河造成了極大的恐慌郊闯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛛株,死亡現(xiàn)場離奇詭異团赁,居然都是意外死亡,警方通過查閱死者的電腦和手機谨履,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門欢摄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笋粟,你說我怎么就攤上這事怀挠∥龊” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵绿淋,是天一觀的道長闷畸。 經(jīng)常有香客問我,道長吞滞,這世上最難降的妖魔是什么佑菩? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮裁赠,結(jié)果婚禮上殿漠,老公的妹妹穿的比我還像新娘。我一直安慰自己佩捞,他們只是感情好绞幌,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著一忱,像睡著了一般莲蜘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帘营,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天菇夸,我揣著相機與錄音,去河邊找鬼仪吧。 笑死庄新,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的薯鼠。 我是一名探鬼主播择诈,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼出皇!你這毒婦竟也來了羞芍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤郊艘,失蹤者是張志新(化名)和其女友劉穎荷科,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纱注,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡畏浆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了狞贱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刻获。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖瞎嬉,靈堂內(nèi)的尸體忽然破棺而出蝎毡,到底是詐尸還是另有隱情厚柳,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布沐兵,位于F島的核電站别垮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏扎谎。R本人自食惡果不足惜碳想,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望簿透。 院中可真熱鬧移袍,春花似錦解藻、人聲如沸老充。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽啡浊。三九已至,卻和暖如春胶背,著一層夾襖步出監(jiān)牢的瞬間巷嚣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工钳吟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留廷粒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓红且,卻偏偏與公主長得像坝茎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子暇番,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353