Просмотр исходного кода

springCloud-sentinel模块整合

lengfaqiang 2 лет назад
Родитель
Сommit
f0431ceba8

+ 43 - 43
README.md

@@ -17,49 +17,49 @@
 
 ## 技术栈
 
-| 功能          | 本框架                                                                                                     |
-|-------------|---------------------------------------------------------------------------------------------------------|
-| 前端项目        | 基于vue3 + Element UI                                                                                     
-| 后端项目结构      | 采用插件化 + 扩展包形式 结构解耦 易于扩展                                                                                 |
-| *后端代码风格     | 严格遵守Alibaba规范与项目统一配置的代码格式化                                                                              |
-| *分布式注册/配置中心 | 采用 Alibaba Nacos 源码集成便于调试扩展与二次开发 框架还为其增加了各种监控                                                           |
-| *服务网关       | 采用 SpringCloud Gateway 框架扩展了多种功能例如:内网鉴权、请求体缓存、跨域配置、请求响应日志等                                              |
-| *负载均衡       | 采用 SpringCloud Loadbalancer 扩展支持了开发团队路由 便于多团队开发调试                                                       |
-| *RPC远程调用    | 采用 全新 Apache Dubbo 3.X + OpenFeign                                                                      |
-| 分布式限流熔断     | 采用 Alibaba Sentinel 源码集成便于调试扩展与二次开发 框架还为其增加了各种监控                                                        |
-| 分布式事务       | 采用 Alibaba Seata 源码集成对接了Nacos与各种监控 简化了搭建部署流程                                                            |                                                                        |
-| 权限认证        | 采用 Sa-Token、Jwt 静态使用功能齐全 低耦合 高扩展                                                                        |
-| 权限注解        | 采用 Sa-Token 支持注解 登录校验、角色校验、权限校验、二级认证校验、HttpBasic校验、忽略校验角色与权限校验支持多种条件 如 `AND` `OR` 或 `权限 OR 角色` 等复杂表达式   |
-| *关系数据库      | 使用 MySQL                                                                                                |                                    
-| *缓存数据库      | 支持 Redis 5-7 支持大部分新功能特性 如 分布式限流、分布式队列                                                                   |                                      
+| 功能          | 本框架                                                                                                    |
+|-------------|--------------------------------------------------------------------------------------------------------|
+| 前端项目        | 基于vue3 + Element UI                                                                                    
+| 后端项目结构      | 采用插件化 + 扩展包形式 结构解耦 易于扩展                                                                                |
+| *后端代码风格     | 严格遵守Alibaba规范与项目统一配置的代码格式化                                                                             |
+| *分布式注册/配置中心 | 采用 Alibaba Nacos 源码集成便于调试扩展与二次开发 框架还为其增加了各种监控                                                          |
+| *服务网关       | 采用 SpringCloud Gateway 框架扩展了多种功能例如:内网鉴权、请求体缓存、跨域配置、请求响应日志等                                             |
+| *负载均衡       | 采用 SpringCloud Loadbalancer 扩展支持了开发团队路由 便于多团队开发调试                                                      |
+| *RPC远程调用    | 采用 全新 Apache Dubbo 3.X + OpenFeign                                                                     |
+| 分布式限流熔断     | 采用 Alibaba Sentinel 源码集成便于调试扩展与二次开发 框架还为其增加了各种监控                                                       |
+| 分布式事务       | 采用 Alibaba Seata 源码集成对接了Nacos与各种监控 简化了搭建部署流程                                                           |                                                                        |
+| 权限认证        | 采用 Sa-Token、Jwt 静态使用功能齐全 低耦合 高扩展                                                                       |
+| 权限注解        | 采用 Sa-Token 支持注解 登录校验、角色校验、权限校验、二级认证校验、HttpBasic校验、忽略校验角色与权限校验支持多种条件 如 `AND` `OR` 或 `权限 OR 角色` 等复杂表达式  |
+| *关系数据库      | 使用 MySQL                                                                                               |                                    
+| *缓存数据库      | 支持 Redis 5-7 支持大部分新功能特性 如 分布式限流、分布式队列                                                                  |                                      
 | *Redis客户端   | 采用 Redisson Redis官方推荐 基于Netty的客户端工具支持Redis 90%以上的命令 底层优化规避很多不正确的用法 例如: keys被转换为scan支持单机、哨兵、单主集群、多主集群等模式 |                       |
