# 什么是微服务网关?

微服务网关是微服务架构系统的唯一入口,能把系统的能力统一经过它对客户端进行开放,类似于面向对象的封装,提供统一的入口,具体里面的业务方法是怎样实现并不公开,只不过网关封装了系统内部架构,为每个客户端提供一个定制的 API。

基于他是所有 API 的入口这个特性, 所以它可以方便的全局实现如身份验证 (黑白名单)、监控、负载均衡、缓存、协议转换、限流熔断、灰度发布等功能。

微服务网关作为连接服务的消费方和服务提供方的中间件系统,将各自的业务系统的演进和发展做了天然的隔离,使业务系统更加专注于业务服务本身,同时微服务网关还可以为服务提供和沉淀更多附加功能

它的主要作用:

  • 请求接入

    管理所有接入请求,作为所有 API 请求的入口

  • 业务聚合

    所有微服务后端可以注册在 API 网关,通过 API 网关统一暴露服务

  • 拦截策略

    可以提供统一增加安全、路由、流控、负载均衡等公共服务组件

  • 统一管理

    提供统一监控管理工具,配置管理工具,Swagger 工具等设施

# 1. 过滤器与网关的区别

  • 过滤器只适合当个服务的过滤请求
  • 网关能拦截整个微服务,实现过滤请求,能够解决整个微服务中的冗余代码
  • 过滤器是局部拦截,网关是全局拦截

# 2. Zuul 与 Gateway 有哪些区别

项目ZuulGateWay
基本说明Zuul 是属于 netflix 公司的开源产品属于第一代网关Gateway 属于 SpringCloud 自研发的网关框架,属于第二代微服务网关
底层实现Zuul 网关底层基于 Servlet 实现的,处理 http 请求,阻塞式的 Api基于 netty 环境依赖 SpringBoot-WebFux,非阻塞式 API
长连接支持不支持支持
负载均衡支持如果需要负载均衡,需要额外集成其他负载均衡框架,可以扩展至其他微服务框架中提供了抽象负载均衡,提供了抽象流控,并默认实现了 RedisRateLimiter,仅适合于 Spring Cloud 套件

总体来说,由于 Spring gateway 使用了支持 NIO 处理的 Netty 容器,能够非阻塞的处理客户端请求,消耗硬件资源会比 Zuul 更少,效率相对较高,同时本身支持对请求的负载均衡和限流,所以他是在 Spring Cloud 项目中的不二选择

# 如何使用 Spring Gateway

# 1. 添加依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
        <version>2.0.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
</dependencies>

# 2. 添加配置文件 application.yml

server:
  port: 6001
spring:
  application:
    name: bo-spring-gateway
  cloud:
    config:
      override-system-properties: false
      override-none: true
    gateway:
      discovery:
        locator:
          enabled: true
      routes:
        - id: api-web-management
          uri: lb://api-web-management
          predicates:
            - Path=/api-web-management/**
        - id: center-integrated-auth
          uri: lb://center-integrated-auth
          predicates:
            - Path=/center-integrated-auth/**
        - id: center-system-base
          uri: lb://center-system-base
          predicates:
            - Path=/center-system-base/**

# 3. 编写启动类

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

由于gateway不依赖于serverlet,注意项目启动之前检查是否去除对serverlet的依赖

# 4. 常用的断言和过滤器

# 断言 Predicates

规则实例说明
Path- Path=/gate/,/rule/## 当请求的路径为 gate、rule 开头的时,转发到 http://localhost:9023 服务器上
Before- Before=2017-01-20T17:42:47.789-07:00[America/Denver]在某个时间之前的请求才会被转发到 http://localhost:9023 服务器上
After- After=2017-01-20T17:42:47.789-07:00[America/Denver]在某个时间之后的请求才会被转发
Between- Between=2017-01-20T17:42:47.789-07:00[America/Denver],2017-01-21T17:42:47.789-07:00[America/Denver]在某个时间段之间的才会被转发
Cookie- Cookie=chocolate, ch.p名为 chocolate 的表单或者满足正则 ch.p 的表单才会被匹配到进行请求转发
Header- Header=X-Request-Id, \d+携带参数 X-Request-Id 或者满足 \d + 的请求头才会匹配
Host- Host=www.hd123.com当主机名为 www.hd123.com 的时候直接转发到 http://localhost:9023 服务器上
Method- Method=GET只有 GET 方法才会匹配转发请求,还可以限定 POST、PUT 等请求方式

使用示例

server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: https://example.org
        predicates:
            - Method=GET

# 过滤器 Filter

过滤规则实例说明
PrefixPath- PrefixPath=/app在请求路径前加上 app
RewritePath- RewritePath=/test, /app/test访问 localhost:9022/test, 请求会转发到 localhost:8001/app/test
SetPathSetPath=/app/通过模板设置路径,转发的规则时会在路径前增加 app,{path} 表示原请求路径
RedirectTo重定向
RemoveRequestHeader去掉某个请求头信息

过滤器常用的是请求地址的重写

spring:
  cloud:
    gateway:
      routes:
      - id: rewrite_filter
        uri: http://localhost:8081
        predicates:
        - Path=/test/**
        filters:
        - RewritePath=/where(?<segment>/?.*), /test(?<segment>/?.*)
更新于 阅读次数