gateway网关技术(一):快速入门
目录
是什么、为什么出现:
单体架构的时候,不管是增加逻辑,还是修改逻辑,我们只需要对一个项目进行修改即可。现在多了两三个项目,比如我们想在两三个项目上都要增加一个访问鉴权,那么我们就得该两三个项目,比较麻烦。
为了解决上面的问题,微服务引入了 网关 的概念。网关作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑。
他还可以实现:路由:中转;统一鉴权、 统一处理跨域、 统一业务处理(缓存)、统一日志; 访问控制:不同时间,进行不同的访问; 发布控制;流量染色 统一接口保护 :限制请求、信息脱敏、降级(熔断)、限流 ; 统一文档等等
举个例子,可以理解成火车站的检票口,统一的去检票,统一的去处理的一个入口。
原理图
快速入门使用
接下来,我们就搭建一个快速入门的项目,让大家更加深入了解到网关,是如何进行使用的
- 根据官方提示,首先引入依赖项
搭建一个springboot项目,然后引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
- 比如我们现在有一个A项目,用户会访问里面的接口,现在,我希望在访问接口的时候,先通过网关,进行一些逻辑处理,满足条件,网关自动转发到A项目访问这个接口。好的,接下来我们进行实现。
A项目的域名,假设为:http://localhost:8080/
网关的域名,假设为:http://localhost:8090/
在网关项目的配置文件中进行配置,如果路径有/api/**,则跳转到A项目
server:
port: 8090
#设置日志
logging:
level:
org:
springframework:
cloud:
gateway: trace
spring:
cloud:
gateway:
routes:
- id: after_routeE
uri: http://localhost:8080/
predicates: # http://localhost:8090/api/name/getname能直接匹配。
- Path=/api/**
ok,用户访问网关,就能中转到我们的项目A
如果你还有项目B,可以配置多个路由,多个路径,如下
spring:
cloud:
gateway:
routes:
- id: after_routeE
uri: http://localhost:8080/
predicates: # http://localhost:8090/api/name/getname能直接匹配。
- Path=/api/**
- id: after_routeB
uri: http://localhost:8070/
predicates: # http://localhost:8090/api/name/getname能直接匹配。
- Path=/api1/**
- 在网关进行统一的业务逻辑处理。
可以对所有的路由进行统一处理。只需要implements GlobalFilter, Ordered
@Component
@Slf4j
public class CustomGlobalFilter implements GlobalFilter, Ordered {
//1. 用户发送请求到API网关
/**
* @param exchange 用户的请求信息都在里面
* @param chain 用于跳转,停止等。
* @return
*/
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//对请求进行拦截,比如
HttpHeaders headers = request.getHeaders();
String accessKey = headers.getFirst("accessKey");
if (!"123456".equals(accessKey)) {
throw new RuntimeException("没有权限");
}
Mono<Void> filter = chain.filter(exchange);
return filter;
}
/**
* 可以设置过滤器的执行顺序
* @return
*/
@Override
public int getOrder() {
return -1;
}
}
好了,快速入门就到这里,后续还有更加精彩的内容,大家多多关注。谢谢~