Gateway
Gateway网关是我们服务的守门神,所有微服务的统一入口。
网关的核心功能特性:
请求路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截。
限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。
简单使用(网关本身也是一种服务,需要注册到注册中心,才能从注册中心发现其他在注册中心的服务)
- 引依赖 spring-cloud-starter-gateway spring-cloud-starter-alibaba-nacos-discovery
- 启动类
- 配置文件:
点击查看代码
spring:
cloud:
gateway:
routes: #路由
- id: #路由id,自定义,唯一即可。 这里的 "-" ,代表的数组或者集合(反正就是多个的意思),因为路由规则可以有多个
uri: lb://user-server # "lb",负载均衡,后面跟服务名称
predicates: #路由断言,按照以下路径匹配,只要符合要求就路由到 uri
- Path=/user/** # "-" 代表有多个该属性(这里是 Path), - Path=/user/**。 **注意大小写, Path** 。断言规则只是字符串,符合yaml的写法
全局过滤器:
gateway包括 route 和 filter。用户要访问服务,发请求到网关,然后根据路由断言匹配到设置的服务,但在这之前必须要经过 过滤器的过滤处理。
网关提供了31种过滤器,但每一种过滤器的作用都是固定的。如果我们希望拦截请求,做自己的业务逻辑则没办法实现。
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。
自定义全局过滤器的方式是 实现 GlobalFilter接口,然后在实现方法 Mono
Mono
处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
@param exchange 请求上下文,里面可以获取Request、Response等信息
@param chain 用来把请求委托给下一个过滤器
@return {@code Mono
**请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter,一般优先规则是 默认>路由>全局。
每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由我们自己指定
路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递增。
当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的顺序执行。
**
关于跨域问题, 解决方案推荐 CORS 即可
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通