Spring Cloud 搭建微服務(wù)

概述

框架版本

框架名稱 版本號(hào)
Spring Boot 2.2.7.RELEASE
Spring Cloud Hoxton.SR6
Spring Cloud Alibaba 2.2.6.RELEASE

基礎(chǔ)依賴

依賴名稱 說明
spring-boot-starter-actuator 提供微服務(wù)的監(jiān)控支持
spring-cloud-starter-alibaba-nacos-discovery 提供基于 Nacos 的注冊(cè)中心支持服球,完成服務(wù)的注冊(cè)與發(fā)現(xiàn)袁铐。
spring-cloud-starter-alibaba-nacos-config 提供基于 Nacos 的配置中心支持愤兵,完成服務(wù)的配置文件管理。

基礎(chǔ)支撐環(huán)境

基礎(chǔ)支撐環(huán)境需要開發(fā)者自行安裝相味,安裝方法請(qǐng)參考其他文檔或網(wǎng)絡(luò)上的一些資料。

環(huán)境 版本 說明
Nacos 2.0.2 由阿里云提供的開源微服務(wù)引擎,主要提供微服務(wù)的注冊(cè)、發(fā)現(xiàn)眠饮、配置奥帘、Bus等功能铜邮。
Sentinel Dashboard 1.8.2 由阿里云提供的 Sentinel 控制臺(tái),為開發(fā)者實(shí)現(xiàn)限流寨蹋、降級(jí)等操作提供可視化界面松蒜。

業(yè)務(wù)微服務(wù)搭建

業(yè)務(wù)微服務(wù)是為分布式系統(tǒng)提供業(yè)務(wù)支持,是開發(fā)者編寫代碼最多也是最頻繁的服務(wù)已旧。

創(chuàng)建微服務(wù)項(xiàng)目

打開 Intellij IDEA秸苗,找到File -> New -> Project,會(huì)打開如下窗口:

image-20210728105704118.png

點(diǎn)擊下一步运褪,開始填寫項(xiàng)目的基本信息惊楼,我們以創(chuàng)建用戶服務(wù)為例,配置如下:
image-20210728105932961.png

如果不了解各個(gè)配置項(xiàng)的含義秸讹,請(qǐng)先學(xué)習(xí) Maven檀咙,然后再來看此文檔。配置完成后點(diǎn)擊Finish完成項(xiàng)目創(chuàng)建璃诀。創(chuàng)建完成后弧可,項(xiàng)目的目錄結(jié)構(gòu)如下:
image-20210728110432580.png

創(chuàng)建必須的文件和包

創(chuàng)建配置文件

src/main/resources目錄下分別創(chuàng)建application.yamlbootstrap.yaml配置文件,application 和 bootstrap 的區(qū)別就是 bootstrap 的加載優(yōu)先于 application劣欢,并且 bootstrap 中的配置不能被本地屬性覆蓋棕诵。因此,當(dāng)我們使用配置中心來管理配置時(shí) bootstrap.yaml必須創(chuàng)建凿将。當(dāng)然校套,如果我們所有的想要將所有的配置都依托于配置中心來管理,我們也可以只創(chuàng)建一個(gè)bootstrap.yaml配置文件牧抵。

總結(jié):一些公共屬性笛匙,在運(yùn)行期可以通過程序來修改的配置在application.yaml文件中,如:業(yè)務(wù)參數(shù)等灭忠。而作為引導(dǎo)加載的一些不可覆蓋的屬性配置在bootstrap.yaml文件中膳算,如:數(shù)據(jù)庫配置、加解密的密鑰等弛作。不過一般情況下建議涕蜂,可以修改的屬性采用數(shù)據(jù)庫來存儲(chǔ),比如建立一個(gè)系統(tǒng)參數(shù)表映琳。

創(chuàng)建基礎(chǔ)包和啟動(dòng)類

基礎(chǔ)包是當(dāng)前微服務(wù)所使用包的根机隙,后續(xù)所有創(chuàng)建類和子包都包含在根包下蜘拉。找到src/main/java目錄,創(chuàng)建一個(gè)名為com.cloud的根包有鹿,一般情況下除了遵循域名倒寫的規(guī)范外旭旭,盡量保證名稱與pom.xmlgroupId一致,增強(qiáng)代碼的可移植性葱跋。

