package com.tievd.cube.modules.system.service.impl; import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.fasterxml.jackson.databind.JsonNode; import com.tievd.cube.modules.system.mapper.SysGatewayRouteMapper; import com.tievd.cube.modules.system.service.ISysGatewayRouteService; import lombok.extern.slf4j.Slf4j; import com.tievd.cube.commons.base.BaseMap; import com.tievd.cube.commons.constant.CacheConst; import com.tievd.cube.modules.system.entity.SysGatewayRoute; 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.List; @Slf4j @Service @Transactional public class SysGatewayRouteServiceImpl extends ServiceImpl implements ISysGatewayRouteService { @Autowired private RedisTemplate redisTemplate; @Override public void addRoute2Redis(String key) { List ls = this.list(new LambdaQueryWrapper().eq(SysGatewayRoute::getStatus, 1)); redisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(ls)); } @Override public void deleteById(String id) { this.removeById(id); this.refreshRouter(); } @Override @Transactional(rollbackFor = Exception.class) public void updateAll(JsonNode json) { try { json = json.get("router"); String id = json.get("id").asText(); SysGatewayRoute route = getById(id); if (ObjectUtil.isEmpty(route)) { route = new SysGatewayRoute(); } route.setRouterId(json.get("routerId").asText()); route.setName(json.get("name").asText()); route.setPredicates(json.get("predicates").asText()); String filters = json.get("filters").asText(); if (ObjectUtil.isEmpty(filters)) { filters = "[]"; } route.setFilters(filters); route.setUri(json.get("uri").asText()); if (json.get("status") == null) { route.setStatus(1); } else { route.setStatus(json.get("status").asInt()); } this.saveOrUpdate(route); } catch (Exception e) { log.error("路由配置解析失败!", e); } finally { refreshRouter(); } } /** * 更新redis路由缓存 */ private void refreshRouter() { // 更新redis路由缓存 addRoute2Redis(CacheConst.GATEWAY_ROUTES); BaseMap params = new BaseMap(); params.put("handlerName", "refreshRouterListener"); // 通过redis消息通知网关刷新路由 redisTemplate.convertAndSend("cube_redis_topic", params); } @Override public void clearRedis() { redisTemplate.opsForValue().set(CacheConst.GATEWAY_ROUTES, ""); } }