入门分布式服务网关 | SpringCloud Gateway

2,303 阅读2分钟

在正式学习网关之前需要弄清楚几个问题

  • 一、什么是服务网关
  • 二、为什么需要服务网关
  • 三、SpringCloud Gateway

什么是网关?

API网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供一个定制的API。它可能还具有其它职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。

为什么需要服务网关?

服务网关有以下功能:

  • 性能:API高可用,负载均衡,容错机制。
  • 安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
  • 日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
  • 缓存:数据缓存。
  • 监控:记录请求响应数据,api耗时分析,性能监控。
  • 限流:流量控制,错峰流控,可以定义多种限流规则。
  • 灰度:线上灰度部署,可以减小风险。
  • 路由:动态路由规则。

一个简单的微服务架构大致如下图:

image.png

总体流程

  1. 客户端发送请求
  2. nginx负载均衡到api网关
  3. springcloud gateway负载均衡到服务,服务做处理

SpringCloud Gateway

怎样快速了解一个新的知识呢?当然是去官网啦!!官网链接spring-cloud-gateway

路由-Route

一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。

配置文件方式配置

server: 
  port: 8080 
spring: 
  application: 
    name: gateway 
  cloud: 
    gateway: 
      routes: 
        - id: service1 ## id
          uri: lb://service1 ## 目标服务地址 lb:表示负载均衡
          predicates:
            -Path=/service1/api ## 使用GatewayPredicate的实现类PathPredicate
          filter:
            -StripPerfix=1 ## 使用GatewayFilter的实现类StripPerfixGatewayFilterFactory

代码注入

@Bean
public RouteLocator service1Locator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("service1", r -> r.path("/service1/api")
                    .filters(f->f.stripPrefix(1))
                    .uri("lb://service1"))
            .build();
}

image.png

image.png

至于其他的断言或者过滤器这里就不在多写了,可以参考大佬的这篇史上最全springcloud gateway