在根包com.cloud下創(chuàng)建一個(gè)AppStart.java的類作為啟動(dòng)類持寄,注意:啟動(dòng)的類的名稱不要太過于奇葩,能夠見名知意即可娱俺,另外稍味,所有微服務(wù)的啟動(dòng)類名稱最好保持統(tǒng)一,這樣便于團(tuán)隊(duì)協(xié)作時(shí)減少溝通荠卷。

配置相關(guān)依賴

打開項(xiàng)目根目錄下的pom.xml文件模庐,配置所需的依賴 jar 包和 maven 的相關(guān)插件。

基本的pom.xml文件結(jié)構(gòu)如下:

<?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>com.cloud</groupId>
    <artifactId>cloud-user-service</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <!-- pom 文件的屬性配置 -->
    <properties>
    </properties>

    <!-- Spring Boot 版本控制(統(tǒng)一SpringBoot組件版本) -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version>
        <relativePath />
    </parent>
  
    <!-- 依賴管理器 -->
    <dependencyManagement>
    </dependencyManagement>

    <!-- 配置相關(guān)依賴 -->
    <dependencies>
    </dependencies>

    <!-- Maven 的構(gòu)建配置 -->
    <build>
        <!-- 配置相關(guān)插件 -->
        <plugins>
        </plugins>
    </build>
</project>

配置文件結(jié)構(gòu)說明:

  • properties:一般用于配置依賴的版本信息或一些配置的屬性參數(shù)油宜;
  • parent:配置當(dāng)前 Maven 項(xiàng)目的父依賴掂碱,這里一般配置的是spring-boot-starter-parent
  • dependencyManagement:依賴管理器慎冤,一般用于配置 Spring Cloud 的dependencies疼燥,為后續(xù)使用 Spring Cloud 相關(guān)組件提供統(tǒng)一的版本;
  • dependencies:依賴列表粪薛,這里配置的都是具體的依賴悴了,比如我們使用的 web支持、數(shù)據(jù)庫支持违寿、工具包等湃交;
  • build:Maven 的構(gòu)建配置,一般這里會(huì)配置一些打包插件和打包時(shí)的一些規(guī)則藤巢,比如 springboot 的打包插件搞莺、maven 的打包插件、打包時(shí)跳過單元測(cè)試等掂咒。

完整的配置文件如下:

<?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>com.cloud</groupId>
    <artifactId>cloud-user-service</artifactId>
    <version>1.0.0-SNAPSHOT</version>

    <!-- pom 文件的屬性配置 -->
    <properties>
        <java.version>1.8</java.version>
        <charset>UTF-8</charset>
    </properties>

    <!-- Spring Boot 版本控制(統(tǒng)一SpringBoot組件版本) -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.7.RELEASE</version>
        <relativePath />
    </parent>

    <!-- 依賴管理器 -->
    <dependencyManagement>
        <dependencies>
            <!-- Spring Cloud 原生依賴 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR6</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- Spring Cloud Alibaba 依賴 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- 配置相關(guān)依賴 -->
    <dependencies>
        <!-- Spring Boot 監(jiān)視器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <!-- Spring Boot Web 支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Cloud Nacos 注冊(cè)中心依賴 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <!-- Spring Cloud Nacos 配置中心依賴 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>

    <!-- Maven 的構(gòu)建配置 -->
    <build>
        <!-- 配置相關(guān)插件 -->
        <plugins>
            <!-- 打包時(shí)跳過單元測(cè)試 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0-M5</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>

            <!-- Spring Boot Maven 打包插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>

            <!-- Maven 打包插件 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${charset}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

上文中只是包含了能夠支持 Spring Cloud 微服務(wù)最基本的依賴才沧,至于其他的一些依賴并不是所有服務(wù)都需要,后面講到具體的知識(shí)點(diǎn)時(shí)會(huì)單獨(dú)介紹绍刮。

配置 Nacos

