当我们后端的服务部署在不同的ip和端口上,存在一些问题:


Spring Cloud Gateway 基于Spring Framework(支持Spring WebFlux),Project Reactor 和 Spring Boot 进行构建,具有如下特性:

路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true 则匹配该路由

需要将服务消费方升级成服务网关
引入gateway-starter网关场景启动器
org.springframework.cloud
spring-cloud-starter-gateway
Gateway路由配置两种【application.yml和配置类】
配置类
//配置类-配置路由
@Configuration
public class GateWayRoutesConfig {
/*
Function fn
:函数式接口,接收的类型是PredicateSpec,返回的类型是 Route.AsyncBuilder
r -> r.path("/member/get/**")
.uri("http://localhost:10001") 是Lambda表达式
*/
@Bean
public RouteLocator myRouteLocator04(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
/*
route 源码:
public Builder route(String id, Function fn) {
Route.AsyncBuilder routeBuilder = (Route.AsyncBuilder)fn.apply((new RouteSpec(this)).id(id));
this.add(routeBuilder);
return this;
}
*/
return routes.route("member_route04",r -> r.path("/member/get/**")
.uri("http://localhost:10001"))
.build();
}
}
application.yml【推荐】
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
#配置路由,可以配置多个路由 放在List routes 中
routes:
- id: member_route01 #路由的ID
# uri: http://localhost:10001 #路由目标接口的ip 和 端口
uri: lb://member-service-provider #lb:// 是协议名【Load Balance负载均衡的协议名】 member-service-provider 是服务名小写
predicates: #断言,可以多种形式
- Path=/member/get/**
- id: member_route02 #路由的ID
# uri: http://localhost:10001 #路由目标接口的ip 和 端口
uri: lb://member-service-provider #lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
predicates: #断言,可以多种形式
- Path=/member/save
只需要添加配置类即可【默认的轮询算法足够应对大多业务】
//配置自己的负载均衡算法
@Configuration
public class RibbonRule {
// 配置注入负载均衡算法
@Bean
public IRule myRibbonRule(){
return new RandomRule();//new 的就是负载均衡算法 ,自己选择,这里是随机算法
}
}
Predicate 就是一组匹配规则,当请求匹配成功,就执行对应的Route;当匹配失败,放弃处理/转发
例如 只有2024-7-26 11:11:11 之后的请求才进行匹配/转发, 不满足该条件的,不处理
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
routes:
- id: member_route01 #路由的ID
#lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
uri: lb://member-service-provider
predicates: #断言,可以多种形式
- Path=/member/get/**
- After=2024-07-26T11:11:11.000+08:00[Asia/Shanghai] #需要请求满足这个时间之后
例如 只有2024-7-26 11:11:11 之前的请求才进行匹配/转发, 不满足该条件的,不处理
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
routes:
- id: member_route01 #路由的ID
#lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
uri: lb://member-service-provider
predicates: #断言,可以多种形式
- Path=/member/get/**
- Before=2024-07-26T11:11:11.000+08:00[Asia/Shanghai] #需要请求满足这个时间之前
例如 只有2024-7-26 11:11:11 和 2024-7-29 11:11:11 之间的请求才进行匹配/转发, 不满足该条件的,不处理
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
routes:
- id: member_route01 #路由的ID
#lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
uri: lb://member-service-provider
predicates: #断言,可以多种形式
- Path=/member/get/**
- Between=2024-07-26T11:11:11.000+08:00[Asia/Shanghai],2024-07-29T11:11:11.000+08:00[Asia/Shanghai] #需要请求满足这个时间之间
请求带有Cookie,并且键值对有一定要求【值 也可以是一个正则表达式】
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
routes:
- id: member_route01 #路由的ID
#lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
uri: lb://member-service-provider
predicates: #断言,可以多种形式
- Path=/member/get/**
- Cookie=name,zy #键:name 值: zy 【值 也可以是一个正则表达式】
请求头Header 有Authorization, 并且值admin才匹配/断言成功
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
routes:
- id: member_route01 #路由的ID
#lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
uri: lb://member-service-provider
predicates: #断言,可以多种形式
- Path=/member/get/**
- Header=Authorization,admin #Authorization是请求头中的一个属性,【值 也可以是一个正则表达式】
请求Host 满足一定要求 才匹配/断言成功
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
routes:
- id: member_route01 #路由的ID
#lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
uri: lb://member-service-provider
predicates: #断言,可以多种形式
- Path=/member/get/**
- Host=**.zy.**,**.zy88.** #【可以有多个,用逗号间隔】
请求方式满足一定要求【post/get/delete......】 才匹配/断言成功
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
routes:
- id: member_route01 #路由的ID
#lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
uri: lb://member-service-provider
predicates: #断言,可以多种形式
- Path=/member/get/**
- Method=POST,GET #【可以有多个,用逗号间隔】
路径满足一定要求 才匹配/断言成功
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
routes:
- id: member_route01 #路由的ID
#lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
uri: lb://member-service-provider
predicates: #断言,可以多种形式
- Path=/member/get/**,/member/save #【可以有多个路径】
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
routes:
- id: member_route01 #路由的ID
#lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
uri: lb://member-service-provider
predicates: #断言,可以多种形式
- Path=/member/get/** #【可以有多个路径】
- Query=email, [w-]+@([a-zA-Z]+.)+[a-zA-Z]+ #【可以是正则表达式】
调用端远程地址是否满足 来判断
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
routes:
- id: member_route01 #路由的ID
#lb: 是协议名【Load Balance负载均衡的协议名】 member-service-provider :服务名小写
uri: lb://member-service-provider
predicates: #断言,可以多种形式
- Path=/member/get/** #【可以有多个路径】
- RemoteAddr=127.0.0.1 #调用端的远程地址
GatewayFilter是GatewayFilter的工厂类来产生内置Filter,有31种
spring:
application:
name: e-commerce-gateway-20000 #配置应用的名称
cloud:
gateway:
discovery:
locator:
enabled: true #启用 DiscoveryClient 服务发现
routes:
- id: member_route01 #路由的ID
uri: lb://member-service-provider
predicates: #断言,可以多种形式
- Path=/member/get/** #【可以有多个路径】
filters:
- AddRequestParameter=role, admin #过滤器可以有多个
- AddRequestParameter=address, beijing
开发直接使用GatewayFilter 较少,一般使用自定义过滤器
@Component
public class CustomGateWayFilter implements GlobalFilter, Ordered {
//filter 方法写的就是过滤业务
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取对应的参数值
//getFirst 请求的是键username获取到的值的集合的第一个
String username = exchange.getRequest().getQueryParams().getFirst("username");
String pwd = exchange.getRequest().getQueryParams().getFirst("pwd");
if (!("zy".equals(username) && "123456".equals(pwd))){
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);//设置状态码
return exchange.getResponse().setComplete();
}
//放行
return chain.filter(exchange);
}
//order 表示过滤器执行的顺序,数字越小,优先级越高
@Override
public int getOrder() {
return 0; //指定优先级
}
}
登录查看全部
参与评论
手机查看
返回顶部