Gateway网关简介及使用

什么是 API 网关(API Gateway) 分布式服务架构、微服务架构与 API 网关 在微服务架构里,服务的粒度被进一步细分,各个业务服务可以被独立的设计、开发、测试、部署和管理。这时,各个独立部署单元可以用不同的开发测试团队维护,可以使用不同的编程语言和技术平台进行设计,这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。

网关的功能:

统一访问路径;

统一鉴权;

流量控制;

熔断;

日志监控。

一. Gateway怎么用

说白了 Predicate 就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理,接下来我们接下 Spring Cloud GateWay 内置几种 Predicate 的使用。

1.搭建网关工程Spring boot 项目

添加网关服务,和注册发现让其在nocas中注册

org.springframework.cloud

spring-cloud-starter-gateway

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

以此工程下建立admin网关,并且在父 聚合

leadnews-gateway-admin

创建启动类

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 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;

}

}

相关文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。