自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(58)
  • 资源 (1)
  • 收藏
  • 关注

原创 Kafka、rabbitmq、zeromq、rocketmq、activemq综合对比(一)

http://kadima.asia/blogs/articles/203一、资料文档Kafka:中。有kafka作者自己写的书,网上资料也有一些。rabbitmq:多。有一些不错的书,网上资料多。zeromq:少。没有专门写zeromq的书,网上的资料多是一些代码的实现和简单介绍。rocketmq:少。没有专门写rocketmq的书,网上的资料良莠不齐,官方文档很简洁,但是对技术细节没有过多的描...

2018-04-12 15:44:56 1211

原创 领域驱动DDD之供应链多渠道(华泊、唯品、京东等等)地址库匹配下单地址校验下单流程

绝大多数项目都需要涉及到地址库,我曾经负责过的电商系统,各个渠道(中间商,包括唯品、华泊渠道 )的地址库数据是不一样,比如相同地址的中文不同,或者地址编码不同,为了能够正常下单,我们建立了地址库并且通过"渠道ID"的方式去映射对应的地址,我们的地址库是TBL地址库,唯品的地址库是VIP地址库,华泊的地址库是HUABO地址库。tbl_hua_bo_districts是TBL地址库的表名,项目的线上数据库使用的是Mongodb。huabo_address是华泊HUABO地址库的表名。为了匹配

2020-08-20 18:54:41 1077 1

原创 Mongodb基于Spring-Data的分页查询工具类

定义“分页数据”类,用于向前端返回分页数据。import com.fasterxml.jackson.annotation.JsonProperty;import lombok.Builder;import lombok.Data;import java.util.List;/** * Created on 2020/5/6 21:45 * * @author linzihao * @desc 分页数据 */@Data@Builderpublic class Page&lt

2020-08-11 17:15:54 898

原创 Spring AOP面向切面编程之基于@Aspect或者@RestControllerAdvice实现的全局参数校验器ParamValidateAspect

Spring framework框架为我们提供了很多有用的工具,比如Validation类用于处于HTTP请求的参数校验。import org.springframework.validation.Errors;import org.springframework.validation.FieldError;import org.springframework.validation.ObjectError;我们可以在Controller层获取Error来判断是否校验失败,但是这样每一个Cont

2020-08-06 15:40:59 1777

原创 Spring AOP面向切面编程之自定义日志注解@OperateLog

金融、交易类应用的日志Log非常重要,这类应用的业务包含了日志记录逻辑,比如记录用户的交易记录。对于重要的日志数据,我们是一定要持久化到数据库和磁盘上的,还有一些日志的数据,则是为了方便运营人员的操作记录。SpringAOP面向切面编程非常强大,不论是Spring的声明式事务@Transactional,还是SpringCloudHystrix熔断器,都是基于AOP的原理实现的,只要研究一下Springframework框架的源码,就会明白为什么Spring会那么灵活而敏捷,她的实现是那么优...

2020-08-04 16:35:07 5254

原创 Spring Swagger注解生成接口文档

