徽章生产网站 https://shields.io/
麦兜框架:依赖管理 基类/超类 效验参数 架构规则库 操作稽查组件 缓存组件 多级缓存 多数据源 动态数据源 加解密 MQ组件
画图工具 excalidraw
mcdull
├──doc 文档
│ ├─db sql
│ └─yaml 配置文件
│
├─mcdull-bussiness 业务模块
│
├─mcdull-framework 基础框架
│ ├─mcdull-framework-agent 探针模块
│ ├─mcdull-framework-base 底层定义
│ ├─mcdull-framework-config 配置定义
│ ├─mcdull-framework-dependencies 依赖管理
│ ├─mcdull-framework-enforcer 框架规则
│ └─mcdull-framework-starters 组件starters
│ ├─mcdull-framework-starter-feign feign组件
│ ├─mcdull-framework-starter-feign 流程编排
│ ├─mcdull-framework-starter-mongodb mongodb组件
│ ├─mcdull-framework-starter-mysql mysql组件
│ ├─mcdull-framework-starter-nacos nacos组件
│ ├─mcdull-framework-starter-oss 对象存储
│ ├─mcdull-framework-starter-redis redis组件
│ └─mcdull-framework-starter-web web组件
│
├─mcdull-support 支撑模块(包含技术中台和业务中台)
│ └─mcdull-geteway 统一网关
│ ├─mcdull-generator 代码生成器
│ ├─mcdull-mdc 元数据中心
│ └─mcdull-uac 用户中心
docsify
,安装之前必须要安装nodeJS
npm i docsify-cli -g
cd doc
docsify serve .
关于基本数据类型与包装数据类型的使用标准如下:
说明:POJO类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何NPE问题,或者入库检查,都由使用者来保证。
<!--feign配置 针对解决:feign调用get请求时,body有参导致服务端自动转换为post请求-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
private void biz(MultipartFile[] attachmentFiles) {
this.前置逻辑();
EmailUtil.sendEmailAsyn(
() -> {
// 模拟复现条件 Thread.sleep(25000);
// 可能存在的场景:主线程结束,临时文件被清空,导致子线程业务类无法获取到临时文件而报错(系统找不到指定的文件)。
mailApi.sendEmailToMultipleReceiverWithAttachment(attachmentFiles, sendTo, ccs, subject, html(text));
});
this.后续逻辑();
}
改成主线程、或者使用file.getInputStream(),以文件流信息存储在内存中
/**
* 单个详情(使用 @SpringQueryMap)
*
* @param dto dto
* @return {@link Result < DictVO >}
*/
@GetMapping("/dict/detail")
Result<DictVO> detail(@SpringQueryMap @Validated(value = ValidGroup.One.class) DictLiteDTO dto);
asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数据
// 反例
String[] str = new String[]{"1", "2"};
List<String> list = Arrays.asList(str);
// 第一种情况运行时异常
list.add(3);
// 第二种情况也会随之修改,反之亦然
str[0] = "1-1";
System.out.println(list);
// 反例
BeanUtil.copyProperties(source, target)
// 正例
get/set
说明:使用反射效率低,其次增加可维护性成本增高,后面接手的小伙伴不知道程序哪些是需要的字段. 使用get/set是最直接,也是最简单的。后续二开/维护排错倍倍香!!!
多说一句: 日志用时方恨少,但切记避免过于冗余
swagger
lombok
,不要一上来就使用@Data
注解get
、set
和 toString
,但这哥们给我们生成太多东西了。另外因为是在编译的时候生成的,导致编译速度下降用于检查 Java 代码的体系结构,命名,层级调用是否满足规约
<dependency>
<groupId>io.gitee.dqcer</groupId>
<artifactId>mcdull-framework-enforcer</artifactId>
<scope>test</scope>
</dependency>
private JavaClasses classes;
@BeforeEach
public void setUp() {
classes = new ClassFileImporter()
.withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_JARS)
.withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_TESTS)
.withImportOption(ImportOption.Predefined.DO_NOT_INCLUDE_PACKAGE_INFOS)
.importPackages("io.gitee");
}
@Test
public void requiredRules() {
for (ArchRule rule : ArchitectureEnforcer.requiredRules) {
rule.check(classes);
}
}
// 反例
throw new Exception();
throw new RuntimeException("error");
throw new Throwable("error");
class CustomException extends Throwable {
}
System.out.println("foo");
System.err.println("bar");
OutputStream out = System.out;
out.write(bytes)
try {
// ...
} catch (Exception e) {
e.printStackTrace();
}
通过alt+enter对变量类生成对类的所有setter方法的调用
快速从代码跳转到mapper及从mapper返回代码
一套 Restful 服务开发辅助工具集
自动生成javadoc文档注释
动态表单: https://segmentfault.com/q/1010000009146625 https://www.jianshu.com/p/b2f4ad0ec396 log.error("xxxxx", ThrowableUtil.getStackTraceAsString(e)); 如有需求请联系作者(dqcer@sina.com)
// 反例
if (condition1) { // Compliant - depth = 1
/* ... */
if (condition2) { // Compliant - depth = 2
/* ... */
for(int i = 0; i < 10; i++) { // Compliant - depth = 3, not exceeding the limit
/* ... */
if (condition4) { // Noncompliant - depth = 4
if (condition5) { // Depth = 5, exceeding the limit, but issues are only reported on depth = 4
/* ... */
}
return;
}
}
}
}
// 正例
if (!condition1) {
/* ... */
return;
}
if (!condition2) {
/* ... */
return;
}
for(int i = 0; i < 10; i++) {
/* ... */
if (condition4) {
if (condition5) {
/* ... */
}
return;
}
}
OncePerRequestFilter
而不是Filter
OncePerRequestFilter 确保其 doFilter() 方法在每个请求中只被调用一次,即使在多个线程并发处理请求的情况下
LoadBalancer
用默认的缓存生产环境中使用Caffeine 缓存以获得更好的性能和内存管理
pom
添加依赖 <dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
application.yml
添加配置spring:
cache:
type: caffeine
需要兼容,定时任务、无需登录的接口和场景
validation
的组进行分组效验后期谁维护了才只知道,可维护性差
背景:测试提交了一个bug,开发人员无法确认是哪个版本有这个问题?当前测试环境部署的是某个版本吗?生产环境会不会也有这个问题? 公司内部的项目,总共几十、几百个服务,每天都有服务的生产环境部署,一个服务甚至一天上线好几次,对于项目管理来说无法清晰了解某一时刻某个服务的版本 如何验证我的代码是否已经上线?
持续更新中... 欢迎点star
, 避免下次迷路
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。