Gateway网关源码解析

 更新时间:2022年07月29日 10:16:12   作者:kaico2018  
这篇文章主要介绍了Gateway微服务网关,负载均衡,熔断和限流,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

工作原理

客户端向 Spring Cloud Gateway 发出请求。 如果网关处理程序映射确定请求与路由匹配,则将其发送到网关 Web 处理程序。 此处理程序通过特定于请求的过滤器链运行请求。 过滤器用虚线划分的原因是过滤器可以在发送代理请求之前和之后运行逻辑。 执行所有“预”过滤器逻辑。 然后发出代理请求。 发出代理请求后,将运行“发布”过滤器逻辑。

配置类分析

jar包中加载的配置类,会注入到IOC容器中。

1、GatewayClassPathWarningAutoConfiguration 检查是否有正确的配置webflux

检查是否有 org.springframework.web.servlet.DispatcherServlet类,也就是是否引入了springweb的依赖。

2、GatewayAutoConfiguration 核心配置类

配置了很多bean,加载了gateway 需要注入的类。

配置了很多谓词想的的bean

3、GatewayLoadBalancerClientAutoConfiguration 网关需要使用的负载均衡

该过滤器实现了负载均衡的功能,通过责任链的设计模式。

4、GatewayRedisAutoConfiguration 网关整合Redis整合Lua实现限流

5、GatewayDiscoveryClientAutoConfiguration 把网关服务注册到注册中心中去,服务注册与发现功能

路由模式源码分析

网关的请求入口在 DispatcherHandler类里面的 handler 方法。

查找handler方法中,子类会查找路由策略,循环查找路由策略,第一个匹配的策略会返回了。

执行的handler

webHandler去执行

执行的是 filter 的 handler,gateway 默认有7个filter,分别实现了不同的功能:负载均衡、请求转发等功能。各个filter通过责任链模式循环执行。

解决前后端的跨域问题

微服务中跨域的问题,不属于前端解决 jsonp ,只能支持get请求。

核心点就是在我们后端。

解决跨域的问题

  1. HttpClient转发
  2. 使用过滤器允许接口可以跨域 响应头设置
  3. Jsonp 不支持我们的post 属于前端解决
  4. Nginx解决跨域的问题保持我们域名和端口一致性
  5. Nginx也是通过配置文件解决跨域的问题
  6. 基于微服务网关解决跨域问题,需要保持域名和端口一致性
  7. 使用网关代码允许所有的服务可以跨域的问题
  8. 使用SpringBoot注解形式@CrossOrigin

gateway解决跨域问题:增加过滤器,给请求头增加参数。

@Component
public class CrossOriginFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        HttpHeaders headers = response.getHeaders();
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "*");
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS, "POST, GET, PUT, OPTIONS, DELETE, PATCH");
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS, "true");
        headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS, "*");
        headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "*");
        return chain.filter(exchange);
    }
}

以上就是Gateway网关源码解析的详细内容,更多关于Gateway网关的资料请关注脚本之家其它相关文章!

相关文章

  • 教你轻松制作java视频播放器

    教你轻松制作java视频播放器

    这篇文章主要为大家详细介绍了如何编写属于自己的java视频播放器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • SpringBoot逻辑异常统一处理方法

    SpringBoot逻辑异常统一处理方法

    这篇文章主要介绍了SpringBoot逻辑异常统一处理方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 使用Java制作一个简单的记事本

    使用Java制作一个简单的记事本

    本文给大家带来的是使用Java制作一个简单的记事本的代码,有相同需要的朋友可以参考下
    2015-02-02
  • Java如何通过属性名获取Object对象属性值

    Java如何通过属性名获取Object对象属性值

    这篇文章主要介绍了Java如何通过属性名获取Object对象属性值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • JavaWeb中Servlet的深入理解

    JavaWeb中Servlet的深入理解

    Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层
    2021-10-10
  • 基于Java代码配置MyBatis Generator

    基于Java代码配置MyBatis Generator

    这篇文章主要介绍了基于Java代码配置MyBatis Generator,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java时间处理第三方包Joda Time使用详解

    Java时间处理第三方包Joda Time使用详解

    这篇文章主要为大家介绍了Java时间处理第三方包Joda Time使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Kotlin教程之函数和包的定义和流程控制

    Kotlin教程之函数和包的定义和流程控制

    这篇文章主要介绍了Kotlin教程之函数和包的定义和流程控制的相关资料,需要的朋友可以参考下
    2017-05-05
  • SpringBoot集成MyBatis的分页插件PageHelper实例代码

    SpringBoot集成MyBatis的分页插件PageHelper实例代码

    这篇文章主要介绍了SpringBoot集成MyBatis的分页插件PageHelper的相关操作,需要的朋友可以参考下
    2017-08-08
  • 浅谈多线程_让程序更高效的运行

    浅谈多线程_让程序更高效的运行

    下面小编就为大家带来一篇浅谈多线程_让程序更高效的运行。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10

最新评论