Gateway网关简介及使用
- 什么是 API 网关(API Gateway)
分布式服务架构、微服务架构与 API 网关
在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。
网关的功能:
统一访问路径;
统一鉴权;
流量控制;
熔断;
日志监控。
一. Gateway怎么用
说白了 Predicate 就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理,接下来我们接下 Spring Cloud GateWay 内置几种 Predicate 的使用。
1.搭建网关工程Spring boot 项目
添加网关服务,和注册发现让其在nocas中注册
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
以此工程下建立admin网关,并且在父
聚合
<modules>
<module>leadnews-gateway-admin</module>
</modules>
创建启动类
2.完成配置类
server:
port: 6001
spring:
application:
name: leadnews-admin-gateway
cloud:
nacos:
server-addr: 172.16.147.129:8848
gateway:
globalcors:
cors-configurations:
'[/**]': # 匹配所有请求
allowedOrigins: "*" #跨域处理 允许所有的域
allowedHeaders: "*"
allowedMethods: # 支持的方法
- GET
- POST
- PUT
- DELETE
routes:
# 后台管理
- id: admin
#被断言到的路由到此服务上进行处理
uri: lb://leadnews-admin
#断言,就是进行匹配,我断言你活不过今天,就是这个意思
predicates:
- Path=/admin/**
filters:
# 去掉请求路径中的一个前缀 从左到右开始 /xxx
# /admin/channel/list => StripPrefix= 1 => /channel/list
- StripPrefix= 1
# 用户微服
- id: user
uri: lb://leadnews-user
predicates:
- Path=/user/api/v1/**
filters:
- StripPrefix=3
【重点解释】
- Path=/admin/** 表示以/admin开头的路径全部路由到admin微服务中
例如:http://localhost:6001/admin/xxx/yyy --->路由到http://9001/xxx/yyy
3.重点–全局过滤器登入校验,身份认证
/**
* @version 1.0
* @description 网关统一鉴权
* @package com.pojke.gatewayadmin.filters
*/
@Component
@Slf4j
public class AuthorizeFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//1. 获取请求与响应对象
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//2. 获取请求路径
String path = request.getURI().getPath();
log.info("请求了路径: {}", path);
//3. 判断是否为登录请求. /admin/login/in /admin/login/out
if(path.startsWith("/admin/login")){
//3.1 如果是登录请求则放行
return chain.filter(exchange);
}
//4. 获取请求头中的token
String token = request.getHeaders().getFirst("token");
//5. 对token有效性校验
if(!StringUtils.isEmpty(token)) {
//5.1 有效则放行
if (SystemConstants.JWT_OK == AppJwtUtil.verifyToken(token)) {
return chain.filter(exchange);
}
}
//6. 无效则拦截,返回401 HttpStatus
response.setStatusCode(HttpStatus.UNAUTHORIZED);
return response.setComplete();// 到此为止
}
@Override
public int getOrder() {
return 0;
}
}