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要开放敏感头