1.引入SpringCloudGateway和注册中心(这里选用Eureka)的依赖
<?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.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.wanna</groupId>
<artifactId>springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-gateway-gateway9527</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.1</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.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>
2.创建application.yaml
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
discovery:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
gateway:
routes:
- id: payment_route #路由的id,只需要保证唯一即可,建议使用服务名
#uri: http://localhost:8002 #写死的路由
uri: lb://CLOUD-PROVIDEREUREKA-PAYMENT8002 #利用微服务进行动态路由,lb表示负载均衡,利用ribbon
predicates: #利用断言进行路由匹配
- Path=/payment/** #使用Path的方式,更多方式可以参考官网
eureka:
instance:
hostname: cloud-gateway-service
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka
register-with-eureka: true #将自己注册到eureka
fetch-registry: true
#Gateway不需要引入web的jar包,引入会报错
#Gateway挡在了8001之前,我们可以不暴露出来8001的真实端口,只暴露出来9527
#uri不应该写死成http://localhost:8002,而应该去使用动态路由的方式去匹配
#默认情况下Gateway会根据注册中心注册的服务列表
#以注册中心上微服务的名称为路径创建动态路由进行转发,从而实现动态路由的功能
#需要加上spring.cloud.discovery.enabled=true的配置,并修改uri为
#lb://微服务名
相关说明:
#SpringCloudGateway将路由匹配作为Spring Webflux HandlerMapping基础架构的一部分
#SpringCLoudGateway包含许多内置的Route Predicate工厂,这些工厂都与Http请求的不同属性匹配
#并且多个工厂之间可以进行组合使用,SpringCloudGateway创建Route时,使用RoutePredicateFactory
#创建Predicate对象,Predicate对象可以赋值给Route。SpringCloudGateway包含许多内置的RoutePredicateFactories
#所有这些谓词都匹配Http请求的不同属性,多个谓词工厂可以组合,使用and逻辑
#包括如下的Predicate:
#1.AfterRoutePredicate,后面指定一个时间(格式看官网,也可以使用ZonedDateTime.now()等方式获取),表示在这个时间点之后才能访问
#2.BeforeRoutePredicate,和Before类似,在这个时间点之前才能访问
#3.BetweenRoutePredicate,在两个时间点之间利用访问
#4.CookieRoutePredicate,需要两个参数(逗号连接),一个是CookieName,一个是正则表达式,携带Cookie且CookieName需要符合正则表达式的条件才能访问
#5.HeaderRoutePredicate,类似Cookie,也是一个HeaderName,一个正则表达式
#6.HostRoutePredicate
#7.MethodRoutePredicate,-Method=GET
#8.PathRoutePredicate
#9.QueryRoutePredicate,类似Cookie,一个QueryName,一个正则表达式
#Gateway的Filters:
#常见的Filter有AddRequestParameter,添加请求头
#eg:AddRequestParameter=aaa,123 #添加请求头aaa-123
#在工作中我们一般使用自定义的Filter(全局日志记录,统一网关鉴权)
#自定义Filter需要实现GlobalFilter,Ordered接口
#demo实现见config/
3.创建主启动类
package com.wanna.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient //Eureka客户端
public class CloudGatewayGateway9527Application {
public static void main(String[] args) {
SpringApplication.run(CloudGatewayGateway9527Application.class, args);
}
}
4.自定义过滤器
package com.wanna.springcloud.config;
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;
@Component
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//exchange.getRequest() 类似获取HttpServletRequest
//exchange.getResponse() 类似获取HttpServletResponse
return chain.filter(exchange); //放行
}
@Override
public int getOrder() {
return 0;
}
}
5.Gateway的意义?
- 可以不暴露出来真实的后端端口,全部通过网关进行路由的转发,利用注册中心进行动态路由的转发,凡是要请求后端的API,都必须通过网关!
网友评论