您好,登錄后才能下訂單哦!
小編給大家分享一下SpringCloud Gateway怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
Spring Cloud Gateway是Spring Cloud技術棧中的網關服務,本文實戰構建一個SpringCloud環境,并開發一個SpringCloud Gateway應用,快速體驗網關服務;
操作系統:win10(64位)
JDK:1.8.0_181
Maven:3.5.0
Spring Cloud:Greenwich.SR
如果您不打算寫代碼,也可以從GitHub上下載本次實戰的源碼,地址和鏈接信息如下表所示:
名稱 | 鏈接 | 備注 |
---|---|---|
項目主頁 | https://github.com/zq2599/blog_demos | 該項目在GitHub上的主頁 |
git倉庫地址(https) | https://github.com/zq2599/blog_demos.git | 該項目源碼的倉庫地址,https協議 |
git倉庫地址(ssh) | git@github.com:zq2599/blog_demos.git | 該項目源碼的倉庫地址,ssh協議 |
</br>
這個git項目中有多個文件夾,本章的源碼在gatewaydemo文件夾下,如下圖紅框所示:
本次實戰的源碼涉及到三個應用:注冊中心、服務提供者、網關,它們的關系和業務邏輯如下圖: 整個工程基于maven構建,采用父子結構,父工程名為gatewaydemo,里面有三個modular,分別是:eureka()注冊中心)、provider(服務提供者)、網關(gateway),在IDEA上呈現的結構如下圖所示: 準備完畢,開始編碼吧;
創建名為gatewaydemo的maven工程,pom.xml內容如下,這是個典型的父子工程pom,dependencyManagement節點接管了版本匹配:
<?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>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> </parent> <groupId>com.bolingcavalry</groupId> <artifactId>gatewaydemo</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <modules> <module>eureak</module> <module>provider</module> <module>gateway</module> </modules> <properties> <java.version>1.8</java.version> <spring-boot.version>2.1.6.RELEASE</spring-boot.version> <maven-compiler-plugin.version>3.5</maven-compiler-plugin.version> <maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version> <maven-failsafe-plugin.version>2.18.1</maven-failsafe-plugin.version> <maven-surefire-plugin.version>2.21.0</maven-surefire-plugin.version> <spring-cloud.version>Greenwich.SR2</spring-cloud.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project>
如果您是用IDEA創建的工程,那么IDEA可能會在pom.xml所在目錄自動創建<font color="blue">src</font>文件夾,請手動將其刪除,因為用不上;
接下來是創建注冊中心,鼠標右鍵點擊<font color="blue">gatewaydemo</font>文件夾,選擇"New -> Module":
在彈出窗口選擇<font color="blue">Spring Initializr</font>,如下圖:
接下來的窗口填寫Group、Artifact(這里是eureka)、Version等信息,其余的默認,即可完成子工程的創建;
新的eureka模塊的pom.xml,請修改成如下內容,可見除了指定父工程,還依賴了<font color="blue">spring-cloud-starter-netflix-eureka-server</font>:
<?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"> <parent> <artifactId>gatewaydemo</artifactId> <groupId>com.bolingcavalry</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>eureak</artifactId> <packaging>war</packaging> <name>eureak Maven Webapp</name> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
src\main\resources目錄下新增application.yml文件,內容如下,這是普通的注冊中心設置:
spring: application: name: eureka server: port: 8080 eureka: client: service-url: defaultZone: http://localhost:${server.port}/eureka/ fetch-registry: false register-with-eureka: false
java文件只有一個,就是啟動類,還通過注解EnableEurekaServer開啟了注冊中心服務:
package com.bolingcavalry.eureka; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class, args); } }
以上就是注冊中心eureka的內容,運行EurekaApplication即可啟動服務,訪問8080端口的結果如下: 現在注冊中心已經就緒,開始編寫服務提供者provider應用的代碼吧。
在gatewaydemo下創建一個子工程,名為provider,pom.xml內容如下,可見用到了spring-boot-starter-web和spring-cloud-starter-netflix-eureka-client這兩個依賴,分別用來支持web服務和注冊發現:
<?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"> <parent> <artifactId>gatewaydemo</artifactId> <groupId>com.bolingcavalry</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>provider</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
配置文件application.yml如下,指定了注冊中心地址,并且自身端口為8081:
eureka: client: serviceUrl: defaultZone: http://localhost:8080/eureka/ server: port: 8081 spring: application: name: provider
啟動類ProviderApplication.java:
package com.bolingcavalry.provider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } }
增加一個controller,用于響應web請求,注意hello方法會從請求的header中取出名為<font color="blue">extendtag</font>的屬性值,返回給瀏覽器:
package com.bolingcavalry.provider.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; import java.util.Date; @RestController @RequestMapping("/hello") public class HelloController { @RequestMapping(value = "time", method = RequestMethod.GET) public String hello(HttpServletRequest request){ return "hello, " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + ", extendtag [" + request.getHeader("extendtag") + "]"; } }
啟動應用,再次刷新eureka的頁面localhost:8080,可見provider應用已經注冊上去了,如下圖紅框所示:
訪問地址:http://localhost:8081/hello/time ,這是controller提供的web服務接口,得到響應如下圖,因為header中沒有名為"extendtag"的屬性,因此返回了null: 提供服務的provider已經OK,可以開發網關服務了;
在gatewaydemo下創建一個子工程,名為gateway,pom.xml內容如下,可見用到了spring-cloud-starter-gateway和spring-cloud-starter-netflix-eureka-client這兩個依賴,分別用來支持網關服務和注冊發現:
<?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"> <parent> <artifactId>gatewaydemo</artifactId> <groupId>com.bolingcavalry</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>gateway</artifactId> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
配置文件application.yml如下,指定了注冊中心地址,并且自身端口為8082,還有開啟了網關服務:
server: port: 8082 spring: application: name: gateway cloud: gateway: discovery: locator: enabled: true lowerCaseServiceId: true eureka: client: service-url: defaultZone: http://localhost:8080/eureka/
啟動類GatewayApplication .java,可見實例化了一個RouteLocator,該實例就是路由規則,具體的功能請參考代碼中的注釋:
package com.bolingcavalry.gateway; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; @SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() //增加一個path匹配,以"/gateway/hello/"開頭的請求都在此路由 .route(r -> r.path("/customize/hello/**") //表示將路徑中的第一級參數刪除,用剩下的路徑與provider的路徑做拼接, //這里就是"lb://provider/hello/",能匹配到provider的HelloController的路徑 .filters(f -> f.stripPrefix(1) //在請求的header中添加一個key&value .addRequestHeader("extendtag", "geteway-" + System.currentTimeMillis())) //指定匹配服務provider,lb是load balance的意思 .uri("lb://provider") ).build(); } }
啟動應用,再次刷新eureka的頁面localhost:8080,可見gateway應用已經注冊上去了,如下圖紅框所示:
訪問地址:http://localhost:8082/customize/hello/time ,這是符合前面我們配置的路由規則的路徑,customize被刪除掉之后,將剩余的路徑轉發到provider服務,于是請求的真正地址就是provider服務的/hello/time,得到響應如下圖,因為gateway在轉發的時候給header中設置了名為"extendtag"的屬性,因此返回了extendtag是有內容的:
以上是“SpringCloud Gateway怎么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。