SpringCloud GateWay 相关图形,dljd,视,cat

一 业务:微服务

二 想法、需求、问题:统一入口

三 解决方案:

1 集群与架构(11)

  1. 第一排:前端设备:PC端、app、小程序
  2. 第二排:负载均衡软件或硬件,如Nginx
  3. 第三排:网关(可集群),如Gateway
    1. Gateway是各个微服务的全局入口
    2. 每个Gateway都可以跳到任意的微服务
  4. 第四排:多个微服务

2 功能“集”:网关

3 “神”冰箱:spring cloud Gateway

四 “完成”“高效”视频

1 体系组织

  1. spring cloud Gateway 是一个spring cloud下的子项目。

  2. Spring Cloud Gateway 提供了一个用于在Spring MVC之上构建API网关的库。

  3. jdk8以上。

  4. 建立在Spring Framework 5,Project Reactor和Spring Boot 2.0之上。

  5. netty

    1. 注:因此网关项目不能添加springboot-web-starter起步依赖,因为内嵌的tomcat会和netty起冲突

2 思想

        Spring Cloud Gateway旨在提供一种简单而效的方法来将请求路由到任意微服务上。由于它是统一入口,因为在Spring Cloud Gateway上可以为这些微服务提供统一的跨领域的实现,例如:流控、(熔断)降级、权限控制、安全性、监视/度量和弹性等;

        细分功能点:

  1. 能够匹配任何请求属性上的路由;

  2. 谓词和过滤器特定于路由;

  3. Hystrix断路器集成;

  4. Spring Cloud DiscoveryClient的集成;

  5. 易于编写的谓词和过滤器;

  6. 请求速率限制;

  7. 路径改写;

3 流原

(1)对比nginx:

        spring cloud gateway是网关,即微服务的统一入口,相当于nginx的功能(其实nginx也可以做为网关)。因此在使用spring cloud gateway时,我们只需要去配置规则(路由、过滤器)就可以了。

(2)工作流程、原理:

基本概念:

  1. 路由:网关的基本构建组成,它由ID,目标URI,谓词集合和过滤器集合定义,如果集合谓词为true,则匹配路由,否则不匹配;

  2. 谓词:这是Java 8函数谓词,输入类型是Spring Framework ServerWebExchange,可以匹配HTTP请求中的所有内容,例如请求头或参数;

  3. 过滤器:这些是使用特定工厂构造的Spring Framework GatewayFilter实例,可以在发送给下游请求之前或之后修改请求和响应

