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

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

相关推荐
PXM的算法星球2 天前
spring gateway配合nacos实现负载均衡
spring·gateway·负载均衡
1990_super3 天前
使用ceph-deploy安装和配置RADOS Gateway (RGW)并使用S3访问集群
ceph·gateway
北极糊的狐6 天前
接口返回504 Gateway Time-out 错误,这意味着请求在网关或代理服务器等待上游服务器响应时超时。以下是可能的原因和排查建议:
数据库·gateway
sg_knight7 天前
Spring Cloud Gateway全栈实践:动态路由能力与WebFlux深度整合
java·spring boot·网关·spring·spring cloud·微服务·gateway
放纵日放纵9 天前
微服务—Gateway
微服务·架构·gateway
你我约定有三9 天前
分布式微服务--GateWay(1)
java·开发语言·分布式·微服务·架构·gateway
毛小茛11 天前
Spring Cloud Gateway 实现登录校验:构建统一认证入口
springcloud
William一直在路上13 天前
KONG API Gateway中的核心概念
网络·gateway·kong
●VON14 天前
重生之我在暑假学习微服务第七天《微服务之服务治理篇》
java·学习·微服务·云原生·nacos·架构·springcloud