Spring Cloud Zuul实现IP访问控制
接着上篇文章 https://www.cnblogs.com/mxmbk/p/9569438.html
IP访问限制和黑白名单如何做,需要解决以下几个问题:
1、如何识别正常访问和异常访问?(一段时间同一接口访问次数太多?高峰期和低峰期是否不同?)
2、IP访问异常后拒绝策略是什么?(一段时间访问访问异常接口不能访问?高峰期和低峰期是否不同?)
3、是否不同业务的识别方法和拒绝策略不一样?(有些接口访问频率高,有些访问频率低?)
4、有些业务是否之后IP在白名单中才能访问?(只对第三方提供的接口?)
5、IP访问异常的通知?(请求被识别为异常是否通知到服务维护人员?)
先提出问题,在想解决方案,第一版的简单基于Spring cloud zuul的实现方案如下:
具体实现(基于ZuulFilter的实现):
package com.brightcns.wuxi.citizencard.zuulserver.filter; import com.alibaba.fastjson.JSONObject;
import com.brightcns.wuxi.citizencard.common.feature.exception.SystemException;
import com.brightcns.wuxi.citizencard.common.feature.util.IPUtils;
import com.brightcns.wuxi.citizencard.common.feature.util.MD5Utils;
import com.brightcns.wuxi.citizencard.zuulserver.constants.properties.IPLimitProperty;
import com.brightcns.wuxi.citizencard.zuulserver.limit.AbstractIPLimitStrategy;
import com.brightcns.wuxi.citizencard.zuulserver.limit.IPLimitFactory;
import com.google.common.collect.Lists;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import static com.brightcns.wuxi.citizencard.order.constants.enums.ZuulErrorCode.IP_LIMIT; /**
* @author maxianming
* @date 2018/8/31 10:25
*/
@Slf4j
public class IPLimitFilter extends ZuulFilter {
// 白名单URI
private List<String> excludeUrl = Lists.newArrayList("/health","/info");
// 响应类型
public final String JSON_TYPE = "application/json;charset=UTF-8"; @Override
public String filterType() {
return FilterConstants.PRE_TYPE;
} @Override
public int filterOrder() {
return 0;
} @Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String requestUri = request.getRequestURI();
if (excludeUrl.contains(requestUri)) {
return false;
}
return true;
} @Override
public Object run() {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
String requestIp = IPUtils.getIpAddress(request);
String requestUri = request.getRequestURI();
log.info("网关接受requestIp:[{}], requestUri:[{}]请求", requestIp, requestUri);
try {
AbstractIPLimitStrategy ipLimitStrategy = IPLimitFactory.getIPLimitStragy();
boolean result = ipLimitStrategy.isIPLimit(requestIp, requestUri);
if (result) {
log.info("requestIp:{},requestUri:{}访问限制", requestIp, requestUri);
context.setSendZuulResponse(false);
context.setResponseStatusCode(200);
context.setResponseBody(IP_LIMIT.getCode() + ":" + IP_LIMIT.getMsg());
context.getResponse().setContentType(JSON_TYPE);
}
} catch (Exception e) {
log.error("IP限制异常", e);
}
return null;
} }
1、基于ZuulFilter的简单实现,ZuulFilter的使用可以自行百度,可参考 https://blog.csdn.net/dream_broken/article/details/77197585
2、63-66行代码 主要是Filter不继续执行其他Filter,响应JSON给调用端
3、59行和60行重点主要采用了策略模式(黑天和白天不同策略)涉及敏感信息 只表明思路
具体思路:
- 采用redis incby 和 expire进行访问次数的统计和有效期的设置
- redis key的生成规则: PREFIX:IP:MD5(uri)
- 黑名单暂时配置文件中配置
Spring Cloud Zuul实现IP访问控制的更多相关文章
- Spring Cloud Zuul 限流详解(附源码)(转)
在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选择,只需要编写一个过滤器就可以了,关键在于如何实现限流的算法. ...
- spring cloud: zuul: 微网关-简单使用与路由配置
spring cloud: zuul: 微网关-简单使用与路由配置 首先引入依赖 <dependency> <groupId>org.springframework.cloud ...
- Spring Cloud(十二):Spring Cloud Zuul 限流详解(附源码)(转)
前面已经介绍了很多zuul的功能,本篇继续介绍它的另一大功能.在高并发的应用中,限流往往是一个绕不开的话题.本文详细探讨在Spring Cloud中如何实现限流. 在 Zuul 上实现限流是个不错的选 ...
- Spring Cloud Zuul 概览
什么是API网关 网关这个词其实是一个硬件概念.因为按照定义,网络网关出现在网络的边缘,所以防火墙和代理服务器等相关功能 往往与之集成在一起.在家庭网络 和小型企业中,宽带路由器通常充当网络网关.它将 ...
- Spring Cloud Zuul 添加 ZuulFilter
紧接着上篇随笔Spring Cloud Zuul写,添加过滤器,进行权限验证 1.添加过滤器 package com.dzpykj.filter; import java.io.IOException ...
- Spring Cloud Zuul网关 Filter、熔断、重试、高可用的使用方式。
时间过的很快,写springcloud(十):服务网关zuul初级篇还在半年前,现在已经是2018年了,我们继续探讨Zuul更高级的使用方式. 上篇文章主要介绍了Zuul网关使用模式,以及自动转发机制 ...
- 笔记:Spring Cloud Zuul 快速入门
Spring Cloud Zuul 实现了路由规则与实例的维护问题,通过 Spring Cloud Eureka 进行整合,将自身注册为 Eureka 服务治理下的应用,同时从 Eureka 中获取了 ...
- Spring Cloud Zuul 中文文件上传乱码
原文地址:https://segmentfault.com/a/1190000011650034 1 描述 使用Spring Cloud Zuul进行路由转发时候吗,文件上传会造成中文乱码“?”.1. ...
- spring cloud zuul参数调优
zuul 内置参数 zuul.host.maxTotalConnections 适用于ApacheHttpClient,如果是okhttp无效.每个服务的http客户端连接池最大连接,默认是200. ...
随机推荐
- C# EF更新当前实体报错 ObjectManager无法管理具有相同键值的多个对象
原因: ObjectManager已经在跟踪此对象 更新实体前判断 if (db.Entry<T>(t).State != EntityState.Modified) db.Entry&l ...
- 在Ubuntu下安装mongodb
一. 在Ubuntu下最傻瓜的步骤(以下都在root用户下进行操作): 1.运行"apt-get install mongo" 如果遇到找不到安装包的话运行"apt-ge ...
- Unity3D-rigidBody.velocity
还有半小时就下班了.写一下今天遇到的问题.处理方法以及一些自己的理解.理解的不一定对,还希望大家指正. 今天我做的效果是,hero的移动. 曾经做过用的是transform.Translate(Vec ...
- Laravel 项目开发规范
参考:https://fsdhub.com/books/laravel-specification
- bootstrip可视化布局
http://www.w3cschool.cc/try/bootstrap/layoutit/
- linux学习笔记33--命令netstat和ss
我们以前接触过了vmstat,iostat了,这次是netstat.route,traceroute,ping,netstat这些命令与计算机网络相关性很强,最好是能先了解下TCP/IP协议. net ...
- 跟着百度学PHP[17]-复习PDO的几个关键词
主要就是复习一下几个关键词.发现太久没有写又忘了.惭愧. final self static const
- Unix系统编程(二)open的练习
在上一篇中学习了一下open函数的基本用法,这里就要练习一下.计算机就是要实践嘛. 用open创建一个文件 #include <sys/types.h> #include <sys/ ...
- [Tips]Javascrip计算文件行数
function calcLineCount(filename, callback) { var fs = require('fs'); var fileStream = fs.createReadS ...
- 拉格朗日乘子法(Lagrange multiplier)和KKT条件
拉格朗日乘子法: KKT条件: