springCloudGateway-使用記錄

一、需求描述

  舊項目做好之後,已經維護了一兩個月,基本上已經趨於穩定,按照項目的整體進度基本上不會在做什麼改動。新項目已經確定

下來,只是有一個大概的需求,unity3d的客戶端已經開始做,在這個月23號之前會要求先出一個遊戲的版本。目前相對來說不是太忙,

自己就考慮著開始搭建新項目的框架,首先考慮的就是先搭建網關服務。之前的項目由於工期非常短,並且非常急就沒有把網關服務

給加進去,現在有時間了自己就想著第一個任務就是先添加網關服務,之後在根據需要在添加其他的服務。

二、需求分析

  自己的一個了解,網關服務可以做很多事情,比如實現所有訪問請求的日誌採集;身份認證,是否已經登錄,是否有許可權登錄某個

系統;如果系統的訪問量比較大的話,還可以做負載均衡;還可以做路由轉發,根據不同的路由轉發到對應的服務。好處這麼多當然需要

使用一個網關服務來作為項目的統一入口,做各種事情。

三、技術選型

由於現在技術更新得特別快,比如springboot的版本一直在不斷地進行更新,支援時間也在不斷地壓縮。

 

 

 參考了很多資料,最終自己採納選擇2.3.x的springboot版本,springcloud和springcloudalibaba的版本如下,

<!-- 依賴的jar包所對應的版本 -->
<properties>
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
<!--<spring-cloud-starter-alibaba-nacos-config.version>1.4.2</spring-cloud-starter-alibaba-nacos-config.version>-->

<!-- 編譯插件 mvn compile -->
<maven-compiler-plugin.source>1.8</maven-compiler-plugin.source>
<maven-compiler-plugin.target>1.8</maven-compiler-plugin.target>
<maven-compiler-plugin.encoding>UTF-8</maven-compiler-plugin.encoding>

<!-- 是否跳過單元測試 解決中文亂碼 -->
<maven-surefire-plugin.skipTests>true</maven-surefire-plugin.skipTests>
<maven-surefire-plugin.argLine>-Dfile.encoding=UTF-8</maven-surefire-plugin.argLine>
<mybatis-generator-maven-plugin.version>1.3.2</mybatis-generator-maven-plugin.version>
</properties>

<!-- 單個子項目特有的jar包 -->
<dependencyManagement>
<dependencies>
<!-- springcloud版本 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<!-- springcloud alibaba 版本 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>

</dependencyManagement>

版本選定好之後就開始搭建項目。由於自己之前一直在使用springcloudalibaba的nacos組件,因此新搭建的項目中繼續使用這個組件。

 主要用來做配置管理和服務發現。本篇博文需要有nacos使用基礎的人才能理解。

 

首先搭建gateway網關項目,java程式碼很簡單,就一個啟動類,導入的maven配置如下:<dependencies>

    <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!-- lombok 僅限編譯的時候使用 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>

<!-- nacos 配置管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- nacos 服務發現 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>

nacos中的配置如下:
server.port=51309
#路由ID 唯一即可,就類似於數據表中的主鍵ID
spring.cloud.gateway.routes[0].id=motionBackend
#路由轉發的地址 lb表示 以load balance 負載均衡的 方式 將講求轉發到 motionSpacebackend(項目名稱) 這個項目中,解析之後是一個具體的地址
spring.cloud.gateway.routes[0].uri=lb://motionSpacebackend
#訪問地址中包含的路徑
spring.cloud.gateway.routes[0].predicates[0]=Path=/gateway/backend/**
#StripPrefix 表示去掉前綴 1 表示第一個前綴 即使是去除 訪問地址中的 /gateway/ 前綴
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1
 
bootstrap.properties的配置如下:

 

spring.application.name=motionSpaceGateway
spring.profiles.active=dev
#配置管理
spring.cloud.nacos.config.server-addr=127.0.0.1:24700
#spring.cloud.nacos.config.server-addr=192.168.1.2.5
#命名空間
spring.cloud.nacos.config.namespace=8760e76628114fceb7fc723b2da51c5c
#分組配置
spring.cloud.nacos.config.group=motionSpace
# 開啟動態刷新
spring.cloud.nacos.config.refresh.enabled=true
#讀取的配置文件後綴名
spring.cloud.nacos.config.file-extension=properties
#服務發現地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:24700
#spring.cloud.nacos.discovery.server-addr=192.168.1.2.5
 

由於剛開始搭建項目,只要請求能夠轉發即可,之後的一些功能會一步一步的進行添加。

做完這些工作後,啟動項目,如下圖

 

 

 

 注意事項:springcloudgateway這個項目,不需要配置項目的根路徑,如上圖所示。它和其他springboot項目的啟動方式還不太一樣,其他

項目可以配置項目的根路徑,在項目啟動時也會添加進去。可是springcloudgateway 即使在配置中添加了項目根路徑,啟動時也不會載入。

上圖顯示的是Netty started on port,只需要配置一個埠即可。

 

之後是搭建一個後端主項目,導入的maven配置如下:

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- lombok 僅限編譯的時候使用 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>

<!-- nacos 配置管理 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

<!-- nacos 服務發現 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>

配置更加簡單,一個埠和一個訪問路徑即可:

server.servlet.context-path=/backend
server.port=17303

 

bootstrap.properties的配置如下:

 

 

 

spring.application.name=motionSpacebackend
spring.profiles.active=dev
#配置管理
spring.cloud.nacos.config.server-addr=127.0.0.1:24700
#spring.cloud.nacos.config.server-addr=192.168.1.2.5
#命名空間
spring.cloud.nacos.config.namespace=8760e76628114fceb7fc723b2da51c5c
#分組配置
spring.cloud.nacos.config.group=motionSpace
# 開啟動態刷新
spring.cloud.nacos.config.refresh.enabled=true
#讀取的配置文件後綴名
spring.cloud.nacos.config.file-extension=properties
#服務發現地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:24700
#spring.cloud.nacos.discovery.server-addr=192.168.1.2.5

然後添加一個測試類

@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {

/**
* @description:
* @author: dengyilang
* @date: 2022/1/7 17:40
* @return: void
*/
@RequestMapping(value = "/rout", method = RequestMethod.GET)
public String scanBind(){
log.info("backend路由測試---");
return "路由測試";
}
}

項目啟動成功。

 

 

 

首先測試後端項目能否正常訪問,訪問的地址為 //localhost:17303/backend/test/rout

 

 

 測試結果正常。

 

然後測試使用網關服務進行轉發是否正常,請求地址為 //localhost:51309/gateway/backend/test/rout

 

 

 測試結果正確。

請求的大致過程為 首先請求地址 //localhost:51309/gateway/backend/test/rout 會到達 gateway項目的後台,

根據路由匹配規則,匹配到如下圖中的路由,並且會截取掉第一個前綴/gateway/變為 //localhost:51309/backend/test/rout

 

 

 然後gateway項目將請求進行轉發到下圖的地址中,gateway項目在底層進行處理時,會將motionSpacebackend這個項目名稱解析為

對應的地址和埠,在本地就解析為127.0.0.1:17303

 

 

轉發後的請求就變為//127.0.0.1:17303/backend/test/rout  最終正確地返回想要的結果。

到此一個簡單的網關服務就搭建完成,之後在使用過程中遇到任何問題都會更新在本篇部落格中。

參考部落格

//www.cnblogs.com/hellohero55/p/12723451.html