01详解Gateway服务网关的功能,实现,分类.工作流程

Gateway服务网关

网关功能

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

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

  • 统一业务处理: 把每个项目中都要做的通用逻辑放到上层网关统一处理
  • 统一文档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服务发现依赖

xml 复制代码
<!--网关依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

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

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

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

java 复制代码
@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): 对请求或响应进行一些处理操作
yml 复制代码
# 快捷配置方式
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

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

相关推荐
研究司马懿5 小时前
【云原生】Gateway API高级功能
云原生·go·gateway·k8s·gateway api
Java后端的Ai之路1 天前
【Spring全家桶】-一文弄懂Spring Cloud Gateway
java·后端·spring cloud·gateway
CodeCaptain2 天前
nacos-2.3.2-OEM与nacos3.1.x的差异分析
java·经验分享·nacos·springcloud
Dragon Wu2 天前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
七夜zippoe4 天前
分布式配置中心终极对决 Spring Cloud Config与Apollo架构深度解析
分布式·架构·springcloud·apollo·配置中心
研究司马懿5 天前
【云原生】Gateway API介绍
云原生·gateway
研究司马懿5 天前
【云原生】Gateway API路由、重定向、修饰符等关键操作
云原生·gateway
研究司马懿5 天前
【云原生】初识Gateway API
云原生·gateway
没有bug.的程序员6 天前
Spring Cloud Alibaba:Nacos 配置中心与服务发现的工业级深度实战
java·spring boot·nacos·服务发现·springcloud·配置中心·alibaba
七夜zippoe6 天前
API网关设计模式实战 Spring Cloud Gateway路由过滤限流深度解析
java·设计模式·gateway·路由·api网关