0
点赞
收藏
分享

微信扫一扫

SpringCloud-Day07-Gateway

源码之路 2022-01-10 阅读 76

Gateway网关

1.API 网关(Gateway)诞生背景

基于客户端(前端)直接调用后端服务,这样会有问题:一增加代码复杂性,二是跨域问题,三是独立认证问题…于是网关gateway应运而生了。微服务架构提供一种简单有效的统一的 API入口,负责服务请求路由、组合及协议转换,并且基于 Filter 链的方式提供了权限认证,监控、限流等功能。

2.市场主流微服务网关

Spring Cloud Gateway,zuul,…

3.API Gateway实现服务的保护和转发(重点)

spring:
	cloud:
		gateway: #网关配置
	      routes: #配置网关路由规则(routes下可以有多个路由.用id做唯一标识,限流使用
	       - id: route01 #路由id,自己指定一个唯一值即可
	         uri: lb://sca-provider #lb表示负载均衡,sca-provider为服务注册中心的一个服务名
	          predicates: #谓词判断逻辑(定义请求转发条件,谓词所有条件都满足才会执行请求转发)
	            - Path=/nacos/provider/echo/** #请求路径定义,此路径对应uri中的资源	    
	          filters: #网关过滤器(局部过滤器),针对当前路由进行设计,用于对谓词中的内容进行判断分析以及处理
	            - StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos

主要指的是我们访问的是localhost://9000/nacos/provider/echo/hello,但是最终访问的却是sca-provider//nacos/provider/echo/hello。我们访问的是路径1,但是实际上访问的是路径2,所以可以看成是服务的保护和转发

4.API Gateway层面的负载均衡实现

lb://sca-provider,底层也是通过Ribbon进行负载均衡。

5.Gateway添加的依赖

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
 </dependency>

注意:此依赖不是spring-boot-starter-web,这个服务器使用的是tomcat,但是gateway里面使用的服务器时Netty,使用Netty的好处:并发性更强。

6.API Gateway请求处理原理分析

在这里插入图片描述
首先通过gateway handlermapping 调用predicatefactory 创建predicate对象,调用里面的test方法进行判断,然后调用gateway web handler对象实现过滤器,首先是全局过滤器,然后是局部过滤器,最后是重定向过滤器。

7.API Gateway中常用谓词(predicate)对象及实践。

在这里插入图片描述
谓词对象一般都实现了RoutePredicateFactory接口,这些谓词工厂用来创建谓词对象,当谓词判断为false时,会出现404异常。
(1)基于时间类的断言工厂
1) AfterRoutePredicateFactory:判断请求日期是否晚于指定日期
2) BeforeRoutePredicateFactory:判断请求日期是否早于指定日期
3) BetweenRoutePredicateFactory:判断请求日期是否在指定时间段内

-After=2020-12-31T23:59:59.789+08:00[Asia/Shanghai]

(2)基于header请求头的断言工厂
HeaderRoutePredicateFactory

-Header=X-Request-Id, \d+

(3)基于Method请求方法的断言工厂
MethodRoutePredicateFactory

-Method=GET

(4)基于Query请求参数的断言工厂
QueryRoutePredicateFactory :
接收两个参数,请求param和正则表达式, 判断请求参数是否具 有给定名称且值与正则表达式匹配。例如:

-Query=pageSize,\d+

(5)我们怎么创建谓词对象?
参照现有的谓词对象,实现RoutePredicateFactory接口

8.API Gateway中过滤器(Filter)的类型及实践。

(1)GlobalFilter:应用到所有的路由上(例如负载均衡过滤器,请求转发过滤器等)。
(2)GatewayFilter:应用到单个路由或者一个分组的路由上。
1)基于AddRequestHeaderGatewayFilterFactory,为原始请求添加Header。
为原始请求添加名为 X-Request-Foo ,值为 Bar 的请求头:

spring:
  cloud:
    gateway:
      routes:
        - id: add_request_header_route
          uri: https://example.org
          filters:
            - AddRequestHeader=X-Request-Foo, Bar

2)基于AddRequestParameterGatewayFilterFactory,为原始请求添加请求参数及值,
例如,为原始请求添加名为foo,值为bar的参数,即:foo=bar。

spring:
  cloud:
    gateway:
      routes:
        - id: add_request_parameter_route
          uri: https://example.org
          filters:
            - AddRequestParameter=foo, bar

3)基于PrefixPathGatewayFilterFactory,为原始的请求路径添加一个前缀路径
例如,该配置使访问${GATEWAY_URL}/hello 会转发到uri/mypath/hello。

spring:
  cloud:
    gateway:
      routes:
        - id: prefixpath_route
          uri: https://example.org
          filters:
            - PrefixPath=/mypath

4)基于RequestSizeGatewayFilterFactory,设置允许接收最大请求包的大小

spring:
  cloud:
    gateway:
      routes:
        - id: request_size_route
      uri: http://localhost:8080/upload
      predicates:
        - Path=/upload
      filters:
        - name: RequestSize
          args:
            # 单位为字节
            maxSize: 5000000

9.全局过滤器的实现:

在这里插入图片描述
模仿loadBalancerClientFilter实现GlobalFilter接口即可。

10.面试问题小结

网关过滤器的作用是什么?(对请求和响应数据做一个预处理)
网关过滤器的类型有哪些?(局部过滤器,全局过滤器)
如何理解局部过滤器?(针对具体链路的应用的过滤器,需要进行配置)
你了解哪些局部过滤器?
如何理解全局过滤器?(作用于所有请求链路)
如何自己定义全局过滤器?(直接或间接实现GlobalFilter接口)
假如现在让你进行平台的网关自研设计,你可以吗?(流程图)

什么是网关?服务访问(流量)的一个入口,类似生活中的“海关“
为什么使用网关?(服务安全,统一服务入口管理,负载均衡,限流,权限验证)
Spring Cloud Gateway 应用的初始构建过程(添加依赖,配置)
Gateway 服务的启动底层是通过谁去实现的?(Netty网络编程框架-ServerSocket)
Gateway 服务做请求转发时一定要在注册中心进行注册吗?(不一定,可以直接通过远端url进行服务访问,只要不写sca-provider即可)

网关层面是如何实现负载均衡的?(通过服务名去查找具体的服务实例)
网关层面是如何通过服务名查找服务实例的?(Ribbon)
你了解Ribbon中的哪些负载均衡算法?(轮询,权重,hash,……可通过IRule接口进行查看分析)
在这里插入图片描述
网关进行请求转发的流程是怎样,有哪些关键对象?(XxxHandlerMapping,Handler,。。。)
网关层面服务的映射方式怎样的?(谓词-path,…,服务名/服务实例)
网关层如何记录服务的映射?(通过map,并要考虑读写锁的应用)

网关(Gateway)诞生的背景?(第一:统一微服务访问的入口,第二:对系统服务进行保护,第三进行统一的认证,授权,限流)
网关的选型?(Netifix Zuul,Spring Cloud Gateway,…)
Spring Cloud Gateway的入门实现(添加依赖,路由配置,启动类)
Spring Cloud Gateway中的负载均衡?(网关服务注册,服务的发现,基于uri:lb://服务id方式访问具体服务实例)
Spring Cloud Gateway中的断言配置?(掌握常用几个就可,用时可以通过搜索引擎去查)
Spring Cloud Gateway中的过滤器配置?(掌握过滤器中的两大类型-局部和全局)
Spring Cloud Gateway中的限流设计?(Sentinel)

11. API Gateway中基于sentinel实现服务限流(API,路由id)

(1)添加sentinel-gateway的依赖
(2)在yml文件中,添加访问sentinel的路径
(3)在启动GatewayApplication的时候添加
在这里插入图片描述
(4)网关限流有两种限流方式:一个是基于链路限流,一个是基于分组限流
在这里插入图片描述
(5)基于限流的各种方式
在这里插入图片描述
Client IP和Remote Host都是根据访问的ip号,进行限流。
Header根据请求头进行限流
URL参数根据访问的URL参数
Cookie不清楚

12.API Gateway中基于自定义限流结果的处理(GatewayCallbackManager)

@Configuration
public class GatewayConfig {
    public GatewayConfig(){
        GatewayCallbackManager.setBlockHandler( new BlockRequestHandler() {
            @Override
            public Mono<ServerResponse> handleRequest(ServerWebExchange serverWebExchange, Throwable throwable) {
                Map<String,Object> map=new HashMap<>();
                map.put("state",429);
                map.put("message","two many request");
                String jsonStr=JSON.toJSONString(map);
                return ServerResponse.ok().body(Mono.just(jsonStr),String.class);
            }
        });
    }
}

13.一些小点

(1)http的响应格式:响应体—>响应头—>空行—>响应行
(2)对于spring.application.name的说明:只有在注册中心和配置中心使用的时候才必须要加
(3)对于如何将普通目录转成资源目录:
如果resources文件夹丢失,如何转成资源文件夹?
右键—>make directory as resources root
(4)503服务异常:
表示服务暂时不可用异常
(5)重定向
网关—>provider的过程其实是一个重定向的过程
在这里插入图片描述
默认是InMemoryUser这个
在这里插入图片描述

举报

相关推荐

0 条评论