實(shí)際開發(fā)過程中温圆,我們可能會(huì)共用 Nacos 服務(wù),所以本章節(jié)介紹搭建一個(gè) Spring Cloud 的微服務(wù)需要在 Nacos 上配置哪些東西孩革。

注意:同一個(gè)項(xiàng)目岁歉,最好保證在同一個(gè)命名空間,同一個(gè)組下膝蜈,否則無法實(shí)現(xiàn)服務(wù)調(diào)用锅移。雖然有其他辦法解決熔掺,但處理起來比較麻煩。

創(chuàng)建命名空間

如果我們很多個(gè)項(xiàng)目共用一個(gè) Nacos 服務(wù)非剃,可以在 Nacos 中創(chuàng)建相應(yīng)的命名空間來區(qū)分和管理微服務(wù)置逻。進(jìn)入 Nacos 控制臺(tái),找到命名空間备绽,點(diǎn)擊新建命名空間券坞,填入?yún)?shù)說明如下:

  • 命名空間ID(不填則自動(dòng)生成):命名空間的唯一標(biāo)識(shí),如果不填寫疯坤,系統(tǒng)會(huì)默認(rèn)使用 UUID 作為命名空間ID报慕。此處一般都選擇自動(dòng)生成,如果為了方便記憶也可以手工填寫压怠。
  • 命名空間名:這里填寫的是命名空間的名字,此名稱會(huì)顯示在其他的一些配置面板上飞苇。
  • 描述:這里填寫的是對(duì)命名空間的一個(gè)簡單描述菌瘫。

本次我們創(chuàng)建了一個(gè)cloud的命名空間。

創(chuàng)建微服務(wù)的配置文件

在 Nacos 控制臺(tái)找到配置管理 -> 配置列表布卡,上方選擇我們上一步創(chuàng)建好的命名空間雨让,然后點(diǎn)擊最右側(cè)的+按鈕,如下圖所示:

image-20210728165112368.png

在創(chuàng)建頁面需要填入的參數(shù)說明如下:

  • Data ID:配置文件的唯一標(biāo)識(shí)忿等,一般格式為:微服務(wù)名稱-部署環(huán)境類型.后綴名栖忠。實(shí)際使用中后綴也可以省略不寫。
  • Group:配置文件的分組贸街,可以對(duì)配置文件進(jìn)行分組管理庵寞,其實(shí)主要是為了便于查詢。默認(rèn)為:DEFAULT_GROUP薛匪。
  • 描述:配置文件的描述信息捐川。
  • 配置格式:包含 TEXT、JSON逸尖、XML古沥、YAML、HTML娇跟、Properties 幾種配置書寫格式岩齿。
  • 配置內(nèi)容:具體的配置內(nèi)容。

我們以創(chuàng)建用戶服務(wù)的配置文件為例苞俘,具體填寫的參數(shù)如下:

  • Data ID:cloud-user-service-dev.yaml盹沈,其中 dev 是指我們的開發(fā)環(huán)境,后面會(huì)介紹它在框架搭建中的作用苗胀。
  • Group:BUSINESS_GROUP襟诸,這里我們定一個(gè)了一個(gè)業(yè)務(wù)組瓦堵,如果微服務(wù)不多(20個(gè)以內(nèi))則不需要單獨(dú)去指定組。
  • 描述:用戶服務(wù)配置歌亲。
  • 配置格式:YAML菇用。
  • 配置內(nèi)容:test: hello test,此配置只是為了測(cè)試陷揪,后面我們會(huì)將具體微服務(wù)的配置移植到這里惋鸥。

配置完成后點(diǎn)擊發(fā)布按鈕保存配置文件信息。

編寫bootstrap.yaml配置文件

配置文件內(nèi)容如下:

server:
  port: 10001
spring:
  profiles:
    active: dev
  application:
    name: cloud-user-service
  output:
    ansi:
      enabled: always
---
spring:
  profiles: dev
  cloud:
    nacos:
      server-addr: 172.16.1.180:8848
      discovery:
        namespace: 02ed4eca-207e-4e27-9e9e-b486080f6f1c
      config:
        namespace: 02ed4eca-207e-4e27-9e9e-b486080f6f1c
        file-extension: yaml
        prefix: ${spring.application.name}