SpringSwagger通过注解就可以为我们生成接口文档,十分便捷!首先,在build.grade配置文件中加入依赖implementation 'org.apache.kafka:kafka-clients'implementation 'io.springfox:springfox-swagger2:2.9.2'implementation 'io.springfox:springfox-swagger-ui:2.9.2'加入Swagger的配置/** * @author .

2020-07-21 16:20:57 441

原创 Scrum敏捷开发:项目流程大纲

PO 角色负责需求的管理、产品路径规划、组织版本验收。维护好产品代办列表、梳理需求优先级排序,对需求ROI负责。“Product Owner(PO)——用户/客户/业务的代言人,就是可以做出业务决策的人,所谓业务决策包括需求与优先级。”需求产品端生命周期分为:原始需求、已确认需求、待评审需求。 版本路线规划 采用用户故事地图框架,定义版本、Epic、story 采用JIRA 进行上述三要素的规划 需求管理: 产品经理与业务方的需求采集以及内部规划的需求。(需要筛选的需求)

2020-06-23 13:54:33 554

原创 Scrum敏捷开发:Git版本管理流程及规范

分支概述分支流程中包含4类分支,分别是master、release、dev、hotfix,各类分支作用和生命周期各不相同。 master:该分支是线上稳定版本代码,禁止提交代码 dev:从master分支切出,是需要开发代码的分支,所有开发均在dev分支 release:从dev分支切出,dev合并到release分支进行测试,同时也是发布分支 hotfix:从master分支切出,解决线上紧急BUG的修复 角色及职责开发组员 dev、hotfix的分支开发 开发.

2020-06-23 10:53:41 2484

原创 Java的Vector等线程安全list的插入性能对比

/** * @author Johny 林子豪 * 多线程集合插入元素的性能对比。 */public class ListTest { private static final List<String> listA = new Vector<>(); private static final List<String> listB = Collections.synchronizedList(new ArrayList<>());.

2020-06-18 12:27:16 412

原创 项目架构实战:分层架构规范之CQRS分离

一、引入的目的领域驱动作为一种系统分析的方法论,分清了职责范围、通过分层剥离了业务逻辑,但是在实践过程中依然会遇到很多问题。例如常见的查询问题: 一个业务系统会存在各种查询功能,例如列表查询、分页查询等,没有业务逻辑(或者很少),如果按照常规的领域分层会导致大量的模型转换工作,并且存在大量的分页信息(pageSize\pageNo\totalPage等)无处安放,因为它们并不属于Domain内的属性或行为,如果算Domain里的属性,会导致Domain越来越大。CQRS正好可以解决领域驱动中的查

2020-06-12 18:09:02 592

原创 ImageTypeUtil工具类:Java获取URL对应的文件类型及其后缀

Java获取URL对应的文件类型及其后缀的主流方法有三种:1、根据文件头部数据来判断。通常需要先下载再判断,但是如果想要在下载的时候确定文件后缀,就做不到了,而且获取的文件类型不是很准确。2、使用lastIndexOf去解析url字符串。这种方法最简单高效。3、UrlConnection获取ContentType的类型推测出文件的类型。这里我封装了一个工具类,将第二种方法和第三种方法结合。package johny.utils;import java.net.URLConn

2020-06-12 00:56:56 2801

原创 IDEA Java性能分析插件VisualVM Launcher 配置(JAVA VisualVM 与Jconsole配置相同)

可视化监控内存的使用状况很重要,尤其是解决JavaHeapOverFlow等问题。在settinhs的Plugins中找到VisualVm并安装。选择使用VisualVm去运行程序。

2020-06-11 11:46:28 824

原创 项目架构实战:分层架构规范的Demo以及微服务架构的演进

分层目录要点严格区分每层的职责 严格确定分层的调用链路 严禁使用map/json等格式做数据传递 严禁使用BeanUtil.Copy等方法转换分层目录结构总体分为应用层、业务领域层和基础设施层应用层应用层用于接收外部的请求,是整个系统所提供能力的外观,包含API、MQ-Listener等。专用于处理和业务无关的操作,包含验签、参数校验、拦截等处理,不实现业务逻辑通过编排业务领域和外部请求,对外提供细粒度的能力API:接收来自外部的HTTP请求,只做参数校验、业务领域.

2020-06-08 17:15:02 861

原创 使用RestTemplate的postForObject方法直接传递对象

用户支付成功后,我们要向中间商的系统打款,【订单支付成功接口】请求内部的【消息推送接口】,通过Rabbitmq消息通知中间商的系统,他们返回打款是否成功,这里展示的是【订单支付成功接口】向【消息推送接口】的请求。@RequestBody这个注解很重要,一定要加这个注解,否则请用户求对象huaBoOrderPushRequest对象的字段都为null。【消息推送接口】/** * @author johny * @date 2020/5/13 */@RestController@Requ

2020-06-05 17:06:55 7975 1

原创 ApplicationContext上下文操作工具类ContextUtils,基于Spring。

import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.stereotype.Component;/** * Created on 2020/3/26 15:19 * *...

2020-06-05 10:25:54 1114

原创 SpringBoot迅速整合Rabbitmq

SpringBoot整合Rabbitmq其实只需要三步一、加入Rabbitmq的相关依赖pom.xml里用到的jar依赖: <!--rabbitmq--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-amqp</arti

2020-06-03 17:54:59 151

原创 mongodb使用compass可视化管理工具来查看文件数据

可以通过documents下箭头指向的三个框去指定查询条件查询。其中:filter:类似sql命令中where后面的条件,注意格式要写成键值对形式,键指字段值。project:好像是是管道符,没有用到,可以参考http://www.cnblogs.com/ljhdo/p/5019837.html该文章。sort:顾名思义指排序方式,输入的也是键值对形式,键指要排序的字段,值可以写1或-1,规定是升序(1)还是降序(-1)。...

2020-05-30 13:25:40 2150

原创 IDEA maven无法识别第三方jar包

maven已经添加了依赖,但是仍然找不到对应的类。convert to repository library。

2020-05-29 06:01:02 1505 2

原创 SpringBootTest单元测试报错

@RunWith(SpringRunner.class)@SpringBootTest(classes = { DataRulesApplication.class })@EnableAutoConfiguration//@SpringBootTest(classes = { DataRulesApplication.class })public class HuaboAddressTest extends AbstractTestNGSpringContextTests { @Aut.

2020-05-28 17:38:09 2841

原创 IDEA的乱码编码问题

IDEA的编码默认是GBK,要修改为UTF-8.但是在Grable执行build任务的时候,还是出现了乱码。要在idea64.exe.vmoptions的文件中最后一行加入-Dfile.encoding=UTF-8

2020-05-28 16:48:31 256

原创 Mongodb安装与服务启动

Mongodb官网下载server之后,配置环境变量为Mongodb的bin目录,具体方法就不仔细说了。发现MongoDBCompassCommunity.exe启动之后一直进不去,原来是Mongodb的服务启动不了。这个时候就要删除掉原来的服务。sc delete MongoDB重新创建MongoDB服务:mongod --logpath d:/mongodb/log/mongodb.log --logappend --dbpath d:/mongodb/data/db -

2020-05-28 12:23:11 187

原创 项目架构规范:阿里规约,MVC架构以及三层架构(三)

封装是面向对象的的第一大特性,属性私有化,根据提供的setter和getter方法来访问属性,隐藏具体属性和实现细节。@Datapublic class UserInfoDomain { private String name; private String IDCard;}行为变成简单的setter/getter方法了,一个UserInfo其实有很多行为,例如:新增、手机号是否黑名单、IDCard是否合法等,但是这些行为代码就写满了service方法。领域模型定义为【结..

2020-05-28 10:06:36 611

原创 项目架构规范:阿里规约,MVC架构以及三层架构(二)

在实际开发中,经常会有Request/Response和Domain之间的互转,会觉得毫无意义或太繁琐,出现这种想法的主要原因是:Request和Domain 之间的属性是一摸一样,一个Object Copy代码搞定。ProductUpdateDomain productUpateDomain= new ProductUpdateDomain();productUpateDomain.setName(request.getName());productUpateDomain.setSliders.

2020-05-27 12:39:26 451

原创 项目架构规范:阿里规约,MVC架构以及三层架构(一)

学习大纲 1. 三层职责 2. 引入领域驱动设计 3. 何为限界上下文 4. 何为领域 5. 领域分层 6. 实体和值对象 7. Service 8. 生命周期之聚合 9. 生命周期之Factory 10. 生命周期之Repository 11. 命名规范设计 12. 贫血模型 13. 领域服务 一、MVC模式 用一种业务逻辑、数据、界面显示分离的方式 View。负责与页面的交互,现实数据的输入和输出 Model。主要负责处理业务逻

2020-05-26 10:10:46 1597

转载 Java8 的parallelStream 修改默认多线程数量

parallelStream默认使用了fork-join框架,其默认线程数是CPU核心数。通过测试实践,发现有两种方法来修改默认的多线程数量:1、全局设置在运行代码之前,加入如下代码:System.setProperty("java.util.concurrent.ForkJoinPool.common.parallelism", "20");2、代码块内部设置ForkJoinPool forkJoinPool1 = new ForkJoinPool(20);ForkJoinT

2020-05-22 19:37:53 4022

原创 Mybastic自动生成Mapper,Xml,Pojo。

Mybastic自动生成Mapper,Xml,Pojo。

2020-05-22 17:14:26 333

原创 FastDFS分布式文件系统实践

很多互联网公司都在实践敏捷开发的理念,更倾向于应用轻量级高性能高可靠的开源系统,比如FastDFS。FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服

2020-05-21 13:29:01 321 1

转载 Intellij idea常用快捷键

1.调整idea快捷键shift + ctrl + 左右:使用快捷键键调整窗口左右大小 shift + ctrl + 上下:使用快捷键键调整窗口上下大小 shift + ctrl + 引号 :最大化或者最小化窗口 shift + ctrl + a :查找需要的选项2.代码编类辑快捷键 shift + enter : 向下插入一行 ctrl + alt + enter : 向下插入一行 ctrl + y : 删除一行 ctrl + g :定位到某一行

2020-05-20 15:42:19 250

原创 BeanUtils工具类,基于Spring框架。

BeanUtils工具类用于高效地复制对象,使用到cglib的BeanCopier。import org.springframework.cglib.beans.BeanCopier;import org.springframework.util.CollectionUtils;import java.util.LinkedList;import java.util.List;import java.util.Map;import java.util.Objects;import jav

2020-05-19 14:33:00 993

原创 RestTemplateUtils工具类,基于Spring框架。

对Spring的RestTemplate进行封装,用来执行Http请求。package com.ligeit.business;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.Ht.

2020-05-19 13:09:36 1165 2

原创 NumberValidationUitl数字验证工具类

package com.ligeit.business;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * @author Johny * @version 1.0 * */public class NumberValidationUtil { /** * integer (-MAX, MAX) */ public final static String REGEX_INTEGER = .

2020-05-19 09:42:26 151

原创 RedisUtil工具类,基于Spring框架。

使用Gradle项目自构建工具,需要在依赖dependencies加入implementation 'org.springframework.boot:spring-boot-starter-data-redis'package com.ligeit.business;import com.google.common.collect.Lists;//import lombok.extern.slf4j.Slf4j;import org.springframework.beans.facto

2020-05-18 17:57:09 771

转载 Spring的工具类ObjectUtils、BeanUtils、StringUtils

由于开发过程中经常用到这三个工具类,这里整理了一个简约版的api,以供后面开发时用.上传的地址:https://download.csdn.net/download/sun_of_rainy/11453536文档目录缩影:

2020-05-18 17:23:23 1326

转载 Spring data mongodb实现嵌套查询,并指定返回子集内容

mongo格式:{ "_id" : "1", "userId" : "2", "bookId" : "1", "historyList" : [ { "_id" : "1", "hh" : "1" }, { "_id" : "2", "hh" : "2" }, { "...

2020-05-15 17:58:09 1376

转载 java.lang.UnsupportedOperationException解决方法【转】

转自https://blog.csdn.net/Tracycater/article/details/77592472?locationNum=2&amp;fps=1做开发一定要注重细节。在项目中对List进行操作时报错java.lang.UnsupportedOperationException,后来发现操作的List是由数组转换而成的,通过看源码发现问题,并写测试程序如下。 代码块:...

2018-09-14 16:51:46 250628 28

原创 Java8与游戏开发(七)

游戏系统会有大量的配置信息,包括从数据库中读取的配置,还有从各种文件中读取的配置,都伴随着抛出NullPointerException的可能,如果能够减少空指针,系统会更加稳定。Java8的Optional能够很好地表示可选数据,但是对于错误导致的数据缺失,无法提供有用的信息,如果仅仅使用Exception来表示错误,又会失去了使用Optional的所有好处。一个可行的方案,就是定义三种对...

2018-07-25 14:15:40 396 1

原创 Java8与游戏开发(六)

游戏系统会有大量的配置信息,包括从数据库中读取的配置,还有从各种文件中读取的配置,都伴随着抛出NullPointerException的可能,如果能够减少空指针,系统会更加稳定。Java8引入了Optional来处理可选数据,把一个有可能缺失的数据放入到一个容器里面,作为Null引用的替代品。一、能够尽快地检测出错误,方便查找原因。//Java8的Optional源码private...

2018-07-25 14:12:05 769

原创 Java8与游戏开发(五)

游戏开发很重要的一点就是系统的并发性能,体现在单位时间内处理的请求数,还有同时连接的最大用户数。基于Java语言实现的Netty不仅并发性能极高,内存的gc效率高,使得它成为Java游戏服务器的首选。Java7之前的java.util.concurrent包就有了Executors线程池,ConcurrentHashMap、ConcurrentSkipListMap等线程安全又高效的数据结...

2018-07-20 21:57:05 9201 1

原创 Java8与游戏开发(四)

要让游戏开发的过程更加Effective,必须遵从一些原则,其实就是平时的开发经验总结出来。一、优先使用工厂模式来创建对象。对于那些可选字段很多的对象,优先使用builder模式。二、谨慎地使用单例模式,Java可以用Enum实现单例模式。三、谨慎地使用缓存。大数据量的缓存,有三种方式避免内存的过度使用: WeakHashMap,更加复杂的缓存,可以用java.lang.re...

2018-07-12 22:08:46 387

原创 Java8与游戏开发(三)

游戏开发中,通常使用"n段式"代表道具和货币,也经常要把字符串转成Uniparam对象。系统一定会频繁地生成UniParam对象,所以加入了WeakHashMap作为缓存,还对比了一下性能的差异。/** * 统一变参参数配置格式 *  * 定义ID : 参数1 &amp; 参数2 &amp; 参数3 &amp; ... *  * 定义ID : [10,20] &amp; [测试...

2018-07-12 22:07:00 482

tbl-demo-service-master.zip

此项目为应用领域驱动开发DDD的分层架构的DEMO项目,仅供参考。 领域模型的职责是实现业务逻辑,如果领域模型只是用来处理简单的逻辑(比如贫血模型),那么领域模型的作用微乎其微,甚至可以忽略,数据转换的成本比领域模型带来的好处还多,这种情况其实就是在原有的分层架构中多加了一层,增加了项目的复杂性和工作量。 “领域驱动开发DDD”只有被正确地运用,才能发挥出最大的价值。

2020-08-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除