package org.jeecg.modules.system.service.impl; import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.base.BaseMap; import org.jeecg.common.constant.CacheConstant; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.constant.GlobalConstants; import org.jeecg.common.util.oConvertUtils; import org.jeecg.modules.system.entity.SysGatewayRoute; import org.jeecg.modules.system.mapper.SysGatewayRouteMapper; import org.jeecg.modules.system.service.ISysGatewayRouteService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @Description: gateway路由管理 * @Author: jeecg-boot * @Date: 2020-05-26 * @Version: V1.0 */ @Service @Slf4j public class SysGatewayRouteServiceImpl extends ServiceImpl implements ISysGatewayRouteService { @Autowired private RedisTemplate redisTemplate; private static final String STRING_STATUS = "status"; @Override public void addRoute2Redis(String key) { List ls = this.list(new LambdaQueryWrapper()); redisTemplate.opsForValue().set(key, JSON.toJSONString(ls)); } @Override public void deleteById(String id) { this.removeById(id); this.resreshRouter(id); } @Override @Transactional(rollbackFor = Exception.class) public void updateAll(JSONObject json) { log.info("--gateway 路由配置修改--"); try { json = json.getJSONObject("router"); String id = json.getString("id"); //update-begin-author:taoyan date:20211025 for: oracle路由网关新增小bug /issues/I4EV2J SysGatewayRoute route; if(oConvertUtils.isEmpty(id)){ route = new SysGatewayRoute(); }else{ route = getById(id); } //update-end-author:taoyan date:20211025 for: oracle路由网关新增小bug /issues/I4EV2J if (ObjectUtil.isEmpty(route)) { route = new SysGatewayRoute(); } route.setRouterId(json.getString("routerId")); route.setName(json.getString("name")); route.setPredicates(json.getString("predicates")); String filters = json.getString("filters"); if (ObjectUtil.isEmpty(filters)) { filters = "[]"; } route.setFilters(filters); route.setUri(json.getString("uri")); if (json.get(STRING_STATUS) == null) { route.setStatus(1); } else { route.setStatus(json.getInteger(STRING_STATUS)); } this.saveOrUpdate(route); resreshRouter(null); } catch (Exception e) { log.error("路由配置解析失败", e); resreshRouter(null); e.printStackTrace(); } } /** * 更新redis路由缓存 */ private void resreshRouter(String delRouterId) { //更新redis路由缓存 addRoute2Redis(CacheConstant.GATEWAY_ROUTES); BaseMap params = new BaseMap(); params.put(GlobalConstants.HANDLER_NAME, GlobalConstants.LODER_ROUDER_HANDLER); params.put("delRouterId", delRouterId); //刷新网关 redisTemplate.convertAndSend(GlobalConstants.REDIS_TOPIC_NAME, params); } @Override public void clearRedis() { redisTemplate.opsForValue().set(CacheConstant.GATEWAY_ROUTES, null); } }