配置說明

  • server.port:Spring Boot 內(nèi)置容器的端口號(hào)悍缠,如果是 Tomcat 則為 Tomcat 端口號(hào)卦绣。

  • spring.profiles.active:當(dāng)前激活的配置,dev-開發(fā)環(huán)境飞蚓。上線時(shí)還會(huì)添加 pro-生產(chǎn)環(huán)境滤港。

  • spring.application.name:微服務(wù)名稱。

  • spring.output.ansi.enabled:一般取值為always趴拧,即輸出帶彩色的日志溅漾。

  • spring.profiles:配置文件標(biāo)識(shí),spring.profiles.active的值與此對(duì)應(yīng)著榴。

  • spring.cloud.nacos.server-addr:Nacos 服務(wù)的地址添履。

  • spring.cloud.nacos.discovery.namespace:注冊(cè)中心的命名空間,即注冊(cè)到哪個(gè)命名空間下脑又,此處填寫的是命名空間ID暮胧。

  • spring.cloud.nacos.discovery.group:注冊(cè)中心組名,即注冊(cè)到哪個(gè)組下问麸。

  • spring.cloud.nacos.config.namespace:配置中心的命名空間往衷,即拉取哪個(gè)命名空間下的配置。

  • spring.cloud.nacos.config.file-extension:配置中心創(chuàng)建的配置文件擴(kuò)展名口叙。

  • spring.cloud.nacos.config.prefix:配置中心創(chuàng)建的配置文件前綴炼绘,一般為微服務(wù)名稱。

特別說明:prefix妄田、profiles俺亮、file-extension構(gòu)成一個(gè)完整的配置文件名,此名稱與配置中心創(chuàng)建的配置文件 Data ID 要保持一致疟呐。按照上文的配置方式脚曾,即配置中心的 Data ID為:cloud-user-service-dev.yaml

編寫啟動(dòng)類

在根包com.cloud下創(chuàng)建一個(gè)AppStart的類启具,完整代碼如下:

package com.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication(scanBasePackages = {"com.cloud"})
@EnableDiscoveryClient
public class AppStart {
    public static void main(String[] args) {
        SpringApplication.run(AppStart.class, args);
    }
}

注解說明

  • @SpringBootApplication(scanBasePackages = {"com.cloud"})注解指定了 Spring Boot 應(yīng)用程序的掃描的根包本讥,即我們最開始的時(shí)候創(chuàng)建的根包路徑。

  • @EnableDiscoveryClient注解的作用是在微服務(wù)中開啟注冊(cè)中心客戶端。

微服務(wù)測(cè)試

創(chuàng)建一個(gè)com.cloud.api.TestApi類拷沸,代碼如下:

package com.cloud.api;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test/*")
public class TestApi {
    @Value("${test:123}")
    private String test;

    @GetMapping("hello")
    public Object testCase() {
        return test;
    }
}

代碼中讀取了配置中心的配置文件內(nèi)容色查,并通過接口返回。代碼編寫完成后撞芍,啟動(dòng)微服務(wù)秧了。啟動(dòng)之后,進(jìn)入 Nacos 控制臺(tái)序无,找到服務(wù)管理 -> 服務(wù)列表验毡,如果看到微服務(wù)注冊(cè)到列表中,即說明微服務(wù)的注冊(cè)發(fā)現(xiàn)功能可用帝嗡。頁面如下:

image-20210728165211988.png

打開瀏覽器輸入:http://127.0.0.1/test/hello晶通,顯示頁面如下:
image-20210728173758557.png

頁面中打印的內(nèi)容是我們?cè)谇懊鎰?chuàng)建的配置文件中的配置內(nèi)容,如果一致哟玷,說明配置中心功能可用狮辽。

網(wǎng)關(guān)微服務(wù)搭建

本次使用的是 Spring Cloud Gateway 作為微服務(wù)網(wǎng)關(guān)。

網(wǎng)關(guān)微服務(wù)的搭建相對(duì)于業(yè)務(wù)微服務(wù)的搭建大同小異碗降,搭建步驟可以參考業(yè)務(wù)微服務(wù)的搭建步驟隘竭。本章節(jié)重點(diǎn)介紹不同的部分。

配置相關(guān)依賴

注意:Gateway 使用的是 Netty 提供網(wǎng)絡(luò)服務(wù)讼渊,并且使用 Webflux 實(shí)現(xiàn)的響應(yīng)式編程。因此在 pom.xml 文件中不可以配置spring-boot-starter-web尊剔。

按照業(yè)務(wù)微服務(wù)的搭建方法新建一個(gè)springcloud-gateway項(xiàng)目爪幻,然后在 pom.xml 配置文件中添加 Gateway 依賴

<!-- Spring Cloud Gateway 依賴 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

編寫bootstrap.yaml配置文件

本次我們以前面創(chuàng)建的用戶服務(wù)為例,來實(shí)現(xiàn)網(wǎng)關(guān)的路由须误。

server:
  port: 9527
spring:
  profiles:
    active: dev
  application:
    name: springcloud-gateway
  output:
    ansi:
      enabled: always
---
spring:
  profiles: dev
  cloud:
    nacos:
      server-addr: 172.16.1.180:8848
      discovery:
        namespace: 02ed4eca-207e-4e27-9e9e-b486080f6f1c
        register-enabled: false
      config:
        file-extension: yaml
        prefix: ${spring.application.name}
        namespace: 02ed4eca-207e-4e27-9e9e-b486080f6f1c
    gateway:
      routes:
        - id: cloud-user-service
          uri: lb://cloud-user-service
          predicates:
            - Path=/user/**
      default-filters:
        - StripPrefix=1

配置說明:

  • spring.cloud.nacos.discovery.register-enabled:是否開啟服務(wù)注冊(cè)挨稿,如果為 false,則只發(fā)現(xiàn)不注冊(cè)京痢。網(wǎng)關(guān)不需要讓其他服務(wù)發(fā)現(xiàn)奶甘,但要能夠發(fā)現(xiàn)其他服務(wù),因此這里設(shè)置為 false祭椰,即不向注冊(cè)中心注冊(cè)網(wǎng)關(guān)服務(wù)臭家。

  • spring.cloud.gateway.routes:網(wǎng)關(guān)路由配置

    • id:路由ID,一般為微服務(wù)名稱方淤,沒有實(shí)際的作用钉赁,只是作為路由規(guī)則的唯一標(biāo)識(shí)。
    • uri:路由地址携茂,支持多種協(xié)議你踩。其中lb://使用的是負(fù)載均衡協(xié)議,因此后面的地址為要路由到的微服務(wù)名字,因?yàn)閷?duì)微服務(wù)進(jìn)行負(fù)載是很常見的带膜,如果使用 http 協(xié)議吩谦,則需要為每個(gè)負(fù)載節(jié)點(diǎn)配置路由規(guī)則。如果使用負(fù)載均衡協(xié)議膝藕,則只需要為服務(wù)創(chuàng)建路由規(guī)則式廷,而無需關(guān)心具體的負(fù)載節(jié)點(diǎn)。此協(xié)議也是最常用的協(xié)議束莫。
    • predicates:路由斷言懒棉,一個(gè)路由規(guī)則中可以有很多個(gè)斷言,這里的- Path就是其中一種览绿,代表路徑匹配斷言策严。其他的規(guī)則官網(wǎng)上都有,可以自己去查閱饿敲。
  • spring.cloud.gateway.default-filters:網(wǎng)關(guān)的默認(rèn)過濾器妻导,此過濾器對(duì)有所有路由規(guī)則有效,如果是但對(duì)為某個(gè)路由規(guī)則編寫過濾器怀各,可以在routes下配置filters倔韭。

    • StripPrefix:跳過前綴,其值是指訪問路徑的 level瓢对,比如:/user/test/hello寿酌,如果 StripPrefix 為 1,則實(shí)際訪問微服務(wù)的路徑為 /test/hello硕蛹,即第一級(jí)被跳過醇疼。默認(rèn)為0,如果為 0法焰,則通過網(wǎng)關(guān)訪問到微服務(wù)的實(shí)際路徑為 /user/test/hello秧荆,如果微服務(wù)沒有提供此路徑的接口,則返回 404埃仪。

網(wǎng)關(guān)測(cè)試

創(chuàng)建一個(gè)com.cloud.filter.TestFilter的過濾器類乙濒,具體代碼如下:

package com.cloud.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 測(cè)試過濾器
 */
