docker部署redis集群(Cluster版)
拉取Redis镜像 1docker pull redis 拉取Redis-trib镜像 1docker pull inem0o/redis-trib 通过镜像启动容器(Redis集群实例*6) 123456docker run --name redis7000 -p 7000:6379 -d redis redis-server --appendonly yes --protected-mode no --cluster-enabled yesdocker run --name redis7001 -p 7001:6379 -d redis redis-server --appendonly yes --protected-mode no --cluster-enabled yesdocker run --name redis7002 -p 7002:6379 -d redis redis-server --appendonly yes --protected-mode no --cluster-enabled yesdocker run --name redis7003 -p ...
自用docker-compose
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191version: '2' # 定义版本,不...
其他一些研发规范
目录接口篇 接口篇 异常处理与日志篇 数据库篇 MQ篇 Redis篇 单元测试篇
目录接口篇
1234567891011121314151617181920212223242526272829gds-parent 根目录 gds-wms-parent 仓库运营系统服务 gds-wms 仓库运营系统服务 src common 公共类 utils 工具类 命名以Util结尾的类 domain 业务对象 enums 枚举类 exception 放自定义异常类 mapper 如果用JPA操作数据库用repository 放命名以Repository结尾的类, 用mybaits操作数据库用mapper 放命名以Mapper结尾的类 remote 远程调用,放fegin调用接口 consumer...
数据库篇
脚本提交 统一使用Flyway进行统一的管理 svn://172.16.30.16:20044/G2G_DS/trunk/WMS/wms_db_script Dao操作相关 对数据库表更新/删除操作不能使用ID作为’第一’条件, 如 错误用法 1update parcel set a="value" where id=123 正确用法 应用业务主键作为条件 1update parcel set a="value" where fpxTrackingNo="fpx20190402" 数据库查询不允许使用select *, 应使用select a,b,c
接口篇
以下为以前开发自己设定的一些规范,供以后参考 1. 返回类型 所有接口返回类型都为ResponseMsg 除了与外界交互的接口,不允许其它返回类型为ResponseMsg的方法 2. 对外接口请求路径规则 提供给app用的接口统一以[/app]开头 提供给外部系统调用的接口统一以[/api]开头 提供给页面的接口统一以[/page]开头 3. Controller层做的事情 组装/校验参数 仅调用 “1次” Service层服务 组装返回ResponseMsg返回给调用方 其它补充 不要在Controller层写任何数据库操作的逻辑!包括查询! 所有业务操作都放在Service层!Controller层只用来做校验,以及组装返回值! 请务必注意!务必!务必!
Redis篇
redis缓存Key规范 Key前缀统一使用常量: ConstantsString.RedisConstant.REDIS_CACHE_PREFIX
MQ篇
MQ队列命名规范 业务线_队列的生产者项目名_消费的项目名称_[Q/R/X]_自定义标识 如 : GDS_WMS_WOS_Q_FORECAST 对应的Exchange名为:GDS_WMS_WOS_X_FORECAST 对应的Routing key名为:GDS_WMS_WOS_R_FORECAST ; 对应的死信队列名为:GDS_WMS_WOS_Q_FORECAST_DEAD 对应的死信Exchange名为:GDS_WMS_WOS_X_FORECAST_DEAD 对应的死信Routing key名为:GDS_WMS_WOS_R_FORECAST_DEAD 生产者队列的消息统一通过 [MQ的shovels插件] 转发到消费者队列 生产者不需要创建死信队列 消费者队列必须测试一下消息失败是否会进入对应的死信 这,很重要 MQ队列/Exchange 定义规范 [生产者端]需要定义队列+Exchange 并且建立队列和Exchange的绑定关系 队列需要定义: durable=true exclusive=false, autoDelete=false...
待办篇
待办目录 [X] 基于Junit5的新测试用例规范 [ ] 基于新测试用例的demo [ ] MQ重复消费问题解决 [X] 根据请求ID追踪调用链所有日志 系统改造 [ ] 新建GDS公用工程,存放Wms与Wos公用代码(暂定)
单元测试篇
关于测试类的规范 (暂定) 单元测试应该是不依赖于别的单元测试的 所有单元测试应该都得回滚,如果存在异步处理的情况,应尽可能把主线程与fork线程拆成2个测试类方法进行测试 每个测试类/测试方法应写上对应的名称@DisplayName 每个接口,都必须写一个正向测试方法 关于测试类的类名:测试类与被测试的类的路径需要一致,名字也需要对应,如: 123com.fpx.wms.service.impl.InstockServiceImpl↓对应↓com.fpx.wms.service.impl.InstockServiceImplTest 关于测试类的方法名: 方法名尽可能为成功的条件如shouldSuccessAfterPay(),而方法具体用来测试哪个场景的,我们已经使用了@ DisplayName来描述,无须担心 对于结果,需要适应assert断言输出与结果是否一致(这才能算是一个单元测试) 断言统一使用AssertJ框架,使用Assertions.assertThat()进行处理 可以参考\gds-parent\gds-wms-parent\gds-wms\src\t...
异常处理与日志篇
异常处理 异常处理不需要手动输出日志 - 全局异常处理会帮你做这件事 遇到的所有异常都包装成[业务异常]or[系统异常]后往上抛 业务异常(校验异常等) 对应类:BusinessRuntimeException 常用方法: 1. throw BusinessRuntimeException.buildBusyException(EnumCommomSysErrorCode.MQ_ERROR, “消费异常”, parm); 2. throw BusinessRuntimeException.buildBusyException(parm,EnumCommomSysErrorCode.MQ_ERROR,); 系统异常(404,MQ联不通等) 对应类:SystemRuntimeException 常用方法: 1. throw SystemRuntimeException.buildSysException(EnumCommomSysErrorCode.FILE_TYPE_NOT_SUPPORT, e, parm); 2. throw SystemRunt...
MySQL锁
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/database/innodb-record-level-locks.html 官方参考 MySQL锁 InnoDB锁机制是基于索引建立的 如果SQL语句中匹配不到索引,那么就会升级为表锁 记录锁 1234-- id 列为主键列或唯一索引列SELECT * FROM table WHERE id = 1 FOR UPDATE;或update table set age=2 WHERE id = 1; 通过唯一索引实现的记录锁,只会锁住当前记录(必须为=不然会退化为临键锁) 间隙锁 间隙锁只有在事务隔离级别 RR(可重复读) 中才会生效. 为非唯一索引组成(如class,age等) 1select student where age>26 and age<28 lock in share mode ; 使用间隙锁的条件 命中普通索引锁定; 使用多列唯一索引; 使用唯一索引命中多行记录 临键锁(Next-key Locks) 临键锁只...
深入理解Java虚拟机-阅读整理
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/JVM/JVM-Xmind.html 看完《深入理解Java虚拟机》了(好像是教这个名字吧😂),花了小几个月边看边整理,终于呕心沥血地整理完的,书籍作者基于jdk7写的,加入分析对比了一些jdk8的新特性,以及官方文献的引用,因为JVM还是比较底层灰色,难免有些地方可能有误,欢迎指正。 图片很大,需要放大看,实在看不清,可以去github上自取源Xmind文件:点这里跳转 (有一章类结构偷懒没看,自我感觉用处不是很大)
Spring生命周期
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/Spring/Spring-life-cycle.html 以以下为准: 1. 获取beanDefinition 通过loadBeanDefinitions() -> 读取配置文件 -> 解析配置文件 -> 封装成BeanDefinition -> 注册到BeanDefinitionRegistry的beanDefinitionMap中 扩展1:BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry 获取BeanDefinitionRegistry,增删改BeanDefinition,因为后续按此顺序创建 扩展2:BeanFactoryPostProcessor.postProcessBeanFactory BeanDefinition加载完成之后,但实例化bean之前进行一些额外的处理 这时候所有的bean定义都已加载,但还没有实例化任何bean。...
Spring白板源码整理
[原创]个人理解,请批判接受,有误请指正。转载请注明出处: https://heyfl.gitee.io/Spring/Spring-whiteboard.html 这本经常出错的辣鸡书的读后整理:《Spring源码深度解析》 仅记录,日后有空加描述,嗯,有空的话,有空再说。。。 SpringAOP源码 Spring事务源码 SpringMVC Spring DispatcherServlet源码 Spring+Mybatis整合原理源码分析 Spring整合MyBatis的原理是将MyBatis的SqlSessionFactory和Spring的IoC容器进行集成,从而在Spring容器中管理SqlSessionFactory对象,进而管理MyBatis的SqlSession对象 在Spring整合MyBatis的过程中,主要用到了以下几个FactoryBean: SqlSessionFactoryBean: 它是一个FactoryBean,用于创建SqlSessionFactory对象,并将其纳入Spring容器进行管理。它通过配置DataSource等参数,...



