一、GateWay
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
1. 创建网关模块
首先在pom文件中导入相对应的jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
然后编写yml文件,向注册中心进行注册
server:
port: 9527
eureka:
instance:
hostname: cloud-gateway-service
client:
fetch-registry: true
register-with-eureka: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka, http://eureka7002.com:7002/eureka
这时候完成了基本创建,开始编写路由,有两种方式,推荐用第一种方式
方式一:编写yml文件的形式
spring:
application:
name: cloud-gateway
cloud:
gateway:
routes:
- id: payment_routh # 路由的id,没有规定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/getPayment/** # 断言,路径相匹配的进行路由
方式二:通过配置类的形式
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator gateway(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes(); // 获得一个类似yml中的routes
// 参数:id名称, 路由函数(包含了匹配路径,以及转发地址)
routes.route("path_pay", r -> r.path("/guonei").uri("http://news.baidu.com/guonei"));
return routes.build(); // 进行返回
}
}
然后在yml文件下进行如下配置:
spring:
cloud:
gateway:
discovery:
locator:
enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名称进行路由
routes:
- id: payment_routh # 路由的id,没有规定规则但要求唯一,建议配合服务名
#这里协议换成了lb,和服务名的方式进行访问
uri: lb://CLOUD-SERVICE
predicates:
- Path=/payment/getPayment/** # 断言,路径相匹配的进行路由
常见的匹配规则:
predicates:
- Path=/payment/getPayment/** # 路径相匹配的进行转发
- After=2020-05-26T13:26:47.809771200+08:00[Asia/Shanghai] # 在指定时间后才可以访问
- Before=2020-05-26T13:26:47.809771200+08:00[Asia/Shanghai] # 在指定时间前才可以访问
- Between=2020-05-26T13:26:47.809771200+08:00[Asia/Shanghai], 2020-05-26T19:26:47.809771200+08:00[Asia/Shanghai] # 在指定时间之间
- Cookie=username, zzyy # 带着"username=zzyy"的cookie才能正常访问
- Header=X-Request-Id, \d+ # 带着"X-Request-Id: 1324" 的请求头才可以访问
- Host=**.somehost.org # host满足这个条件的才可以访问
- Method=GET # 必须是GET请求才可以访问
- Query=green # 查询的是green才可以访问
- RemoteAddr=192.168.1.1/24 # 当迁移地址是这个的时候才可以访问
权重的形式:
当出现两个完全一样的路由时可以通过权重进行分配
spring:
cloud:
gateway:
routes:
- id: weight_high
uri: https://weighthigh.org
predicates:
- Weight=group1, 8 # 第一个参数group1代表是哪个分组, 8是权重
- id: weight_low
uri: https://weightlow.org
predicates:
- Weight=group1, 2
过滤器:
springcloud自带有许多的过滤器,这里不再进行一一赘述,详见https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.2.RELEASE/reference/html/#httpheadersfilters
自定义过滤器;
@Component
public class MyFilter implements Ordered, GlobalFilter { // 需要实现这两个接口
@Override
public int getOrder() {
return 0;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String uname = exchange.getRequest().getQueryParams().getFirst("uname");// 检测是否有uname这个参数
if (uname == null){
System.out.println("非法用户");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); // 设置http响应码
return exchange.getResponse().setComplete(); // 进行打回
}
return chain.filter(exchange); // 进行放行
}
}