宏观: 

  1. 第一步:前端,如app、小程序、pc、vue,发送http请求
  2. 第二步:请求来到spring cloud gateway微服务
    1. 第1步:规则匹配,路由、过滤器
      1. 如果规则(路由规则、过滤器)匹配上,就准备路由到微服务上
      2. 如果规则(路由规则、过滤器)匹配不上,就报404错误
  3. 第三步:spring cloud gateway的负载均衡(lb://)到相应的微服务上

微观:

  1. 第一步:Gateway Client,即客户端,如pc、小程序、app
  2. 第二步:可选,负载均衡器,如nginx。转发到网关spring cloud Gateway。
  3. 第三步:网关spring cloud Gateway
    1. 第1步:Gateway Handler Mapping,进行路由的谓词的匹配
      1. 匹配上:Gateway Web Handler
      2. 匹配不上:404
    2. 第2步:Gateway Web Handler
    3. 第3步:多个Filter,对请求过滤
    4. 第4步:Proxied Service。即代理服务。即我们的微服务。
  4. 第四步:响应
    1. 第1步:调用微服务完成
    2. 第2步:多个Filter,对响应过滤
    3. 第3步:Gateway Web Handler
    4. 第4步:Gateway Handler Mapping
    5. 第5步:返回到Gateway Client,即客户端,如pc、小程序、app

 (3)原码分析:遇到异常时,助你快速分析与排查

  1. 第零步:spring cloud gateway项目启动

    1. 根据自动装配spring-cloud-gateway-core.jarspring.factories;

    2. GatewayClassPathWarningAutoConfiguration检查前端控制器;

    3. 网关自动配置GatewayAutoConfiguration

  2. 第一步:前端请求过来

  3. 第二步:进入RoutePredicateHandlerMapping

    1. 第1步:通过词和过滤器判断是否是正确的访问路径

    2. 第2步:获取路由RouteRoutePredicateHandlerMapping.getHandlerInternal(...)

    3. 第3步:url和gatewayFilter进行了绑定

    4. 第4步:将Route放入ServerWebExchange的属性中

  4. 第三步:执行FilteringWebHandler。进行处理。

    1. 第1步:组合全局GlobalFilter和RouteFilter

  5. 第四步:顺序执行其它的Filter

  6. 第五步:输出结果

  7. 第六步:调用微服务......

4 重:网关微服务搭建与测试

  1. 第一步:新项目,spring boot,是微服务,可注册到注册中心,可连接sentinel

  2. 第二步:添加依赖

  3. 第三步:配置文件建。议使用.yml。

    1. 第1步:指定端口

    2. 第2步:指定网关微服务的名称

    3. 第3步:启用discoveryclient网关集成,可以实现服务的发现

    4. 第4步:配置路由规则

      1. id:必须有,唯一即可

      2. uri:你要访问哪个路径,即你要访问哪个服务(注册中心的服务名),案例“lb://服务名”

        1. 前面的"lb://",表示负载均衡

        2. 可以直接写死路径:如http://localhost:8083,又如www.baidu.com

      3. predicates(谓词,即判断,“是不是”/”对不对“/”匹不匹配“):

        1. 可通配符。*号。

      4. 可选:配置过滤器

  4. 第四步:可集群

  5. 第五步:测试

    1. 第1步:启动网关微服务。启动生产者。启动消费者。

    2. 第2步:浏览器地址栏访问网关"ip:port/方法名"。

    3. 第3步:正常路由(转发)到生产者或消费者。

    4. 第4步:生产者和消费者之间又可以相互调用。

5 重:谓词

多个谓词叠加使用

总共有11个路由谓词工厂,不同谓词用于不同的场景下:

  1. The After Route Predicate Factory

    1. after谓词

    2. 匹配时间。时间之后 。格式ZoneDateTime.now()。

    3. 应用场景:到几点才能秒杀

  2. The Before Route Predicate Factory

    1. before谓词

    2. 匹配时间。时间之前。 格式ZoneDateTime.now()。

    3. 应用场景:秒杀结束

  3. The Between Route Predicate Factory

    1. between 谓词

    2. 匹配时间。时间之间。 格式ZoneDateTime.now()。

    3. 应用场景:秒杀时间范围后

  4. The Cookie Route Predicate Factory

    1. cookie 谓词

    2. 基于cookie的路由匹配规则,例如 - Cookie=chocolate,123456

      1. cookie匹配上正常路由

      2. 反之,404

    3. 测试:linux的curl命令可带token,例如:curl http://192.168.0.104/index --cookie token=123456

  5. The Header Route Predicate Factory

    1. header谓词

    2. 匹配header头

    3. 格式:Header=请求头的参数名称,值是正则表达式

    4. 测试:linux的curl命令可发送带请求头的http请求

  6. The Host Route Predicate Factor

    1. host谓词

    2. 匹配域名

  7. The Method Route Predicate Factor

    1. method谓词

    2. 匹配请求方法:GET、POST、PUSH、DELETE

  8. The Path Route Predicate Factory

    1. path谓词

    2. 匹配路径

    3. 可用通配符

    4. 可带参数

  9. The Query Route Predicate Factory

    1. query谓词

    2. 匹配查询参数(名)

  10. The RemoteAddr Route Predicate Factor

    1. remoteAddr谓词

    2. 匹配远程地址ip

  11. The Weight Route Predicate Factory

    1. weight谓词

    2. 匹配权重

6 重:自定义谓词:官方提供的谓词满足不了需求时

  1. 案例1:要求请求必须携带一个token,并且token值等于指定的值,才能访问;

    1. 第一步:首先定义一个配置类,用于承载配置参数
    2. 第二步:定义一个路由谓词工厂;
      1. 第1步:继承抽象类或实现接口
        1. 实现:shortcutFieldOrder()方法,获取匹配的token
          1. 按照顺序获取对应的参数
        2. 实现:apply()方法,谓词主要实现,会返回结果true或false
          1. 判断请求中参数是否满足谓词定义的条件
      2. 注意事项:TokenRoutePredicateFactory类,前面的Token与.yml配置文件里面配置的谓词名字对应,后面的RoutePredicateFactory名字是固定的,不能随便写,这是Spring Cloud Gateway的约定,类名须为“谓词工厂名(比如:Token)” + RoutePredicateFactory
    3. 第三步:在配置文件中启用该路由谓词工厂,即配置一个Token=123456;
  2. 案例2:要求某个服务用户只允许在23:00 - 6:00这个时间段内才可以访问
    1. 第一步:首先定义一个配置类,用于承载配置参数
    2. 第二步:定义一个路由谓词工厂;
      1. 第1步:继承抽象类或实现接口
        1. 实现:shortcutFieldOrder()方法,获取匹配的token
          1. 按照顺序获取对应的参数
        2. 实现:apply()方法,谓词主要实现,会返回结果true或false
          1. 判断请求中参数是否满足谓词定义的条件
    3. 第三步:在配置文件中启用该路由谓词工厂

7 重:谓词不匹配404处理,定义错误页面

处理的顶层接口是WebExceptionHandler

默认实现是DefaultErrorWebExceptionHandler

我们需要覆盖它的默认实现DefaultErrorWebExceptionHandler,覆盖里面几个重要的方法,在方法里面编写我们想要返回的结果,参看我们git代码;

最后,在配置类中把这个类注入容器(@Bean)。

8 重:过滤器

  1. 谓词匹配上以后,请求被路由到过滤器(多个)。
  2. 过滤器可以对请求(数据)和响应(数据)做一些额外的处理。
  3. 总共有31个网关过滤器工厂

1.The AddRequestHeader GatewayFilter Factory

  1. 添加请求头的过滤器:即在请求来到此过滤器时,该过滤器会为请求添加一个请求头参数及其值。
  2. 可以在生产者或消费者中获取该添加的请求头参数。

2.The AddRequestParameter GatewayFilter Factory

  1. 给请求添加请求参数的过滤器        

3. The AddResponseHeader GatewayFilter Factory

  1. 给响应添加响应头的过滤器        

4. The DedupeResponseHeader GatewayFilter Factory

5. The Hystrix GatewayFilter Factory

6. Spring Cloud CircuitBreaker GatewayFilter Factory

7. The FallbackHeaders GatewayFilter Factory

8. The MapRequestHeader GatewayFilter Factory

9. The PrefixPath GatewayFilter Factory

10. The PreserveHostHeader GatewayFilter Factory

11. The RequestRateLimiter GatewayFilter Factory

12. The RedirectTo GatewayFilter Factory

13. The RemoveRequestHeader GatewayFilter Factory

14. RemoveResponseHeader GatewayFilter Factory

15. The RemoveRequestParameter GatewayFilter Factory

16. The RewritePath GatewayFilter Factory

17. RewriteLocationResponseHeader GatewayFilter Factory

18. The RewriteResponseHeader GatewayFilter Factory

19. The SaveSession GatewayFilter Factory

20. The SecureHeaders GatewayFilter Factory

21. The SetPath GatewayFilter Factory

22. The SetRequestHeader GatewayFilter Factory

23. The SetResponseHeader GatewayFilter Factory

24. The SetStatus GatewayFilter Factory

25. The StripPrefix GatewayFilter Factory

26. The Retry GatewayFilter Factory

27. The RequestSize GatewayFilter Factory

28. The SetRequestHost GatewayFilter Factory

29. Modify a Request Body GatewayFilter Factory

30. Modify a Response Body GatewayFilter Factory

31. Default Filters

9 重:自定义过滤器

Spring Cloud Gateway自定义路由过滤器

网关过滤器的顶层接口是GatewayFilterFactory

通常情况下可以继承AbstractGatewayFilterFactory实现自定义网关过滤器;

或者继承AbstractNameValueGatewayFilterFactory,该方式配置方式更简单,然后覆盖里面的一个方法(applay()方法即可),具体参考一下我们的样例代码,实际上理解流程思路即可,真正需要做的时候,查一下就可以;

Spring Cloud Gateway全局过滤器

上面的过滤器工厂是执行在指定路由之上,可以称为路由过滤器(或者局部过滤器),而全局过滤器是作用于所有的路由上,对所有的路由进行过滤;

Spring cloud gateway默认内置了很多全局过滤器。比如:

1. Combined Global Filter and GatewayFilter Ordering

2. Forward Routing Filter

3. The LoadBalancerClient Filter

4. The ReactiveLoadBalancerClientFilter

5. The Netty Routing Filter

6. The Netty Write Response Filter

7. The RouteToRequestUrl Filter

8. The Websocket Routing Filter

9. The Gateway Metrics Filter

10. Marking An Exchange As Routed

springboot自动装配的时候,满足条件(要求)的全局filter不用配置默认是执行的、生效的。

全局过滤器有执行顺序问题,通过getOrder()方法的返回值决定执行顺序,数值越小越靠前执行。

当然我们也可以自定义全局过滤器,具体在我们的代码中有样例实现,可以参考:

  1. 第一步:实现GlobalFilter和Order接口。因为全局过滤器的顶层接口是GlobalFilter ,和GatewayFilter 有一样的接口定义,只不过GlobalFilter 会作用于所有路由;​​​​​​​
    1. ​​​​​​​​​​​​​​Order接口返回数字,确定执行顺序
    2. GlobalFilter返回过滤器处理逻辑
  2. 第二步:实现类注册为spring的bean对象
  3. 第三步:测试
  4. 10 重:Gateway集成ribbon负载均衡

        实现原理是在全局LoadBalancerClientFilter中进行拦截,然后再该过滤器中依赖LoadBalancerClient loadBalancer,而此负载均衡接口的具体实现是RibbonLoadBalancerClient,即spring cloud gateway已经整合好了ribbon,已经可以实现负载均衡,我们不需要做任何工作,网关对后端微服务的转发就已经具有负载均衡功能;​​​​​​​ 

  1. spring cloud Gateway默认已经帮我们实现了负载均衡了,不需要我们做什么工作了
    1. GlobalFilter接口:spring cloud Gateway的全局Filter的接口
    2. LoadBalancerClientFilte实现:全局Filter中的一个实现,对所有请求的URL进行拦截
      1. LoadBalancerClient接口:注入到LoadBalancerClientFilter,帮我们实现负载均衡
      2. RibbonLoadBalanceClient实现:因为spring cloud gateway底层使用ribbon帮我们实现负载均衡

11 重:Gateway集成Sentinel + nacos持久化

业务:访问网关时,要访问微服务出现错误、异常、访问超时、不可访问

需求:限流、降级处理

工具:spring cloud gateway +  sentinel

功能:在网关处做限流降级处理

注意:其实在nginx处也是可以做限流处理

流原:限流

  1. 添加依赖。加版本号。适配器形式。
  2. 配置文件
    1. ​​​​​​​连接到sentineal dashboard管控台。可设置规则。
  3. ​​​​​​​代码
    1. ​​​​​​加入​@Bean sentinelGatewayFilter()这个bean
      1. ​​​​​​​spring cloud gateway是通过Filter的形式和sentinel进入整合的。
  4. 启动网关项目
  5. sentineal dashboard管控台
    1. ​​​​​​​列表视图。多了一个路由ID:route3。
    2. 针对路由ID:route3,进行限流、降级、热点、授权

流原:返回限流自定义的字符串、重定向错误页面

  1. 默认:BlockRequestHandler接口,处理限流、降级后的结果。
    1. ​​​​​​​DefaultBlockRequestHandler默认实现类。
    2. 默认:只在页面中显示Blocked by Sentinel:FlowException。
  2. 自定义1:字符串
    1. 新建Xxx类。
    2. 实现BlockRequestHandler接口。​​​​​​​
    3. 覆盖handleRequest方法
  3. 自定义2:重定向到错误页面
    1. new RedirectBlockRequestHandler()。参数可以是,网站如www.baidu.com,或者是统一的错误页面。

流原:网关集成sentinel限流降级规则持久化

  1. 文件持久化:建议开发、测试时使用
    1. 加依赖
    2. 配置文件不动,没东西
    3. 代码
      1. public class FileDataSourceInit implements InitFunc
        1. 指定文件位置
        2. 读数据源
        3. 取数据源
    4. java的spi机制
      1. MATE-INF.service目录下新建文件
        1. 包名 + 类名
    5. 浏览器访问任意服务
    6. sentinel管控台加规则
    7. 文件有数据
  2. nacos持久化:上线使用
    1. 加依赖
    2. 配置文件
      1. datasource
        1. 键:任意
        2. 值:地址、id、分组、命名空间
    3. 访问naocs管控台
    4. 新加配置:地址、id、分组、命名空间、配置规则,并发布
    5. 重启微服务。微服务可以读取naocs中的规则。
    6. 打开sentinel管控台,查看规则是不是有了。

12 重:Gateway跨域CORS

业务:跨域

需求:浏览器使用ajax发起http请求,实现跨域请求资源或调用接口

工具:Gateway

功能:CORS

流原:

  1. http请求不同域名下的资源或调用接口,都属于跨域请求
    1. 其实浏览器本身是可以发起跨域请求的,比如你可以链接一个另一个域名下的图片或者js或css,比如<img src=http://www.baidu.com/image/logo.png>。
    2. 但是javascript脚本是不能获取这些另一个域名下的资源内容的
      1. 浏览器使用js的ajax发起http请求,只能获取同一域名下的资源,只能调用同一域名下的接口。
  2. CORS
    1. ​​​​​​​HTML5规范中打破了这限制,允许Ajax发起跨域的请求;(只是需要设置一下)。这个规范中,提出了CORS标准。CORS现在HTML5标准的一部分,在大部分现代浏览器中有所支持,可能在某些老版本的浏览器不支持CORS,如果要兼容一些老的浏览器版本,则需要采用JSONP进行跨域请求;
    2. CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing)它允许浏览器向跨域的另一台服务器发出XMLHttpRequest请求,从而克服了AJAX只能访问同域名下的资源的限制
      1. ​​​​​​​​​​​​​​这种CORS使用了一个额外的HTTP响应头来赋予当前user-agent(浏览器)获得跨域资源的权限,这里的跨域也就是Cross-Origin的概念,这里的权限就是访问另一个域名下的资源权限;相当于授权一下。
  3. ​​​​​​​​​​​​​​同源与非同源的定义(跨域和非跨域)
    1. ​​​​​​​如果 访问协议、端口(如果指定了端口的话)、host都相同,则称之为同源(不跨域),否则为非同源(跨域);

spring cloud gateway解决跨域问题:

  1. Spring Cloud Gateway解决跨域问题,只需要配置如下代码(强调只)即可:

    /**
     * 配置网关跨域cors请求支持
     */
    @Configuration
    public class CorsConfig {
        @Bean
        public CorsWebFilter corsFilter() {
            CorsConfiguration config = new CorsConfiguration();
            config.addAllowedMethod("*");//是什么请求方法,比如Get POST DELETE......
            config.addAllowedOrigin("*");  //来自哪个域名的请求,*号表示所有
            config.addAllowedHeader("*");//是什么请求头
            UrlBasedCorsConfigurationSource source = new

    UrlBasedCorsConfigurationSource(new PathPatternParser());
            source.registerCorsConfiguration("/**", config);
            return new CorsWebFilter(source);
        }
    }

  2. 测试一下!

    1. 效果1:直接使用浏览器访问网关,当然,支持跨域,因为浏览器本身就支持跨域。

    2. 效果2:浏览器+js+ajax去访问网关(项目)时,支持跨域。
      浏览器+jsp+js+ajax+http        ->网关                      ->消费者                         ->提供者
      127.0.0.1:8989                       192.168.0.104:80             

      1. 启nacos。清理(删除)目录。查看日志。单机版或集群版。

      2. 启Gate项目。连接nacos注册中心。

      3. 启提供者

      4. 启消费者

      5. 测试程序:springboot + jsp + js + ajax + 浏览器 + http请求 --->访问网关(192.168.0.104:80)

    3. 效果3:注释掉配置,不再支持跨域,状态码是0,提示Error。

  3. springboot也有解决跨域的方法,但与spring cloud gateway不同,注意区分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值