Spring Cloud Gateway是在Spring生态系统上构建的API网关服务,基于Spring5,Spring Boot2 和Project Reactor等技术,旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤功能,例如:熔断、限流、重试等。
Spring Cloud Gateway是基于WebFlux实现的,而web Flux框架底层则使用了高性能的Reactor模式通信框架Netty,是基于异步非阻塞模型上开发的,在高并发和非阻塞式通信下是十分有优势的,所以在性能方面基本不需要担心。
spring cloud gateway引入的jar包:
引入的WebFlux和Web存在冲突,所以不要两个包一起引入。
jdk8不支持WebFlux技术,要升级jdk
spring cloud gateway 在架构中所处的位置:
三个核心概念
新建config-server项目模块作为配置中心。
<!--gateway-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
启动类加注解:@EnableEurekaClient
@EnableEurekaClient
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
server:
port: 9527
spring:
application:
name: cloud-gateway
cloud:
gateway:
routes:
- id: payment_routh #路由id
uri: http://localhost:8762 #提供服务的路由地址
predicates:
- Path=/** #断言,路径相匹配的进行断言
#注册进eureka,默认true
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
hostname: cloud-gateway-service
启动eureka-server、启动eureka-client:8001、启动config-server网关。
eureka-client controller层写一个可以调用的方法,用于测试网关是否起作用。
@ResponseBody
@RequestMapping("/testGateway")
public String testGateway(){
return "testGateway";
}
访问localhost:8762/testGateway测试eureka-server能否正常访问。
eureka-client正常运行。
访问localhost:9527/testGateway测试
通过gateway网关成功访问eureka-server
当一个服务有多个微服务组成时,可以使用动态路由,并进行负载均衡。
spring:
application:
name: cloud-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #开启从注册中心动态创建路由的功能,利用微服务进行路由
routes:
- id: client-test
# uri: http://localhost:8762
uri: lb://eureka-client #匹配提供服务的路由地址
predicates:
- Path=/user/**
- id: client_routh2
# uri: http://localhost:8763
uri: lb://eureka-client
predicates:
- Path=/dictionary/lb/**
访问localhost:9527/testGateway即可
自定义过滤器 GlobalFilter
要实现两个接口:implements GlobalFilter, Ordered
@Component
public class GatewayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取请求路径
String url = exchange.getRequest().getURI().getPath();
//获取请求参数中的username
String username = exchange.getRequest().getQueryParams().getFirst("username");
if(username == null){
//不放行
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
//加载过滤器的顺序,一般数字越小优先级越高。
@Override
public int getOrder() {
return 0;
}
}
当需要进行跨越配置时
官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/multi/multi__cors_configuration.html
spring:
cloud:
gateway:
globalcors:
corsConfigurations:
‘[/**]‘:
allowedOrigins: "http://docs.spring.io"
allowedMethods:
- GET
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}
原文:https://www.cnblogs.com/Zzwena/p/12547325.html