springCloudGateway使用
核心概念
- 路由(route)
路由是网关中最基础的部分,路由信息包括一个ID、一个目的URI、一组断言工厂、一组Filter组成。如果断言为真,则说明请求的URL和配置的路由匹配。 - 断言(predicates)
Java8中的断言函数,SpringCloud Gateway中的断言函数类型是Spring5.0框架中的ServerWebExchange。断言函数允许开发者去定义匹配Http request中的任何信息,比如请求头和参数等。 - 过滤器(Filter)
SpringCloud Gateway中的filter分为Gateway FilIer和Global Filter。Filter可以对请求和响应进行处理。
快速开始
2.1 环境搭建
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
编写配置
server:
port: 8088
spring:
application:
name: api-gateway
cloud:
# gateway配置
gateway:
routes:
- id: unify_route # 路由的唯一标识
uri: http://localhost:8020 # 需要转发的地址
# 断言规则
predicates:
- Path=/unify-service/**
filters:
- StripPrefix=1
服务地址: http://localhost:8020/order/get
网关地址: http://localhost:8088/unify-service/order/get/
断言的意思就是匹配到了就进行转发
此处过滤器的意思是,转发的时候去掉一层 即去掉了 /unify-service
过滤器中还可以做一些其他操作,比如添加请求头,设置cookies等等
2.2 集成nacos
父pom文件导入依赖管理
<dependencyManagement>
<dependencies>
<!-- spring boot 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.4.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud 依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring cloud alibaba 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2020.0.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
gateway服务导入依赖
<!--服务注册-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引入loadbalancer springcloud.2020 剔除了ribbon 所以需要导入,不导入则会报503错误 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
一般集成
编写配置文件
server:
port: 8888
spring:
application:
name: api‐gateway
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
gateway:
routes:
‐ id: product_route
uri: lb://service‐product # lb指的是从nacos中按照名称获取微服务,并遵循负载均衡策略
predicates:
‐ Path=/product‐serve/**
filters:
‐ StripPrefix=1
简写
去掉关于路由的配置,自动寻找服务,也就是按照服务名来进行断言
比如一个服务spring.application.name=order-service
那么通过网关访问这个服务地址就是: http:localhost:8888/order-service/
server:
port: 8888
spring:
application:
name: api‐gateway
cloud:
nacos:
discovery:
server‐addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: true
我们一般不这么进行配置:
因为这么配置,配置不够清晰,具体的访问路径还得去nacos上查看,且少了很多gateway的功能入断言工厂以及过滤器工厂
Reactor Netty 访问日志
要启用Reactor Netty访问日志,需要设置
# 它必须是 Java 系统属性,而不是 Spring Boot 属性。也就是在application.yaml中配置无效
-Dreactor.netty.http.server.accessLogEnabled=true
跨域配置
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;
import java.util.Collections;
@Configuration
public class CorsConfig {
@Bean
public CorsWebFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
config.addAllowedMethod("*");
config.addAllowedOrigin("*");
config.addAllowedHeader("*");
config.setAllowCredentials(true);
config.setExposedHeaders(Collections.singletonList("Content-disposition"));
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
source.registerCorsConfiguration("/**", config);
return new CorsWebFilter(source);
}
}