网关是一个服务,是访问内部系统的唯一入口,提供内部服务的路由中转,额外还可以在此基础上提供身份认证、监控、负载均衡,限流、降级与应用检测等功能
Spring Cloud Gateway 底层使用了高性能的通信框架Netty
nginx+lua 高性能反向代理服务器,通常做为负载均衡入口后端
Zuul是第一代网关,spring浏览器
cloud是第二代网关,基于NettyReactorWebFLux构建缓存
缺点
ZUUL1.x是基于同步IO
Zuul2.x 基于异步IO
参考的是java8的java.util.function.predicate 开发人员可以匹配http请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
path断言
predicates:
- path=/mg/**
Query断言
参数值可以写正则,也可以只写参数名
predicates:
- query=foo,ba.
Method断言
predicates:
- Method=get
Host断言
predicates:
- Host=wzx.cool
Cookie断言
predicates:
- cookie=name.wuzhixuan
构建网关的基本模块,它由id,目标uri,一系列的断言和过滤器组成,如果断言为true则匹配该路由
指的是spring框架中gatewayfilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
默认情况下gateway会根据注册中心注册的服务列表以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能
server:
port: 80
spring:
application:
name: wuzx-gateway
profiles:
active: sit
cloud:
nacos:
discovery:
server-addr: wuzx.cool:30000
config:
server-addr: wuzx.cool:30000
file-extension: yaml
gateway:
discovery:
locator:
enabled: true # 开启从注册中心动态创建路由的功能,利用微服务名进行路由
loadbalancer:
retry:
enabled: true
routes:
- id: payment_routh #路由的id,没有固定规则但要求唯一,建议配合服务名
# uri: http://localhost:8001 #匹配后提供服务的路由地址
uri: lb://cloud-payment-service
predicates:
- path=/payment/get/** #断言,路径相匹配的进行路由
- id: payment_routh2
#uri: http://localhost:8001
uri: lb://cloud-payment-service
predicates:
- path=/payment/lb/** #断言,路径相匹配的进行路由
两个接口介绍:globalfilter,ordered
功能:
/**
* 鉴权认证
*
* @author 吴志旋
* 自定义filter 需要实现Ordered 和GlobalFilter
* Ordered 优先级 越小优先级越大
*/
@Slf4j
@Component
@AllArgsConstructor
public class AuthFilter implements GlobalFilter, Ordered {
private final AuthProperties authProperties;
private final ObjectMapper objectMapper;
private final AntPathMatcher antPathMatcher = new AntPathMatcher();
@Override
public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String path = exchange.getRequest().getURI().getPath();
if (isSkip(path)) {
return chain.filter(exchange);
}
ServerHttpResponse resp = exchange.getResponse();
String headerToken = "";
String paramToken ="";
if (StringUtils.isAllBlank(headerToken, paramToken)) {
return unAuth(resp, "缺失令牌,鉴权失败");
}
String auth = StringUtils.isBlank(headerToken) ? paramToken : headerToken;
String token = JwtUtil.getToken(auth);
Claims claims = JwtUtil.parseJWT(token);
if (claims == null) {
return unAuth(resp, "请求未授权");
}
return chain.filter(exchange);
}
private boolean isSkip(String path) {
}
@Override
public int getOrder() {
return -100;
}
}
页面更新:2024-04-29
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号