From a226c8b936f7044abdeb4eddf157f1c5b4b3ecb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= Date: Tue, 6 Nov 2018 22:44:19 +0800 Subject: [PATCH] =?UTF-8?q?:recycle:=20=E9=87=8D=E6=9E=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E3=80=82=20=E5=8A=A8=E6=80=81=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E5=8A=A0=E8=BD=BDDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DynamicRouteAutoConfiguration.java | 16 +++- .../support/RedisRouteDefinitionWriter.java | 7 ++ .../resources/config/pigx-gateway-dev.yml | 49 +---------- .../pigx/admin/api/entity/SysRouteConf.java | 83 +++++++++++++++++++ pigx-upms/pigx-upms-biz/pom.xml | 6 ++ .../admin/config}/DynamicRouteInitRunner.java | 29 +++++-- .../admin/config/MybatisPlusConfigurer.java | 2 +- .../controller/SysRouteConfController.java | 40 ++++----- .../pigx/admin/mapper/SysRouteConfMapper.java | 33 ++++++++ .../admin/service/SysRouteConfService.java | 53 ++++++++++++ .../service/impl/SysRouteConfServiceImpl.java | 81 +++++++++--------- .../src/main/resources/bootstrap.yml | 2 + .../resources/mapper/SysRouteConfMapper.xml | 36 ++++++++ .../main/resources/template/Entity.java.vm | 2 +- .../manager/PigxTxManagerApplication.java | 6 +- 15 files changed, 317 insertions(+), 128 deletions(-) create mode 100755 pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRouteConf.java rename {pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support => pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config}/DynamicRouteInitRunner.java (73%) rename pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteEndpoint.java => pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRouteConfController.java (60%) mode change 100644 => 100755 create mode 100755 pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRouteConfMapper.java create mode 100755 pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRouteConfService.java rename pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteHandler.java => pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRouteConfServiceImpl.java (64%) mode change 100644 => 100755 create mode 100755 pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysRouteConfMapper.xml diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java index 9fe552456..ee192e5ad 100644 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/configuration/DynamicRouteAutoConfiguration.java @@ -17,6 +17,9 @@ package com.pig4cloud.pigx.common.gateway.configuration; +import org.springframework.cloud.gateway.config.GatewayProperties; +import org.springframework.cloud.gateway.config.PropertiesRouteDefinitionLocator; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @@ -27,7 +30,16 @@ import org.springframework.context.annotation.Configuration; * 动态路由配置类 */ @Configuration -@ComponentScan("com.pig4cloud.pigx.common.gateway.support") +@ComponentScan("com.pig4cloud.pigx.common.gateway") public class DynamicRouteAutoConfiguration { - + /** + * 配置文件设置为空 + * redis 加载为准 + * + * @return + */ + @Bean + public PropertiesRouteDefinitionLocator propertiesRouteDefinitionLocator() { + return new PropertiesRouteDefinitionLocator(new GatewayProperties()); + } } diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RedisRouteDefinitionWriter.java b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RedisRouteDefinitionWriter.java index ccd3291e5..61002d0a2 100644 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RedisRouteDefinitionWriter.java +++ b/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/RedisRouteDefinitionWriter.java @@ -25,6 +25,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.cloud.gateway.route.RouteDefinition; import org.springframework.cloud.gateway.route.RouteDefinitionRepository; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.stereotype.Component; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -65,8 +66,14 @@ public class RedisRouteDefinitionWriter implements RouteDefinitionRepository { } + /** + * 动态路由入口 + * + * @return + */ @Override public Flux getRouteDefinitions() { + redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class)); List values = redisTemplate.opsForHash().values(CommonConstant.ROUTE_KEY); List definitionList = new ArrayList<>(); values.forEach(vo -> { diff --git a/pigx-config/src/main/resources/config/pigx-gateway-dev.yml b/pigx-config/src/main/resources/config/pigx-gateway-dev.yml index 47de657b8..e6d1b3528 100644 --- a/pigx-config/src/main/resources/config/pigx-gateway-dev.yml +++ b/pigx-config/src/main/resources/config/pigx-gateway-dev.yml @@ -3,54 +3,7 @@ spring: gateway: locator: enabled: true - routes: - # 认证中心 - - id: pigx-auth - uri: lb://pigx-auth - predicates: - - Path=/auth/** - filters: - # 验证码处理 - - ValidateCodeGatewayFilter - # 前端密码解密 - - PasswordDecoderFilter - #UPMS 模块 - - id: pigx-upms - uri: lb://pigx-upms - predicates: - - Path=/admin/** - filters: - # 限流配置 - - name: RequestRateLimiter - args: - key-resolver: '#{@remoteAddrKeyResolver}' - redis-rate-limiter.replenishRate: 10 - redis-rate-limiter.burstCapacity: 20 - # 降级配置 - - name: Hystrix - args: - name: default - fallbackUri: 'forward:/fallback' - # 代码生成模块 - - id: pigx-codegen - uri: lb://pigx-codegen - predicates: - - Path=/gen/** - # 定时任务模块 - - id: pigx-daemon - uri: lb://pigx-daemon - predicates: - - Path=/daemon/** - # 分布式事务管理模块 - - id: pigx-tx-manager - uri: lb://pigx-tx-manager - predicates: - - Path=/tx/** - # 工作流管理模块 - - id: pigx-activiti - uri: lb://pigx-activiti - predicates: - - Path=/act/** + security: encode: # 前端密码密钥,必须16位 diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRouteConf.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRouteConf.java new file mode 100755 index 000000000..94d85a390 --- /dev/null +++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRouteConf.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.api.entity; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * 路由 + * + * @author lengleng + * @date 2018-11-06 10:17:18 + */ +@Data +@TableName("sys_route_conf") +@EqualsAndHashCode(callSuper = true) +public class SysRouteConf extends Model { + private static final long serialVersionUID = 1L; + + /** + * 路由ID + */ + @TableId(type = IdType.INPUT) + private String routeId; + /** + * 断言 + */ + private String predicates; + /** + * 过滤器 + */ + private String filters; + /** + * + */ + private String uri; + /** + * 排序 + */ + private Integer order; + /** + * 创建时间 + */ + private LocalDateTime createTime; + /** + * 修改时间 + */ + private LocalDateTime updateTime; + /** + * 删除标记 + */ + private String delFlag; + + /** + * 主键值 + */ + @Override + protected Serializable pkVal() { + return this.routeId; + } +} diff --git a/pigx-upms/pigx-upms-biz/pom.xml b/pigx-upms/pigx-upms-biz/pom.xml index 1a3a87bb2..2b858f04a 100644 --- a/pigx-upms/pigx-upms-biz/pom.xml +++ b/pigx-upms/pigx-upms-biz/pom.xml @@ -72,6 +72,12 @@ org.springframework.cloud spring-cloud-starter-security + + + com.pig4cloud + pigx-common-gateway + ${pigx.version} + com.baomidou diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteInitRunner.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java similarity index 73% rename from pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteInitRunner.java rename to pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java index dff5a6c3c..d4c1afa78 100644 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteInitRunner.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java @@ -15,16 +15,21 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.gateway.support; +package com.pig4cloud.pigx.admin.config; +import cn.hutool.json.JSONArray; +import cn.hutool.json.JSONUtil; +import com.pig4cloud.pigx.admin.service.SysRouteConfService; import com.pig4cloud.pigx.common.core.constant.CommonConstant; +import com.pig4cloud.pigx.common.gateway.support.DynamicRouteInitEvent; import com.pig4cloud.pigx.common.gateway.vo.RouteDefinitionVo; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.BeanUtils; import org.springframework.boot.web.context.WebServerInitializedEvent; import org.springframework.cloud.gateway.config.GatewayProperties; import org.springframework.cloud.gateway.config.PropertiesRouteDefinitionLocator; +import org.springframework.cloud.gateway.filter.FilterDefinition; +import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.event.EventListener; @@ -33,6 +38,8 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.scheduling.annotation.Async; +import java.net.URI; + /** * @author lengleng * @date 2018/10/31 @@ -44,7 +51,7 @@ import org.springframework.scheduling.annotation.Async; @AllArgsConstructor public class DynamicRouteInitRunner { private final RedisTemplate redisTemplate; - private final GatewayProperties gatewayProperties; + private final SysRouteConfService routeConfService; @Async @Order @@ -53,12 +60,20 @@ public class DynamicRouteInitRunner { Boolean result = redisTemplate.delete(CommonConstant.ROUTE_KEY); log.info("初始化网关路由 {} ", result); - gatewayProperties.getRoutes().forEach(route -> { + routeConfService.routes().forEach(route -> { RouteDefinitionVo vo = new RouteDefinitionVo(); - BeanUtils.copyProperties(route, vo); - log.info("加载路由ID:{},{}", route.getId(), vo); + vo.setId(route.getRouteId()); + vo.setUri(URI.create(route.getUri())); + vo.setOrder(route.getOrder()); + + JSONArray filterObj = JSONUtil.parseArray(route.getFilters()); + vo.setFilters(filterObj.toList(FilterDefinition.class)); + JSONArray predicateObj = JSONUtil.parseArray(route.getPredicates()); + vo.setPredicates(predicateObj.toList(PredicateDefinition.class)); + + log.info("加载路由ID:{},{}", route.getRouteId(), vo); redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class)); - redisTemplate.opsForHash().put(CommonConstant.ROUTE_KEY, route.getId(), vo); + redisTemplate.opsForHash().put(CommonConstant.ROUTE_KEY, route.getRouteId(), vo); }); log.debug("初始化网关路由结束 "); } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/MybatisPlusConfigurer.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/MybatisPlusConfigurer.java index 44e1aa622..22ee4b4bf 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/MybatisPlusConfigurer.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/MybatisPlusConfigurer.java @@ -44,7 +44,7 @@ import java.util.List; @Configuration @MapperScan("com.pig4cloud.pigx.admin.mapper") public class MybatisPlusConfigurer { - private static final String[] IGNORETABLES = new String[]{"sys_dept_relation", "sys_role_dept", "sys_role_menu", "sys_user_role"}; + private static final String[] IGNORETABLES = new String[]{"sys_dept_relation", "sys_role_dept", "sys_role_menu", "sys_user_role", "sys_route_conf"}; /** * 分页插件 diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteEndpoint.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRouteConfController.java old mode 100644 new mode 100755 similarity index 60% rename from pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteEndpoint.java rename to pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRouteConfController.java index 039ad3d79..b36468e86 --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteEndpoint.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysRouteConfController.java @@ -15,39 +15,36 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.gateway.support; +package com.pig4cloud.pigx.admin.controller; -import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONArray; +import com.pig4cloud.pigx.admin.service.SysRouteConfService; import com.pig4cloud.pigx.common.core.util.R; import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.cloud.gateway.route.RouteDefinition; import org.springframework.web.bind.annotation.*; -import reactor.core.publisher.Mono; -import java.util.Map; /** + * 路由 + * * @author lengleng - * @date 2018/10/31 - *

- * 动态路由业务端点 + * @date 2018-11-06 10:17:18 */ -@Slf4j @RestController @AllArgsConstructor @RequestMapping("/route") -public class DynamicRouteEndpoint { - private final DynamicRouteHandler dynamicRouteHandler; +public class SysRouteConfController { + private final SysRouteConfService sysRouteConfService; + /** * 获取当前定义的路由信息 * - * @return {"id":"RouteDefinition"} + * @return */ @GetMapping - public Mono> routes() { - return dynamicRouteHandler.routes(); + public R routes() { + return new R<>(sysRouteConfService.routes()); } /** @@ -57,17 +54,8 @@ public class DynamicRouteEndpoint { * @return */ @PutMapping - public R edit(@RequestBody JSONObject routes) { - return new R(dynamicRouteHandler.editRoutes(routes)); + public R edit(@RequestBody JSONArray routes) { + return new R(sysRouteConfService.editRoutes(routes)); } - /** - * 回滚初始化配置 - * - * @return - */ - @GetMapping("/fallback") - public Mono fallback() { - return Mono.just(new R(dynamicRouteHandler.fallback())); - } } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRouteConfMapper.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRouteConfMapper.java new file mode 100755 index 000000000..4369897de --- /dev/null +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/mapper/SysRouteConfMapper.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.mapper; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.pig4cloud.pigx.admin.api.entity.SysRouteConf; +import org.apache.ibatis.annotations.Mapper; + +/** + * 路由 + * + * @author lengleng + * @date 2018-11-06 10:17:18 + */ +@Mapper +public interface SysRouteConfMapper extends BaseMapper { + +} diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRouteConfService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRouteConfService.java new file mode 100755 index 000000000..362a871f8 --- /dev/null +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysRouteConfService.java @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.admin.service; + +import cn.hutool.json.JSONArray; +import com.baomidou.mybatisplus.service.IService; +import com.pig4cloud.pigx.admin.api.entity.SysRouteConf; +import reactor.core.publisher.Mono; + +import java.util.List; + +/** + * 路由 + * + * @author lengleng + * @date 2018-11-06 10:17:18 + */ +public interface SysRouteConfService extends IService { + + /** + * 获取全部路由 + *

+ * RedisRouteDefinitionWriter.java + * PropertiesRouteDefinitionLocator.java + * + * @return + */ + List routes(); + + /** + * 更新路由信息 + * + * @param routes 路由信息 + * @return + */ + Mono editRoutes(JSONArray routes); +} + diff --git a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteHandler.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRouteConfServiceImpl.java old mode 100644 new mode 100755 similarity index 64% rename from pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteHandler.java rename to pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRouteConfServiceImpl.java index d2eb30544..eaab935ef --- a/pigx-common/pigx-common-gateway/src/main/java/com/pig4cloud/pigx/common/gateway/support/DynamicRouteHandler.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysRouteConfServiceImpl.java @@ -15,48 +15,46 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.gateway.support; +package com.pig4cloud.pigx.admin.service.impl; import cn.hutool.json.JSONArray; -import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.mapper.EntityWrapper; +import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.pig4cloud.pigx.admin.api.entity.SysRouteConf; +import com.pig4cloud.pigx.admin.mapper.SysRouteConfMapper; +import com.pig4cloud.pigx.admin.service.SysRouteConfService; import com.pig4cloud.pigx.common.core.constant.CommonConstant; import com.pig4cloud.pigx.common.gateway.vo.RouteDefinitionVo; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.event.RefreshRoutesEvent; import org.springframework.cloud.gateway.filter.FilterDefinition; import org.springframework.cloud.gateway.handler.predicate.PredicateDefinition; -import org.springframework.cloud.gateway.route.RouteDefinition; -import org.springframework.cloud.gateway.route.RouteDefinitionLocator; import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.ApplicationEventPublisherAware; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.stereotype.Service; import reactor.core.publisher.Mono; import java.net.URI; +import java.util.ArrayList; import java.util.List; import java.util.Map; /** * @author lengleng - * @date 2018/10/31 + * @date 2018年11月06日10:27:55 *

- * 动态路由操作类 - * see GatewayControllerEndpoint.java + * 动态路由处理类 */ @Slf4j -@Service -public class DynamicRouteHandler implements ApplicationEventPublisherAware { - private final RouteDefinitionLocator routeDefinitionLocator; +@AllArgsConstructor +@Service("sysRouteConfService") +public class SysRouteConfServiceImpl extends ServiceImpl implements SysRouteConfService { private final RedisTemplate redisTemplate; - private ApplicationEventPublisher applicationEventPublisher; + private final ApplicationEventPublisher applicationEventPublisher; - public DynamicRouteHandler(RedisTemplate redisTemplate - , RouteDefinitionLocator routeDefinitionLocator) { - this.redisTemplate = redisTemplate; - this.routeDefinitionLocator = routeDefinitionLocator; - } /** * 获取全部路由 @@ -66,9 +64,11 @@ public class DynamicRouteHandler implements ApplicationEventPublisherAware { * * @return */ - public Mono> routes() { - return routeDefinitionLocator.getRouteDefinitions() - .collectMap(RouteDefinition::getId); + @Override + public List routes() { + SysRouteConf condition = new SysRouteConf(); + condition.setDelFlag(CommonConstant.STATUS_NORMAL); + return baseMapper.selectList(new EntityWrapper<>(condition)); } /** @@ -77,16 +77,20 @@ public class DynamicRouteHandler implements ApplicationEventPublisherAware { * @param routes 路由信息 * @return */ - public Mono editRoutes(JSONObject routes) { + @Override + public Mono editRoutes(JSONArray routes) { + // 清空Redis 缓存 Boolean result = redisTemplate.delete(CommonConstant.ROUTE_KEY); log.info("清空网关路由 {} ", result); - routes.forEach((key, value) -> { - log.info("更新路由 -> {} ->{}", key, value); + // 遍历修改的routes,保存到Redis + List routeDefinitionVoList = new ArrayList<>(); + routes.forEach(value -> { + log.info("更新路由 ->{}", value); RouteDefinitionVo vo = new RouteDefinitionVo(); Map map = (Map) value; - Object id = map.get("id"); + Object id = map.get("routeId"); if (id != null) { vo.setId(String.valueOf(id)); } @@ -118,25 +122,24 @@ public class DynamicRouteHandler implements ApplicationEventPublisherAware { } redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class)); - redisTemplate.opsForHash().put(CommonConstant.ROUTE_KEY, key, vo); + redisTemplate.opsForHash().put(CommonConstant.ROUTE_KEY, vo.getId(), vo); + routeDefinitionVoList.add(vo); + }); + + // 更新或保存routes,保存到DB + routeDefinitionVoList.forEach(vo -> { + SysRouteConf routeConf = new SysRouteConf(); + routeConf.setRouteId(vo.getId()); + routeConf.setFilters(JSONUtil.toJsonStr(vo.getFilters())); + routeConf.setPredicates(JSONUtil.toJsonStr(vo.getPredicates())); + routeConf.setOrder(vo.getOrder()); + routeConf.setUri(vo.getUri().toString()); + this.insertOrUpdate(routeConf); }); log.debug("更新网关路由结束 "); + this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this)); return Mono.empty(); } - /** - * 回滚路由 - * - * @return - */ - public Mono fallback() { - this.applicationEventPublisher.publishEvent(new DynamicRouteInitEvent(this)); - return Mono.empty(); - } - - @Override - public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { - this.applicationEventPublisher = applicationEventPublisher; - } } diff --git a/pigx-upms/pigx-upms-biz/src/main/resources/bootstrap.yml b/pigx-upms/pigx-upms-biz/src/main/resources/bootstrap.yml index ba90e1d06..1d1ccfd2d 100644 --- a/pigx-upms/pigx-upms-biz/src/main/resources/bootstrap.yml +++ b/pigx-upms/pigx-upms-biz/src/main/resources/bootstrap.yml @@ -16,6 +16,8 @@ spring: discovery: enabled: true service-id: pigx-config + autoconfigure: + exclude: org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration # 注册中心配置 eureka: diff --git a/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysRouteConfMapper.xml b/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysRouteConfMapper.xml new file mode 100755 index 000000000..75af495eb --- /dev/null +++ b/pigx-upms/pigx-upms-biz/src/main/resources/mapper/SysRouteConfMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/pigx-visual/pigx-codegen/src/main/resources/template/Entity.java.vm b/pigx-visual/pigx-codegen/src/main/resources/template/Entity.java.vm index 80370faee..bd7327c1d 100755 --- a/pigx-visual/pigx-codegen/src/main/resources/template/Entity.java.vm +++ b/pigx-visual/pigx-codegen/src/main/resources/template/Entity.java.vm @@ -19,8 +19,8 @@ import java.time.LocalDateTime; * @date ${datetime} */ @Data -@EqualsAndHashCode(callSuper = true) @TableName("${tableName}") +@EqualsAndHashCode(callSuper = true) public class ${className} extends Model<${className}> { private static final long serialVersionUID = 1L; diff --git a/pigx-visual/pigx-tx-manager/src/main/java/com/pig4cloud/pigx/manager/PigxTxManagerApplication.java b/pigx-visual/pigx-tx-manager/src/main/java/com/pig4cloud/pigx/manager/PigxTxManagerApplication.java index 3734806b9..21d07c7fc 100644 --- a/pigx-visual/pigx-tx-manager/src/main/java/com/pig4cloud/pigx/manager/PigxTxManagerApplication.java +++ b/pigx-visual/pigx-tx-manager/src/main/java/com/pig4cloud/pigx/manager/PigxTxManagerApplication.java @@ -18,16 +18,14 @@ package com.pig4cloud.pigx.manager; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.cloud.client.SpringCloudApplication; /** * @author LCN * @author lengleng * tx-manager ,进行了代码逻辑和代码规范重构 */ -@SpringBootApplication -@EnableDiscoveryClient +@SpringCloudApplication public class PigxTxManagerApplication {