前兩篇文章我們已經初步的完成了一個小型的微服務框架,有服務註冊中心,有訂單服務,也有庫存服務;訂單服務也能通過feign進行服務間調用庫存服務。那本文我們將引入服務網關Spring Cloud Gateway。
Spring Cloud Gateway旨在提供一種簡單而有效的方法來路由到API。Spring Cloud Gateway是基於Spring Framework5,Spring Boot 2.0構建的。Spring Cloud Gateway是Spring開發並用來替代Zuul的。Spring Cloud Gate是基於Spring Framework5的WebFlux實現的。
Zuul和Spring Cloud Gateway的對比大家請參考這篇文章:https://www.cnblogs.com/yizhishi/archive/2019/09/26/11588860.html
接下來我們開始引入Spring Cloud Gateway。
1. 創建網關服務module
按照第二篇文章創建一個module,起名爲server-gateway。
2. 修改pom文件,引入gateway
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</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>
</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>
這裏我們同樣將gateway註冊到eureka。
3. 修改啓動類
@SpringBootApplication
@EnableEurekaClient
public class ServerGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(ServerGatewayApplication.class, args);
}
}
這裏只需要加上eureka客戶端的註解即可
4. 修改配置文件
server.port=10010
spring.application.name=server-gateway
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
eureka.instance.instance-id=${spring.application.name}:${server.port}
# 路由到app-storage服務
spring.cloud.gateway.routes[0].id=app-storage
spring.cloud.gateway.routes[0].uri=lb://APP-STORAGE
spring.cloud.gateway.routes[0].predicates[0]=Path=/storage/v1/**
spring.cloud.gateway.routes[0].filters[0]=StripPrefix=2
# 路由到app-order服務
spring.cloud.gateway.routes[1].id=app-order
spring.cloud.gateway.routes[1].uri=lb://APP-ORDER
spring.cloud.gateway.routes[1].predicates[0]=Path=/order/v1/**
spring.cloud.gateway.routes[1].filters[0]=StripPrefix=2
這裏我們着重介紹下,怎麼配置路由,以app-storage爲例。
- spring.cloud.gateway.routes[0].id 是配置這個路由唯一id
- spring.cloud.gateway.routes[0].uri是配置uri也就是app-storage所在的服務,這裏使用lb://是代表採用負載均衡
- spring.cloud.gateway.routes[0].predicates[0]是配置請求app-storage下所有接口的請求前綴
- spring.cloud.gateway.routes[0].filters[0]是用來配置轉發到app-storage上的服務路徑時,要去掉兩個/的路徑。比如直接訪問app-storage的服務的路徑是http://ip:port/storage/deduct,我們這裏配置的是/storage/v1,那麼我們通過網關訪問的時候就是http://ip:port/storage/v1/storage/deduct,當網關轉發的時候,會去找app-storage服務下的storage/v1/storage/deduct接口,這個接口顯然是沒有的,只有storage/deduct接口,這個時候就需要去掉storage/v1,一共是兩個前綴,所以這兒要寫2.
好了,這裏我們就可以通過網關訪問app-storage和app-order服務了
5. 通過gateway訪問服務
依次啓動server-eureka,server-gateway,app-storage,app-order
訪問 http://127.0.0.1:10010/order/v1/order/placeOrder/commit ,我們上一篇文章寫好的下單接口。因爲我們加了請求前綴order/v1,所以再這裏要加上。
如果返回true,代表網關配置成功。
網關如果只是用來路由就沒有必要上Spring Cloud Gateway了,nginx就可以搞定了,路由僅僅是網關的基本本能,基於網關我們可以做接口鑑權,限流等。下一篇文章我們講講怎麼通過網關鑑權