01详解Gateway服务网关的功能,实现,分类.工作流程
作者:mmseoamin日期:2023-12-14

Gateway服务网关

网关功能

Gateway网关是是所有微服务的统一入口, 网关的核心功能特性主要体现在请求路由,权限控制,限流三部分

  • 路由: 由于网关不能处理业务,所以网关需要根据某种规则(断言)把请求转发给匹配的主机或者接口上,这个转发的过程就叫做路由
  • 负载均衡: 当路由的目标微服务有多个实例时,还需要通过负载均衡规则从多个服务实例中挑选一个
  • 身份认证(鉴权): 网关作为微服务的入口需要校验用户是否有请求资格或是否有权限进行操作,如果没有则拦截
  • 访问控制: 设置黑白名单,比如限制DDOS攻击的IP地址
  • 请求限流: 当请求量过高时,网关会按照微服务能够接受的速度来放行请求,避免服务压力过大
  • 发布控制: 比如上线一个新接口时,先给新接口分配 20%流量,老接口分配80% ,后续再慢慢调整比例
  • [流量染色](https://docs.spring.io/spring-cloud-gateway/docs/current/refer

    ence/html/#the-addrequestheader-gatewayfilter-factory): 区分用户来源,给请求添加一些标识,一般通过添加新的请求头,全局染色

  • 统一处理跨域: 网关统一处理跨域,不用在每个项目单独处理
  • 统一业务处理: 把每个项目中都要做的通用逻辑放到上层网关统一处理
  • 统一文档knife4j: 将下游项目的文档进行聚合在一个页面统一查看建议用
  • 统一日志: 统一的请求,响应信息记录
  • 接口保护: 限制请求,信息脱敏,降级熔断进行兜底,请求限流(令牌桶算法,漏桶算法,RedisLimitHandler),设置超时时间,超时就中断

    网关的分类

    网关的分类及其技术选型

    • 全局网关(接入层网关): 主要实现负载均衡、请求日志等,不和业务逻辑代码绑定

    • 业务网关(微服务网关): 将请求转发到不同的业务/项目/接口/服务,包含一些业务逻辑代码

      在SpringCloud中网关的实现主要包括四种,它旨在为微服务框架提供一种简单有效的统一的API路由管理方式

      • Spring Cloud Gateway: SpringCloud的一个全新项目,基于Spring 5.0和SpringBoot2.0以及ProjectReactor等响应式编程和事件流技术开发的网关
      • Zuul: 基于Servlet属于阻塞式编程实现, SpringCloudGateway则是基于Spring5中提供的WebFlux属于响应式编程实现因此具备更好的性能
      • 其他实现: Nginx(全局网关),Kong(API网关,编程成本相对较高)

        在这里插入图片描述

        网关的实现

        第一步: 新建一个SpringBoot工程如gateway模块, 引入网关依赖和nacos服务发现依赖

        
        
            org.springframework.cloud
            spring-cloud-starter-gateway
        
        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-discovery
        
        

        第二步: 在gateway模块中编写启动类

        @SpringBootApplication
        public class GatewayApplication {
            public static void main(String[] args) {
                SpringApplication.run(GatewayApplication.class,args);
            }
        }
        

        编程式(更灵活): 在项目启动类上添加对应网关代码, 实现https://yupi.icu/yupi到http://yupi.icu/

        @Bean
        public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
            return builder.routes()
                .route("toyupi", r -> r.path("/yupi")
                       .uri("http://yupi.icu/"))
                 .route("路由Id", r -> r.path("路由规则")
                       .uri("路由的目标地址"))
                 .route.......
                .build();
        }
        

        配置式(更直观): 编写基础配置和路由规则

        • 路由名称(id): 路由的唯一表示,用户自定义只需要唯一即可
        • 路由目标地址(uri): 可以路由到某个固定地址,也可以路由到某个服务然后根据负载均衡规则选择一个服务实例
        • 路由断言(predicates): 判断请求是否符合路由规则的条件,符合则转发到路由目的地
        • 路由过滤器(filters): 对请求或响应进行一些处理操作
          # 快捷配置方式
          spring:
            cloud:
              gateway:
                routes:
                - id: after_route
                  uri: https://example.org # 路由到固定地址
                  uri: lb://Nacos中注册的服务名称 # 路由到某个服务
                  predicates: 
                  - Cookie=mycookie,mycookievalue  # cookie里必须有mycookie且值是mycookievalue
          # 完全展开配置方式        
          spring:
            cloud:
              gateway:
                routes:
                - id: after_route
                  uri: https://example.org
                  predicates:
                  - name: Cookie
                    args:
                      name: mycookie
                      regexp: mycookievalue        
          

          网关的工作流程

          第一步: 客户端向网关发起请求,如果请求与Handler Mapping定义的路由匹配则将请求转发给Web Handler

          第二步: 通过定义的过滤器链过滤用户请求,过滤器可以在代理请求之前或者之后执行

          在这里插入图片描述