限流改造

This commit is contained in:
tanghc
2019-05-20 18:14:01 +08:00
parent c39a087e35
commit 8ebc0925cb
32 changed files with 1537 additions and 75 deletions

View File

@@ -0,0 +1,67 @@
package com.gitee.sop.gateway.entity;
import lombok.Data;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
* 表名config_limit
* 备注:限流配置
*
* @author tanghc
*/
@Table(name = "config_limit")
@Data
public class ConfigLimit {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
/** 数据库字段id */
private Long id;
/** 路由id, 数据库字段route_id */
private String routeId;
/** 数据库字段app_key */
private String appKey;
/** 限流ip多个用英文逗号隔开, 数据库字段limit_ip */
private String limitIp;
/** 服务id, 数据库字段service_id */
private String serviceId;
/** 限流策略1漏桶策略2令牌桶策略, 数据库字段limit_type */
private Byte limitType;
/** 每秒可处理请求数, 数据库字段exec_count_per_second */
private Integer execCountPerSecond;
/** 返回的错误码, 数据库字段limit_code */
private String limitCode;
/** 返回的错误信息, 数据库字段limit_msg */
private String limitMsg;
/** 令牌桶容量, 数据库字段token_bucket_count */
private Integer tokenBucketCount;
/** 限流开启状态1:开启0关闭, 数据库字段limit_status */
private Byte limitStatus;
/** 顺序,值小的优先执行, 数据库字段order_index */
private Integer orderIndex;
/** 数据库字段gmt_create */
private Date gmtCreate;
/** 数据库字段gmt_modified */
private Date gmtModified;
}

View File

@@ -0,0 +1,67 @@
package com.gitee.sop.gateway.manager;
import com.alibaba.fastjson.JSON;
import com.gitee.fastmybatis.core.query.Query;
import com.gitee.sop.gateway.mapper.ConfigLimitMapper;
import com.gitee.sop.gatewaycommon.bean.ChannelMsg;
import com.gitee.sop.gatewaycommon.bean.ConfigLimitDto;
import com.gitee.sop.gatewaycommon.manager.DefaultLimitConfigManager;
import com.gitee.sop.gatewaycommon.manager.ZookeeperContext;
import com.gitee.sop.gatewaycommon.util.MyBeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import javax.annotation.PostConstruct;
/**
* 限流配置管理
* @author tanghc
*/
@Slf4j
public class DbLimitConfigManager extends DefaultLimitConfigManager {
@Autowired
ConfigLimitMapper configLimitMapper;
@Autowired
Environment environment;
@Override
public void load() {
Query query = new Query();
configLimitMapper.list(query)
.stream()
.forEach(configLimit -> putVal(configLimit));
}
protected void putVal(Object object) {
ConfigLimitDto configLimitDto = new ConfigLimitDto();
MyBeanUtil.copyPropertiesIgnoreNull(object, configLimitDto);
this.update(configLimitDto);
}
@PostConstruct
protected void after() throws Exception {
ZookeeperContext.setEnvironment(environment);
String path = ZookeeperContext.getLimitConfigChannelPath();
ZookeeperContext.listenPath(path, nodeCache -> {
String nodeData = new String(nodeCache.getCurrentData().getData());
ChannelMsg channelMsg = JSON.parseObject(nodeData, ChannelMsg.class);
final ConfigLimitDto configLimitDto = JSON.parseObject(channelMsg.getData(), ConfigLimitDto.class);
switch (channelMsg.getOperation()) {
case "reload":
log.info("重新加载限流配置信息configLimitDto:{}", configLimitDto);
load();
break;
case "update":
log.info("更新限流配置信息configLimitDto:{}", configLimitDto);
update(configLimitDto);
break;
}
});
}
}

View File

@@ -12,5 +12,6 @@ public class ManagerInitializer {
apiConfig.setIsvManager(new DbIsvManager());
apiConfig.setIsvRoutePermissionManager(new DbIsvRoutePermissionManager());
apiConfig.setRouteConfigManager(new DbRouteConfigManager());
apiConfig.setLimitConfigManager(new DbLimitConfigManager());
}
}

View File

@@ -0,0 +1,11 @@
package com.gitee.sop.gateway.mapper;
import com.gitee.fastmybatis.core.mapper.CrudMapper;
import com.gitee.sop.gateway.entity.ConfigLimit;
/**
* @author tanghc
*/
public interface ConfigLimitMapper extends CrudMapper<ConfigLimit, Long> {
}