From fe7b21ba537196ee5a0e9933581ec64d1c89b40e Mon Sep 17 00:00:00 2001 From: clay <20932067@zju.edu.cn> Date: Thu, 17 Nov 2022 12:18:38 +0800 Subject: [PATCH] =?UTF-8?q?clay=20commit=20:=20tree=3Dutil=E4=BD=BF?= =?UTF-8?q?=E7=94=A8,sentinel=20dashboard=E7=AE=80=E4=BB=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.js | 9 +- docs/use/sentinel-dashboard/README.md | 36 ++++++ docs/use/sentinel-dashboard/sentinel.png | Bin 0 -> 68098 bytes docs/util/README.md | 0 docs/util/tree-util/README.md | 148 +++++++++++++++++++++++ 5 files changed, 192 insertions(+), 1 deletion(-) create mode 100644 docs/use/sentinel-dashboard/README.md create mode 100644 docs/use/sentinel-dashboard/sentinel.png create mode 100644 docs/util/README.md create mode 100644 docs/util/tree-util/README.md diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index c2a0c63..248bff5 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -31,7 +31,7 @@ module.exports = { // 设置侧边栏内容 sidebar: [ { - title: '教程', + title: '本文档使用教程', collapsable: false, children: [ '/document/', @@ -59,6 +59,13 @@ module.exports = { '/use/spring-amin/', ] // 根据自己的需求来订,对应自己在docs下的文件夹名,默认首页是README.md }, + { + title: '工具类使用', + collapsable: false, + children: [ + '/util/tree-util/', + ] // 根据自己的需求来订,对应自己在docs下的文件夹名,默认首页是README.md + }, // { // title: '模块介绍', diff --git a/docs/use/sentinel-dashboard/README.md b/docs/use/sentinel-dashboard/README.md new file mode 100644 index 0000000..c48bcd5 --- /dev/null +++ b/docs/use/sentinel-dashboard/README.md @@ -0,0 +1,36 @@ +# sentinel dashboard 限流模块 +> sentinel dashboard可以通过页面图形化的方式监控机器以及服务的运行情况和配置复杂的各种流控、降级等规则,以保证线上服务的稳定运行,本篇文章主要是介绍控制台参数意义和使用规则,达到快速使用的目的 + +## 具体实现 +security cloud 有两个sentinel dashboard模块,一个是官方给的完整版,另外一个为集成了nacos持久化,适合生产环境使用 + +### 官方提供 + +- xml +```xml + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + +``` + +- 添加yaml配置文件到client服务中 + +```yaml +spring: + cloud: + sentinel: + transport: + # sentinel dashboard服务地址 + dashboard: localhost:5000 +``` + +### nacos升级 +- 配置数据持久化到nacos +- client注册到sentinel dashboard时,sentinel dashboard将nacos上对应的配置文件初始化给client +- 支持配置设置针对单一client设置配置文件还是集群内全部服务设置配置 + +> 配置与上方相同,只需要添加nacos的配置中心信息即可 + +![](./sentinel.png) + diff --git a/docs/use/sentinel-dashboard/sentinel.png b/docs/use/sentinel-dashboard/sentinel.png new file mode 100644 index 0000000000000000000000000000000000000000..f8ae443290cec28a3dbbedae4f8098577ecf0a78 GIT binary patch literal 68098 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

<|@`$_K} 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 Q{2UMN8E94BdGhD~0RCT9HUIzs literal 0 HcmV?d00001 diff --git a/docs/util/README.md b/docs/util/README.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/util/tree-util/README.md b/docs/util/tree-util/README.md new file mode 100644 index 0000000..33d6ad2 --- /dev/null +++ b/docs/util/tree-util/README.md @@ -0,0 +1,148 @@ +# 树形结构转换工具类 + +## 功能介绍 +- 将 A类的List数组快速转换为 B类型 List 的树形结构列表 + +## 实现原理 +- 主要使用到Java反射机制,将A类中的字段拷贝到B类中,并且根据A类中id 与 pid之间的关系快速构建树形结构 +- 设置配置类,更方便的实现A类与B类之前转换的需要,配置类包含有id字段与pid字段之间自定义设置,A类中需要转换到B类中的字段,以及是需要Spring 中 BeanUtils直接copy,以及如果使用了BeanUtil后需要排除的字段 + +## 代码展示 +```java +/** + * @author Clay + * @date 2022/11/16 + */ +public class TreeUtil { + + private static TreeConfig config; + + private static Class targetClass; + + /** + * 构建tree结构 + * + * @param list + * @param target + * @param node + * @param + * @return + */ + public static List build(List list, Class target, Node node) { + //初始化config + config = new TreeConfig(); + //将目标class对象设置为全局对象 + TreeUtil.targetClass = target; + //提供给实现类对config进行修改 + node.build(config); + //获取到最小的 + Object min = list.stream().min(Comparator.comparing(object -> getParentId(object).toString())).get(); + //获取到最小的父级id + Object minPid = getParentId(min); + //将数据通过他们的各自的父id进行分组 + Map> listMap = list.stream().collect(Collectors.groupingBy(object -> getParentId(object))); + //最终开始进行tree的构建 + return getChildren(listMap, minPid); + } + + /** + * 获取到子节点 + * + * @param listMap + * @param parentId + * @param + * @return + */ + private static List getChildren(Map> listMap, Object parentId) { + //获取到缓存中的list + List objects = listMap.get(parentId); + if (chickList(objects)) { + return null; + } + listMap.remove(parentId); + //遍历数组,并将对象一一的转换 + List collect = objects.stream().map(object -> + conversion(object, listMap)).collect(Collectors.toList()); + return (List) collect; + } + + /** + * 对象直接的字段进行转换 + * + * @param object + * @param listMap + * @param + * @return + */ + private static T conversion(Object object, Map> listMap) { + try { + Object targetObject = targetClass.newInstance(); + //相同字段名称直接赋值 + if (config.isCopy()){ + BeanUtils.copyProperties(object, targetObject); + } + //不同字段名进行赋值 + for (Map.Entry entry : config.getMapper().entrySet()) { + String targetKey = entry.getKey(); + String sourceKey = entry.getValue(); + Object value = ReflectUtils.invokeGetter(object, sourceKey); + Object[] args = new Object[]{value}; + ReflectUtils.invokeSetter(targetObject, targetKey, args); + } + //设置子节点 + Object id = ReflectUtils.invokeGetter(object, config.getIdField()); + List children = getChildren(listMap, id); + if (!chickList(children)) { + ReflectUtils.invokeSetter(targetObject, config.getChildrenField(), new Object[]{children}); + } + //设置完毕后,将需要排除的字段进行置空 + for (String key : config.getExclude()) { + ReflectUtils.invokeSetNull(targetObject, key); + } + //返回结果 + return (T) targetObject; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * 检查list是否为空 + * + * @param objects + * @return + */ + private static boolean chickList(List objects) { + return null == objects || objects.isEmpty(); + } + + /** + * 获取到父级id + * + * @param object + * @return + */ + private static Object getParentId(Object object) { + try { + return ReflectUtils.invokeGetter(object, config.getParentField()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + +} +``` +## 使用demo +```java +@Override +public List selectDeptTree(String deptName, Integer state) { + List deptList = deptMapper.selectDeptList(deptName, state); + return TreeUtil.build(deptList,DeptVo.class,(config)->{ + config.setIdField("deptId"); + config.setMapper("key","deptId"); + config.setExclude("phone"); + }); +} +``` + +