-| *ORM框架      | 采用 Mybatis-Plus 基于对象几乎不用写SQL全java操作 功能强大插件众多例如多租户插件 分页插件 乐观锁插件等等                                        |
-| *数据分页       | 采用 Mybatis-Plus 分页插件框架对其进行了扩展 对象化分页对象 支持多种方式传参 支持前端多排序 复杂排序                                             |
-| 数据权限        | 采用 Mybatis-Plus 插件 自行分析拼接SQL 无感式过滤只需为Mapper设置好注解条件 支持多种自定义 不限于部门角色                                      |
-| *数据脱敏       | 采用 注解 + jackson 序列化期间脱敏 支持不同模块不同的脱敏条件支持多种策略 如身份证、手机号、地址、邮箱、银行卡等 可自行扩展                                   |
-| 数据加解密       | 采用 注解 + mybatis 拦截器 对存取数据期间自动加解密支持多种策略 如BASE64、AES、RSA、SM2、SM4等                                         |         |
-| *多数据源框架     | 采用 dynamic-datasource 支持世面大部分数据库通过yml配置即可动态管理异构不同种类的数据库 也可通过前端页面添加数据源支持spel表达式从请求头参数等条件切换数据源            |
-| *多数据源事务     | 采用 dynamic-datasource 支持多数据源不同种类的数据库事务回滚                                                                |
-| 数据库连接池      | 采用 HikariCP Spring官方内置连接池 配置简单 以性能与稳定性闻名天下/Druid                                                        |
-| *数据库主键      | 采用 雪花ID 基于时间戳的 有序增长 唯一ID 再也不用为分库分表 数据合并主键冲突重复而发愁                                                        |
-| 服务端与前端消息通信  | 援用现有mqtt                                                                                                |
-| *序列化         | 采用 Jackson Spring官方内置序列化 靠谱!!!                                                                          |
-| 分布式任务调度     | 采用 Xxl-Job 天生支持分布式 统一的管理中心                                                                              |
-| 分布式日志中心     | 采用 ELK 业界成熟解决方案 实时收集所有服务的运行日志 快速发现定位问题                                                                  |
-| 分布式搜索引擎     | 采用 ElasticSearch以 Mybatis-Plus 方式操作 ElasticSearch                                                       |
-| *分布式消息队列    | 采用 SpringCloud-Stream + RabbitMQ                                                                        |
-| *文件存储       | 采用 Minio 分布式文件存储 天生支持多机、多硬盘、多分片、多副本存储支持权限管理 安全可靠 文件可加密存储(采用的aliyun-oss)                                 |
-| *短信         | 使用 spring-cloud-alicloud-sms                                                                            |
-| 短链接         | 购买现成产品                                                                                                  |
-| 接口文档        | 援用现有接口文档系统                                                                                              |
-| 校验框架        | 采用 Validation 支持注解与工具类校验 注解支持国际化                                                                        |
-| *Excel框架     | 采用 Alibaba EasyExcel 基于插件化框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等                                          |
-| *工具类框架       | 采用 Hutool、Lombok 上百种工具覆盖90%的使用需求 基于注解自动生成 get set 等简化框架大量代码                                             |
-| 服务监控框架      | 采用 SpringBoot-Admin 基于SpringBoot官方 actuator 探针机制实时监控服务状态 框架还为其扩展了在线日志查看监控                               |
-| 全方位监控报警     | 采用 Prometheus、Grafana 多样化采集 多模板大屏展示 实时报警监控 提供详细的搭建文档                                                    |
-| 链路追踪        | 采用 Apache SkyWalking 还在为请求不知道去哪了 到哪出了问题而烦恼吗用了它即可实时查看请求经过的每一处每一个节点                                       |
-| 部署方式        | 支持 Docker 编排 一键搭建所有环境 让开发人员从此不再为搭建环境而烦恼                                                                 |
-| 国际化         | 基于请求头动态返回不同语种的文本内容 开发难度低 有对应的工具类 支持大部分注解内容国际化                                                           |
+| *ORM框架      | 采用 Mybatis-Plus 基于对象几乎不用写SQL全java操作 功能强大插件众多例如多租户插件 分页插件 乐观锁插件等等                                       |
+| *数据分页       | 采用 Mybatis-Plus 分页插件框架对其进行了扩展 对象化分页对象 支持多种方式传参 支持前端多排序 复杂排序                                            |
+| 数据权限        | 采用 Mybatis-Plus 插件 自行分析拼接SQL 无感式过滤只需为Mapper设置好注解条件 支持多种自定义 不限于部门角色                                     |
+| *数据脱敏       | 采用 注解 + jackson 序列化期间脱敏 支持不同模块不同的脱敏条件支持多种策略 如身份证、手机号、地址、邮箱、银行卡等 可自行扩展                                  |
+| 数据加解密       | 采用 注解 + mybatis 拦截器 对存取数据期间自动加解密支持多种策略 如BASE64、AES、RSA、SM2、SM4等                                        |         |
+| *多数据源框架     | 采用 dynamic-datasource 支持世面大部分数据库通过yml配置即可动态管理异构不同种类的数据库 也可通过前端页面添加数据源支持spel表达式从请求头参数等条件切换数据源           |
+| *多数据源事务     | 采用 dynamic-datasource 支持多数据源不同种类的数据库事务回滚                                                               |
+| 数据库连接池      | 采用 HikariCP Spring官方内置连接池 配置简单 以性能与稳定性闻名天下/Druid                                                       |
+| *数据库主键      | 采用 雪花ID 基于时间戳的 有序增长 唯一ID 再也不用为分库分表 数据合并主键冲突重复而发愁                                                       |
+| 服务端与前端消息通信  | 援用现有mqtt                                                                                               |
+| *序列化         | 采用 Jackson Spring官方内置序列化 靠谱!!!                                                                         |
+| 分布式任务调度     | 采用 Xxl-Job 天生支持分布式 统一的管理中心                                                                             |
+| 分布式日志中心     | 采用 ELK 业界成熟解决方案 实时收集所有服务的运行日志 快速发现定位问题                                                                 |
+| 分布式搜索引擎     | 采用 ElasticSearch以 Mybatis-Plus 方式操作 ElasticSearch                                                      |
+| *分布式消息队列    | 采用 SpringCloud-Stream + RabbitMQ                                                                       |
+| *文件存储       | 采用 Minio 分布式文件存储 天生支持多机、多硬盘、多分片、多副本存储支持权限管理 安全可靠 文件可加密存储(采用的aliyun-oss)                                |
+| *短信         | 使用 spring-cloud-alicloud-sms                                                                           |
+| 短链接         | 购买现成产品                                                                                                 |
+| 接口文档        | 沿用现有接口文档系统                                                                                             |
+| 校验框架        | 采用 Validation 支持注解与工具类校验 注解支持国际化                                                                       |
+| *Excel框架     | 采用 Alibaba EasyExcel 基于插件化框架对其增加了很多功能 例如 自动合并相同内容 自动排列布局 字典翻译等                                         |
+| *工具类框架       | 采用 Hutool、Lombok 上百种工具覆盖90%的使用需求 基于注解自动生成 get set 等简化框架大量代码                                            |
+| 服务监控框架      | 采用 SpringBoot-Admin 基于SpringBoot官方 actuator 探针机制实时监控服务状态 框架还为其扩展了在线日志查看监控                              |
+| 全方位监控报警     | 采用 Prometheus、Grafana 多样化采集 多模板大屏展示 实时报警监控 提供详细的搭建文档                                                   |
+| 链路追踪        | 采用 Apache SkyWalking 还在为请求不知道去哪了 到哪出了问题而烦恼吗用了它即可实时查看请求经过的每一处每一个节点                                      |
+| 部署方式        | 支持 Docker 编排 一键搭建所有环境 让开发人员从此不再为搭建环境而烦恼                                                                |
+| 国际化         | 基于请求头动态返回不同语种的文本内容 开发难度低 有对应的工具类 支持大部分注解内容国际化                                                          |
 
 ## 系统模块
 
