最初的想法,是將Gateway與注冊中心整合,並成一個工程,實際操作后發現不行。
1、Gateway 與 spring-boot-starter-web 包沖突,Gateway 明確聲明,需要清除 spring-boot-starter-web 依賴,
2、在與Server整合后,出現代碼不兼容的情況,部分Class無法找到,無法啟動項目。
既然如此,還是遵循慣例優先原則,盡可能地選擇默認配置,不去過分改動原本的設計。
完成本章節的內容,就已經完成了SpringCloud的基本。后續的代碼主要看實際業務需求,使用框架,能幫助我們節省大量的代碼,但是,不通過框架也可以自己編碼解決,並沒有太多的硬性規定。
本次編碼的目的,是為了統一程序入口,通過一個端口,可以訪問所有的服務,方便后續的鑒權、授權等功能。
Maven依賴
<?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 https://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.13.RELEASE</version> <relativePath/> </parent> <groupId>cn.seaboot</groupId> <artifactId>gateway</artifactId> <version>0.0.1-SNAPSHOT</version> <name>gateway</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR5</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <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-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <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> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
Yml配置
實際上,需要的配置就下面幾行
server:
port: 8760
spring:
application:
name: api-gateway
# 開啟 Gateway 服務注冊中心服務發現
cloud:
gateway:
discovery:
locator:
enabled: true
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
Java代碼
package cn.seaboot.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; /** * @author Mr.css */ @SpringBootApplication public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } @Bean public RouteLocator myRoutes(RouteLocatorBuilder builder) { //常見的demo,攔截get請求,往請求頭添加一個參數,然后轉到http://httpbin.org:80 return builder.routes() .route(p -> p .path("/get") .filters(f -> f.addRequestHeader("Hello", "World")) .uri("http://httpbin.org:80")) .build(); // return builder.routes() // .route(p -> p // .path("/get") // .filters(f -> f.addRequestHeader("Hello", "World")) // .uri("http://httpbin.org:80")) // .build(); } }
效果如下:
訪問接口 http://localhost:8760/CLIENT-A/hi ,通過服務名即可訪問頁面,效果如下: