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

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

相关推荐
小李同学_LHY3 天前
三.微服务架构中的精妙设计:服务注册/服务发现-Eureka
java·spring boot·spring·springcloud
shangxianjiao6 天前
Javaweb后端 AOP进阶 通知类型 切入点表达式 连接点
java·springboot·springcloud·aop
A叶子叶6 天前
Kong网关部署研究
python·spring cloud·微服务·gateway·kong
小李同学_LHY6 天前
微服务架构中的精妙设计:环境和工程搭建
java·spring·微服务·springcloud
甜可儿7 天前
Gateway实战入门(四)、断言-请求头以及请求权重分流等
java·spring cloud·gateway
INFINI Labs7 天前
实现极限网关(INFINI Gateway)配置动态加载
gateway
shangxianjiao8 天前
Javaweb后端登录认证 登录校验 过滤器 filter令牌校验,执行流程,拦截路径
java·springboot·springcloud·过滤器
power-辰南10 天前
亿级分布式系统架构演进实战(九)- 垂直拆分(服务间通信设计)
微服务·架构·springcloud·分布式架构
brhhh_sehe12 天前
【Java面试系列】初识GateWay网关
java·面试·gateway
程序媛学姐13 天前
SpringCloud网关:Gateway路由配置与过滤器链
java·spring cloud·gateway