@Component
public class TestFilter implements GlobalFilter, Ordered {
    /**
     * 過濾規(guī)則
     * @param exchange 信息交換對(duì)象,內(nèi)部包含 HTTP 請(qǐng)求的相關(guān)實(shí)例
     * @param chain 過濾鏈
     * @return 返回 Mono 對(duì)象
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 此處編寫過濾規(guī)則
        System.out.println("==========> 我是測(cè)試過濾器");

        return chain.filter(exchange);
    }

    /**
     * 排序規(guī)則
     * @return 返回排序編號(hào)(值越小卵蛉,執(zhí)行順序越早)
     */
    @Override
    public int getOrder() {
        return Ordered.HIGHEST_PRECEDENCE;
    }
}

實(shí)際開發(fā)中颁股,我們?nèi)绻枰帉懢唧w的過濾規(guī)則都按照此方法編寫。代碼編寫完成后毙玻,啟動(dòng)網(wǎng)關(guān)服務(wù)豌蟋。修改用戶服務(wù)的測(cè)試接口代碼如下:

package com.cloud.api;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/test/*")
public class TestApi {
    @Value("${test:123}")
    private String test;

    @GetMapping("hello")
    public Object testCase() {
        return "用戶服務(wù)返回:" + test;
    }
}

這樣,我們?cè)谕ㄟ^網(wǎng)關(guān)路由時(shí)桑滩,就可以清楚的看到是否真的調(diào)用了用戶服務(wù)的接口梧疲。修改完畢后記得重啟用戶服務(wù)允睹。

打開瀏覽器,輸入http://127.0.0.1:9527/user/test/hello幌氮,返回如下頁面:

image-20210728173758557.png

從頁面中缭受,我們可以看到,網(wǎng)關(guān)確實(shí)調(diào)用了用戶服務(wù)该互,也正常返回了用戶服務(wù)測(cè)試接口的信息米者。接下來查看日志輸出,如下圖所示:


image-20210728174024704.png

這里可以看到宇智,我們?cè)诰W(wǎng)關(guān)過濾器輸出的一段話蔓搞,在控制臺(tái)被打印出來了,證明我們編寫的過濾器也是可用的随橘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末喂分,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子机蔗,更是在濱河造成了極大的恐慌蒲祈,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件萝嘁,死亡現(xiàn)場(chǎng)離奇詭異梆掸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)牙言,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門酸钦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咱枉,你說我怎么就攤上這事泉手〉肆耍” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵褪尝,是天一觀的道長因谎。 經(jīng)常有香客問我基括,道長,這世上最難降的妖魔是什么财岔? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任风皿,我火速辦了婚禮,結(jié)果婚禮上匠璧,老公的妹妹穿的比我還像新娘桐款。我一直安慰自己,他們只是感情好夷恍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布魔眨。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪遏暴。 梳的紋絲不亂的頭發(fā)上侄刽,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音朋凉,去河邊找鬼州丹。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杂彭,可吹牛的內(nèi)容都是我干的墓毒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼亲怠,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼所计!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赁炎,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤醉箕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后徙垫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體讥裤,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年姻报,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了己英。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吴旋,死狀恐怖损肛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荣瑟,我是刑警寧澤治拿,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站笆焰,受9級(jí)特大地震影響劫谅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嚷掠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一捏检、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧不皆,春花似錦贯城、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲫骗。三九已至,卻和暖如春悲雳,著一層夾襖步出監(jiān)牢的瞬間挎峦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工合瓢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坦胶,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓晴楔,卻偏偏與公主長得像顿苇,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子税弃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容