Sprng Cloud Zuul组件基本使用

服务网关

    稳定性,高可用 安全性 性能、并发性 扩展性

常见的网关方案有以下几种:

    Nginx + Lua Tyk Kong (商业) Spring Cloud Zuul 其中较性能相比,Nginx + Lua比较好,但是配置起来比较麻烦,Spring Cloud提供了服务网关的解决方案Zuul,也是不错的选择

Zuul简介

基本原理图 Zuul四种过滤器API分别是:

    前置(pre) 后置(post) 路由(Route) 错误(Error)

对应的请求生命周期 其中custom filters为自定义 不仅可以在pre阶段自定义 也可在post阶段自定义

基本使用

1、引入依赖,这里引入了Eureka服务注册、、Zuul网关

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>

2、启动配置如下

server:
  port: 9000

spring:
  cloud:
    config:
      discovery:
        enabled: true
        service-id: CONFIG-SERVER
      profile: dev
  application:
    name: api-gateway

3、在启动类添加注解

@EnableZuulProxy
http://localhost:9000/config-server/config-dev.yml

其中config-server是服务名,后面的是访问路径 测试结果没问题,如果访问出现500异常,后台报错访问超时

com.netflix.zuul.exception.ZuulException: Forwarding error

那么修改一下ribbon的超时时间,添加配置文件

ribbon:
  ReadTimeout: 3000
  ConnectTimeout: 3000

当然zuul的功能肯定不止这些,下面介绍自定义配置路由,可以重写规则

高可用

多个Zuul节点注册到Eureka Server,然后Nginx做方向代理和Zuul混搭

自定义路由

zuul:
  routes:
    config:
      path: /config/**
      serviceId: config-server
      # 简洁模式
    config-server: /config/**
    # 排除某些路由
  ignored-patterns:
    - /**/config-dev.yml

此时访问http://localhost:9000/config/config-dev.yml同样可以获取结果 当然也可以查看所有路由

management:
  endpoints:
    web:
      exposure:
        include: routes

访问http://localhost:9000/actuator/routes

动态路由实现

把zuul配置放入git仓库中,进行动态获取,具体配置请参考前面的统一配置中心步骤

过滤

    鉴权 限流 参数校验调整

后置:

    统计 日志

前置自定义过滤器:

后置自定义过滤器:

其中type、order设置值在常量filterConstants.java文件中

限流

令牌获取: 这里使用的是Google开源的Guava工具里面的令牌算法,使用起来比较简单: 有个问题,zuul生产下一般都是2个或以上保证高可用,这里限流可以使用Redis来实现,分别存储两个key,一个用于计时,一个用于计数。请求每调用一次,计数器增加1,若在计时器时间内计数器未超过阈值,则可以处理任务,如发送短信api的qps为400

权限校验

这里主要是不同角色所对应的操作权限不同,根据请求的URL进行权限判断,类似于上面的过滤器,同时为了后期更好的维护,最好是根据角色的不同,分为不同的filter,需要注意的是如果需要设置cookie或者其他消息头,zuul要开放敏感头

zuul跨域

经验分享 程序员 微信小程序 职场和发展