@@ -96,7 +96,7 @@ sckw-service-platform
 │       └── sckw-common-log                     // 日志记录
 │       └── sckw-common-redis                   // 缓存服务
 │       └── sckw-common-message                 // 消息推送服务
-│       └── sckw-common-resource                // 资源包
+│       └── sckw-common-remote                  // 资源包
 │       └── sckw-common-sidecar                 // 多语言微服务异构
 │       └── sckw-common-stream                  // 消息驱动服务
 ~~~

+ 17 - 0
pom.xml

@@ -130,6 +130,23 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <!--SpringCloud-sentinel集成-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
+        </dependency>
+        <!-- Sentinel Datasource Nacos -->
+        <dependency>
+            <groupId>com.alibaba.csp</groupId>
+            <artifactId>sentinel-datasource-nacos</artifactId>
+<!--            <version>1.8.0</version>-->
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.tomcat.embed</groupId>
+            <artifactId>tomcat-embed-core</artifactId>
+            <version>10.1.7</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>

+ 14 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/constant/HttpStatus.java

@@ -38,6 +38,20 @@ public class HttpStatus {
     public static final int CODE_60607 = 60607;
     public static final int CODE_60608 = 60608;
     public static final int CODE_60609 = 60609;
+    /**sentinel异常code定义*/
+    public static final int CODE_60701 = 60701;
+    public static final int CODE_60801 = 60801;
+    public static final int CODE_60901 = 60901;
+    public static final int CODE_601001 = 601001;
+    public static final int CODE_601101 = 601101;
+    public static final int CODE_601201 = 601201;
+
+    public static final String FLOW_EXCEPTION_ERROR_MESSAGE = "您的访问过于频繁,请稍后重试";
+    public static final String DEGRADE_EXCEPTION_ERROR_MESSAGE = "调用服务响应异常,请稍后重试";
+    public static final String PARAM_FLOW_EXCEPTION_ERROR_MESSAGE = "您对热点参数访问过于频繁,请稍后重试";
+    public static final String SYSTEM_BLOCK_EXCEPTION_ERROR_MESSAGE = "已触碰系统的红线规则,请检查访问参数";
+    public static final String AUTHORITY_EXCEPTION_ERROR_MESSAGE = "授权规则检测不同,请检查访问参数";
+    public static final String OTHER_EXCEPTION_ERROR_MESSAGE = "非法访问,请稍后重试";
 
     /**版本号和接口版本不对称状态码*/
     public static final int VERSION_NOT_NEWEST_CODE = 60700;

+ 101 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/web/exceptionHandler/CustomBlockExceptionHandler.java

@@ -0,0 +1,101 @@
+package com.sckw.core.web.exceptionHandler;
+
+import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler;
+import com.alibaba.csp.sentinel.slots.block.BlockException;
+import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException;
+import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
+import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
+import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException;
+import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
+import com.sckw.core.web.constant.HttpStatus;
+import com.sckw.core.web.response.HttpResult;
+import jakarta.annotation.PostConstruct;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author lfdc
+ * @version 1.0
+ * @className CustomBlockExceptionHandler
+ * @description 自定义sentinel异常Handler
+ * @company sckw
+ * @date 2023-06-08 09:06:59
+ */
+@Slf4j
+@Configuration
+public class CustomBlockExceptionHandler implements BlockExceptionHandler {
+    HttpResult httpResult = null;
+    @Override
+    public void handle(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse, BlockException e) throws Exception {
+        log.info("urlBlock.......................");
+        //不同的异常返回不同的提示语
+        //FlowException  //限流异常
+        //DegradeException  //降级异常
+        //ParamFlowException //参数限流异常
+        //SystemBlockException //系统负载异常
+        //AuthorityException //授权异常
+        boolean einstanceof;
+        if (e instanceof FlowException) {
+            httpResult.setCode(HttpStatus.CODE_60701);
+            httpResult.setMsg(HttpStatus.FLOW_EXCEPTION_ERROR_MESSAGE);
+
+        } else if (e instanceof DegradeException) {
+            httpResult.setCode(HttpStatus.CODE_60801);
+            httpResult.setMsg(HttpStatus.DEGRADE_EXCEPTION_ERROR_MESSAGE);
+
+        } else if (e instanceof ParamFlowException) {
+            httpResult.setCode(HttpStatus.CODE_60901);
+            httpResult.setMsg(HttpStatus.PARAM_FLOW_EXCEPTION_ERROR_MESSAGE);
+
+        } else if (e instanceof SystemBlockException) {
+            httpResult.setCode(HttpStatus.CODE_601001);
+            httpResult.setMsg(HttpStatus.SYSTEM_BLOCK_EXCEPTION_ERROR_MESSAGE);
+        } else if (e instanceof AuthorityException) {
+            httpResult.setCode(HttpStatus.CODE_601101);
+            httpResult.setMsg(HttpStatus.AUTHORITY_EXCEPTION_ERROR_MESSAGE);
+        } else {
+            //其他规则
+            httpResult.setCode(HttpStatus.CODE_601201);
+            httpResult.setMsg(HttpStatus.OTHER_EXCEPTION_ERROR_MESSAGE);
+        }
+    }
+
+    public static HttpResult sentinelFlowBlock(BlockException ex){
+        log.info("flowException ERROR:{}",ex.getRule(),ex);
+        return HttpResult.error(HttpStatus.CODE_60701, HttpStatus.FLOW_EXCEPTION_ERROR_MESSAGE);
+    }
+
+    public static HttpResult sentinelDegradeBlock(BlockException ex){
+//        log.info("sentinelDegradeDemo进入熔断");
+        log.info("degradeException ERROR:{}",ex.getRule(),ex);
+        return HttpResult.error(HttpStatus.CODE_60801, HttpStatus.DEGRADE_EXCEPTION_ERROR_MESSAGE);
+    }
+
+    public static HttpResult sentinelParamFlowBlock(BlockException ex){
+        log.info("paramFlowException ERROR:{}",ex.getRule(),ex);
+        return HttpResult.error(HttpStatus.CODE_60901, HttpStatus.PARAM_FLOW_EXCEPTION_ERROR_MESSAGE);
+    }
+
+    public static HttpResult sentinelSystemBlock(BlockException ex){
+        log.info("systemException ERROR:{}",ex.getRule(),ex);
+        return HttpResult.error(HttpStatus.CODE_601001, HttpStatus.SYSTEM_BLOCK_EXCEPTION_ERROR_MESSAGE);
+    }
+
+    public static HttpResult sentinelAuthorityBlock(BlockException ex){
+        log.info("authorityException ERROR:{}",ex.getRule(),ex);
+        return HttpResult.error(HttpStatus.CODE_601101,HttpStatus.AUTHORITY_EXCEPTION_ERROR_MESSAGE);
+    }
+
+
+    public static HttpResult sentinelOtherBlock(BlockException ex){
+        log.info("otherException ERROR:{}",ex.getRule(),ex);
+        return HttpResult.error(HttpStatus.CODE_601201, HttpStatus.OTHER_EXCEPTION_ERROR_MESSAGE);
+    }
+
+    @PostConstruct
+    public void init() {
+        new CustomBlockExceptionHandler();
+    }
+}

+ 0 - 5
sckw-common/sckw-common-excel/pom.xml

@@ -66,11 +66,6 @@
             <groupId>org.springframework</groupId>
             <artifactId>spring-web</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.apache.tomcat.embed</groupId>
-            <artifactId>tomcat-embed-core</artifactId>
-            <version>10.1.7</version>
-        </dependency>
         <dependency>
             <groupId>commons-io</groupId>
             <artifactId>commons-io</artifactId>

+ 35 - 0
sckw-modules-api/sckw-file-api/src/main/java/com/sckw/file/api/Fallback/FileApiFeignServiceFallback.java

@@ -0,0 +1,35 @@
+package com.sckw.file.api.Fallback;
+
+import com.sckw.core.web.response.HttpResult;
+import com.sckw.file.api.feign.FileApiFeignService;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Map;
+
+/**
+ * @author lfdc
+ * @version 1.0
+ * @className FileApiFeignServiceFallback
+ * @description 降级
+ * @company sckw
+ * @date 2023-06-06 16:06:48
+ */
+@Component
+public class FileApiFeignServiceFallback implements FileApiFeignService {
+
+    @Override
+    public HttpResult fileFeignUpload(MultipartFile file) {
+        return new HttpResult();
+    }
+
+    @Override
+    public String fileFeignDemo(String userName) {
+        return "fileFeignDemo";
+    }
+
+    @Override
+    public String fileFeignDemo1(Map<String, String> map) {
+        return "fileFeignDemo1";
+    }
+}

+ 7 - 1
sckw-modules/sckw-example/src/main/java/com/sckw/example/ExampleApplication.java

@@ -15,6 +15,12 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
 public class ExampleApplication {
 
     public static void main(String[] args) {
-        SpringApplication.run(ExampleApplication.class, args);
+        // 关闭nacos日志
+        System.setProperty("nacos.logging.default.config.enabled", "false");
+        try {
+            SpringApplication.run(ExampleApplication.class, args);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
     }
 }

+ 28 - 4
sckw-modules/sckw-example/src/main/java/com/sckw/example/controller/SysUserController.java

@@ -1,8 +1,10 @@
 package com.sckw.example.controller;
 
 import cn.hutool.core.lang.UUID;
+import com.alibaba.csp.sentinel.annotation.SentinelResource;
 import com.alibaba.fastjson2.JSON;
 import com.sckw.core.model.page.PageResult;
+import com.sckw.core.web.exceptionHandler.CustomBlockExceptionHandler;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.example.model.SysUser;
 import com.sckw.example.model.TestSensitive;
@@ -16,10 +18,7 @@ import org.redisson.api.RBucket;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cloud.stream.function.StreamBridge;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.Date;
@@ -82,6 +81,31 @@ public class SysUserController {
         return HttpResult.ok(pageResult);
     }
 
+
+    //value将该方法定义为sentinel的资源,blockHandlerClass指明流控处理的类,blockHandler是流控时调用的方法。
+    //这里需要注意处理异常的方法必须是静态方法添加static, 并需要添加sentinel的异常参数BlockException。
+    @RequestMapping(value = "sentinelFlowDemo", method = RequestMethod.GET)
+    @SentinelResource(value = "sentinelFlowDemo", blockHandlerClass = CustomBlockExceptionHandler.class, blockHandler = "sentinelFlowBlock")
+    public HttpResult sentinelFlowDemo() {
+        return HttpResult.ok("sentinelFlowDemo正常返回");
+    }
+
+    @RequestMapping(value = "sentinelDegradeDemo", method = RequestMethod.GET)
+    @SentinelResource(value = "sentinelDegradeDemo", blockHandlerClass = SysUserController.class, blockHandler = "sentinelDegradeBlock")
+    public HttpResult sentinelDegradeDemo(@RequestParam("id") String id) {
+        if ("2".equals(id)){
+            try {
+                Thread.sleep(5000);
+            } catch (InterruptedException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return HttpResult.ok("sentinelDegradeDemo正常返回");
+    }
+
+
+
+
     @GetMapping("/testSensitive")
     public HttpResult testSensitive() {
         TestSensitive testSensitive = new TestSensitive();

+ 5 - 0
sckw-modules/sckw-example/src/main/resources/banner.txt

@@ -0,0 +1,5 @@
+====================================================================================================================
+
+                    欢迎使用 [sckw-example] 开物供应链服务平台-示例服务 - Powered By https://www.xxxx.com
+
+====================================================================================================================

+ 106 - 0
sckw-modules/sckw-example/src/main/resources/bootstrap-dev.yml

@@ -12,8 +12,14 @@ spring:
         server-addr: 127.0.0.1:8848
         # 命名空间
         namespace: sckw-service-platform-dev
+        # nacos用户名
+        username: nacos
+        # nacos密码
+        password: nacos
         # 共享配置
         group: sckw-service-platform
+        # 权重 1-100 数值越大权重越大分配的流量就越大,通常结合权重负载均衡策略
+#        weight: 100
       config:
         # 配置中心地址
         server-addr: 127.0.0.1:8848
@@ -23,6 +29,7 @@ spring:
         namespace: sckw-service-platform-dev
         # 共享配置
         group: sckw-service-platform
+        enabled: true
     stream:
       bindings:
         sckwSms-out-0:
@@ -46,7 +53,106 @@ spring:
                 port: 5672
                 username: wph
                 password: Yy123...
+# sentinel降级配置
+    sentinel:
+      transport:
+        client-ip: ${spring.cloud.client.ip-address} # 获取本机IP地址
+        port: 8719  #默认8719端口,如果被占用会向上扫描。
+        #控制台地址
+#        dashboard: 47.108.162.14:8080
+        dashboard: 127.0.0.1:9527
+        # 默认将调用链路收敛,导致链路流控效果无效
+        web-context-unify: false
+        #持久化nacos配置中
+      datasource:
+#        sentinel-rule: # 唯一名称可自定义
+        #限流
+        flow:
+          nacos:
+            # 设置Nacos的连接地址、命名空间和Group ID
+            namespace:  sckw-service-platform-dev
+#            server-addr:  127.0.0.1:8848
+            server-addr:  ${spring.cloud.nacos.discovery.server-addr}
+#            username: ${spring.cloud.nacos.discovery.username}
+#            password: ${spring.cloud.nacos.discovery.password}
+            # 设置Nacos中配置文件的命名规则
+#            data-id:  ${spring.application.name}-sentinel-flow-rules
+            data-id:  sckw-example-sentinel-flow-rules
+            group-id: SENTINEL_GROUP
+            data-type: json
+            # 必填的重要字段,指定当前规则类型是"限流"
+            rule-type: flow
+        #熔断
+        degrade:
+          nacos:
+#            namespace:  sckw-service-platform-dev
+            server-addr: ${spring.cloud.nacos.discovery.server-addr}
+#            data-id: ${spring.application.name}-sentinel-degrade-rules
+            data-id: sckw-example-sentinel-degrade-rules
+#            data-id:  sentinel-degrade-rule-json
+            group-id: SENTINEL_GROUP
+            #熔断
+            rule-type: degrade
 
+#        flow:
+
+#          nacos:
+#            server-addr: localhost:8848
+#            dataId: ${spring.application.name}-flow-rules
+#            groupId: SENTINEL_GROUP
+#            # 规则类型,取值见:
+#            # org.springframework.cloud.alibaba.sentinel.datasource.RuleType
+#            rule-type: flow
+#        degrade:
+#          nacos:
+#            server-addr: localhost:8848
+#            dataId: ${spring.application.name}-degrade-rules
+#            groupId: SENTINEL_GROUP
+#            rule-type: degrade
+#        system:
+#          nacos:
+#            server-addr: localhost:8848
+#            dataId: ${spring.application.name}-system-rules
+#            groupId: SENTINEL_GROUP
+#            rule-type: system
+#        authority:
+#          nacos:
+#            server-addr: localhost:8848
+#            dataId: ${spring.application.name}-authority-rules
+#            groupId: SENTINEL_GROUP
+#            rule-type: authority
+#        param-flow:
+#          nacos:
+#            server-addr: localhost:8848
+#            dataId: ${spring.application.name}-param-flow-rules
+#            groupId: SENTINEL_GROUP
+#            rule-type: param-flow
+      #取消慢加载
+      eager: true
+
+#seata:
+#  # seata 服务分组,要与服务端nacos-config.txt中service.vgroup_mapping的后缀对应
+#  tx-service-group: my_test_tx_group
+#  registry:
+#    # 指定nacos作为注册中心
+#    type: nacos
+#    nacos:
+#      server-addr: 127.0.0.1:8848
+#      namespace: ""
+#      group: SEATA_GROUP
+#
+#  config:
+#    # 指定nacos作为配置中心
+#    type: nacos
+#    nacos:
+#      server-addr: 127.0.0.1:8848
+##      namespace: "54433b62-df64-40f1-9527-c907219fc17f"
+#      namespace: sckw-service-platform-dev
+#      group: SEATA_GROUP
+# 支持feign对sentinel支持
+#feign:
+#  sentinel:
+#    enabled: true
 
 dubbo:
   application:

+ 11 - 6
sckw-modules/sckw-file/pom.xml

@@ -31,14 +31,19 @@
         </dependency>
         <dependency>
             <groupId>com.sckw</groupId>
-            <artifactId>sckw-common-datasource</artifactId>
-            <version>1.0.0</version>
-        </dependency>
-        <dependency>
-            <groupId>com.sckw</groupId>
-            <artifactId>sckw-common-redis</artifactId>
+            <artifactId>sckw-common-core</artifactId>
             <version>1.0.0</version>
         </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.sckw</groupId>-->
+<!--            <artifactId>sckw-common-datasource</artifactId>-->
+<!--            <version>1.0.0</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>com.sckw</groupId>-->
+<!--            <artifactId>sckw-common-redis</artifactId>-->
+<!--            <version>1.0.0</version>-->
+<!--        </dependency>-->
 
         <dependency>
             <groupId>com.sckw</groupId>

+ 3 - 1
sckw-modules/sckw-file/src/main/java/com/sckw/file/utils/FileUtils.java

@@ -7,6 +7,7 @@ import com.aliyun.oss.OSSClientBuilder;
 import com.aliyun.oss.OSSException;
 import com.aliyun.oss.model.*;
 import com.sckw.core.utils.IdWorker;
+import com.sckw.core.utils.PasswordUtils;
 import com.sckw.core.utils.StringUtils;
 import com.sckw.file.common.enums.AliyunOssFileTypeEnum;
 import com.sckw.file.common.enums.FileEnum;
@@ -114,7 +115,8 @@ public class FileUtils {
             String fileName = file.getOriginalFilename();
             //生成随机唯一值,使用uuid,添加到文件名称里面
             long uuid = new IdWorker(1).nextId();
-            fileName = String.valueOf(uuid) + fileName;
+//            fileName = String.valueOf(uuid) + fileName;
+            fileName = PasswordUtils.md5(fileName);
             //按照当前日期,创建文件夹,上传到创建文件夹里面
             //2021/02/02/01.jpgossClient = {OSSClient@13049}
             String timeUrl = new DateTime().toString("yyyyMMdd");