自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Ydoing的专栏

想认识志同道合朋友,请加微信号: csuxajy

原创 思考复杂的系统

2020-02-05 09:41:29 80

原创 系统思维

系统与涌现系统系统 = 实体 + 关系 + 功能系统是由一组实体和这些实体之间的关系所构成的集合,其功能要大于这些实体各自功能之和。架构定义为“对系统中的实体及实体之间的关系所进行的抽象描述”涌现实体之间的交互会导致涌现物。涌现指的是系统在在运作时所表现,呈现或者浮现的东西。涌现 = 功能 + 性能 + 意外 + …系统思维的任务确定系统的形式与功能系统同时具备形式...

2020-01-31 10:43:40 58

原创 软件中组件拆合原则

三个拆合的指导原则:REP(复用/发布等同原则),CCP(共同闭包原则)和CRP(共同复用原则)。组件聚合原则张力图REP(复用/发布等同原则):软件复用的最小粒度应该等同于其发布的最小粒度(注:只有那些通过版本追踪系统发布的组件才能被高效地复用)CCP(共同闭包原则):将同时修改,目的相同的类放到同一个组件;不会同时修改,目的不同的类放到不同的组件CRP(共同复用原则):不要强迫一个...

2020-01-17 15:39:48 119

原创 浅谈软件设计原则

通用原则OCP(开闭原则)架构设计的主导原则。设计良好的软件应该易于扩展,同时抗拒修改。这是我们进行架构设计的主导原则,其他的原则都为这条原则服务。USB接口满足OCP原则,各个厂商可以扩展接口实现,但是不能修改接口定义正交性设计“正交性”是从几何学中借来的术语。如果两条直线相交成直角,它们就是正交的,比如图中的坐标轴。用向量术语说,这两条直线互不依赖。沿着某一条直线移动,你投影到...

2020-01-17 11:53:04 162

原创 关于中台化一些思考

有个同事问了我一个架构问题,大概是这样的:组装某业务的VO的对象逻辑放到哪层,感觉放到service层好像不太合适。我感觉问的非常好,这种问题非常典型,值得分享一下。目前来说,我们在前台层(Controller)直接调用一个下层大的service,一杠子捅到底,各种领域层的逻辑都放到这个service里面。造成各种领域层依赖耦合严重,领域层的服务不好重用。这里有必要抽象出中间一层,它可能是中台层,...

2019-12-22 21:56:27 424

原创 写好设计文档

写好设计文档怎样算一个好的设计文档文档意图清晰,描述逻辑有序动静结合,既有静态模型又有动态模型注重分析生产活动的生命周期列出能力矩阵善于发现概念,将捕捉到的概念显示化,建立领域模型划清边界,构建层次有不同的视图,一图胜千言。比如有用例图,领域模型图,活动图,时序图,状态图,业务流程图,业务架构图,应用架构图,技术架构图等等。静态建模用例收集用例是设计文档后续所有环节的输入...

2019-12-22 20:40:15 85

原创 系统中台能力思考和探索

系统中台能力思考和探索中台思想中台特点数据模型统一;业务隔离;可扩展:引擎化,参数化,配置化,流程化可视化:能力地图,业务全景图;由1到4,实现越来遇难,其中3是实现关键。中台实现...

2019-09-08 19:49:07 212

原创 Elasticsearch源码编译

下载源码https://github.com/elastic/elasticsearch, github下载源码,分支切换到5.5,用ieda打开,等待漫长的编译过程下载安装包直接编译的源码不能直接使用,需要依赖安装包一些插件等,下载5.5.3安装包,下载地址 https://www.elastic.co/downloads/past-releases , 解压放到/opt/search/e...

2018-09-19 17:22:44 641

原创 可供参考的互联网电商订单中心设计

最近在做订单中心领域模型设计,虽然还不完善,这里分享出来,希望能给大家提供一个思路。有不懂的,请多多交流,谢谢啦!

2018-06-09 09:56:33 4962

原创 分布式事务一些思考和总结

最近在做交易订单的事情,随着系统越来越复杂,交易量越来越大,出现不一致的情况也频发。不禁引人思考,这里做一些总结记录。分布式事务有一些理论,最常听的是CAP,ACID等。这里就不做介绍了,大家自己去查资料看看。分布式事务也经常提到2PC,3PC,因为不太适用互联网场景,这里也不做介绍。下面我们来看看一个电商典型的场景,下单后发送消息给其他业务系统,很多同学喜欢这样做 @Trans...

2018-03-23 10:56:19 399

原创 mybatis线上问题查找

线上反映查不到数据,根据业务逻辑把sql找出来执行,实际是有数据的。不知道什么原因,记录一下查找问题过程。greys查找问题 greys对查找线上问题还是挺有帮助的,地址https://github.com/oldmanpushcart/greys-anatomy进入greys首先通过jps查到Java进程ID sudo jps -l 切换到jetty账号,执行greys脚本进入 s

2017-10-30 20:56:00 486

原创 RocketMQ有序消息研究

在订阅消息的时候,有时我们希望消息能按照一定业务顺序消费,比如一个订单创建,订单修改,订单完成。这时候是需要顺序消息。RocketMQ支持顺序消费,下面来研究一下实现逻辑。样例生产者public class OrderedProducer { public static void main(String[] args) throws Exception { //Instant

2017-10-28 19:19:41 3461

原创 一次JVM调优实战

早上查看低峰期gc情况,发现昨晚上fgc有274次,感觉有些不正常,开始查找原因[jump@order-binlog-data002 spring-boot]$ sudo jstat -gc 20028 4000 10 S0C S1C S0U S1U EC EU OC OU MC MU CCSC C

2017-07-17 19:15:32 1405

原创 ThreadPoolExecutor源码剖析的一些思考和总结

最近迁移一个项目,涉及到线程池的问题。特意看了一下ThreadPoolExecutor源码,记录一下。思考几个问题ThreadPoolExecutor的基本实现思路是什么? - 在线程池正在运行(running)的状态下,提交任务到线程池以后,如果线程数量小于corePoolSiez,则创建新的工作线程加入workers中,并启动该线程;如果大于等于corePoolSiez,则加入任务队列中,等待

2017-06-05 17:54:33 706

原创 从dubbo看Netty使用

Netty是个高性能的Java网络传输框架,在很多中间件或者分布式框架中几乎都能看到它的身影。既然Netty这么受欢迎,那到底怎么把netty嵌入到我们的系统中了?笔者在几年前就接触了Netty,也开发了个小项目。一直问题困扰自己,Netty使用场景是什么?怎么使用Netty?我们可以从dubbo中找到些答案。dubbo是高性能轻量级的RPC框架。netty本质的功能负责网络传输,dubbo使用ne

2017-05-11 09:32:37 20665 3

原创 关于分库分表的实现

当数据大的时候,都会考虑分库分表的实现。分库分表可以在不同的层做。一般来说有以下几种:jdbc层:实现复杂,属于轻量级,对应用基本没有侵入性;缺点是不能复用数据库连接,在应用部署多的时候资源耗费大,不适于大规模部署。类似当当网的sharding-jdbc.ORM层:比如蘑菇街TSharding框架封装mybatis,实现简单。缺点是必须依赖ORM层,侵入性比较大。DBProxy层:如cobar

2017-03-10 15:14:16 3518

原创 Java中sleep和wait有什么区别?

sleep和wait有什么区别?大家都说是sleep不会释放锁,wait会释放锁。一直都不是很理解。最近在看AQS代码,才找到一些蛛丝马迹。AQS的await和wait实现思想类似,释放当前占有的锁,让其他线程继续获取锁。等适合机会唤醒后再重新占有锁。await方法有fullyRelease的方法 1.先将线程插入等待队列; 2.释放当前的占有的资源,即释放锁; 3.让当前线程停止,等待唤醒;

2017-03-05 16:08:41 971

原创 从ReentrantLock去分析AbstractQueuedSynchronizer

在并发中,锁是一个重要的工具,能帮助程序处理好数据并发处理不一致的问题,而AbstractQueuedSynchronizer在其中扮演中重要的角色。在设计所锁的时候,应该思考怎么锁能解决什么问题,而这个问题本质是由于什么原因引起。并发问题说到底是由于资源共享竞争使用引起的。锁就是为了防止资源不合理竞争使用导致的并发问题。AQS简介AbstractQueuedSynchronizer简称AQS,是J

2017-03-04 18:06:06 421

原创 Spring中@Transactional什么时候开启事务?

在使用注解事务的情况时,Spring会把每个方法的执行封装为AOP执行过程。每次执行被事务注解方法时,会判断是否有必要创建事务。如果创建事务成功,则继续调用业务逻辑方法。事务是在方法执行最开始阶段创建的,因此方法要越小越好。事务的执行入口是TransactionInterceptor的invoke方法 @Override public Object invoke(final Metho

2017-03-01 21:45:39 8450

原创 JVM的Perm区持续增长导致OOM问题记录

查找问题先用jstack看看线程栈是否正常,确认正常后用jmap查看(因为线上用的OpenJDK,需要安装debuginfo包)堆中快照情况。jmap一些命令可能会造成JAVA进程挂起,特别是jmap -permstat会造成STW,程序无法响应。建议使用jmap命令应该与线上环境隔离才能用。使用jmap -permstat发现大量dead状态的class对象,其中class为groovy/lang

2017-02-05 17:33:48 3437

原创 这些年读过有关计算机的书

快过年了,正在整理买的书,发现一大堆,还有些成就感,故总结记录一下。Java后端Java编程思想这本书是大学的教科书,买的是盗版的,现在工作了,就买了本正版的。总的来说,这本书在Java领域名气大,但我读起来有些费劲,一个是排版的问题,一个是作者的文笔的问题。作者用了很多源码例子讲述Java语法,并没有归纳总结,读起来真累。怪不得当初在大学的时候有些排斥Java,也有这本书的原因。Java核心技术该

2017-01-23 20:56:57 649

原创 Spring AOP自定义实现

上一遍文章研究了Spring AOP实现源码,现在自己也想自己实现。假如要对以下接口BarService织入Before增强和After增强接口定义public interface BarService { void doSomething();}接口实现@Servicepublic class BarServiceImp implements BarService { @Ove

2017-01-02 10:44:07 2107

原创 Spring AOP源码研究笔记

实现思路通过BeanPostProcessor的postProcessAfterInitialization方法,对初始化后的Bean创建代理。InstantiationModelAwarePointcutAdvisorImpl是Advisor的默认封装。MethodBeforeAdviceInterceptor是Before的默认实现。关键源码解析AbstractAutoProxyCreator类

2016-12-31 16:28:44 1006

原创 AOP的实现的几种方式

静态AOP 在编译期,切面直接以字节 码的形式编译到目标字节 码文件中。AspectJ属于静态AOP,是在编译时进行增强,会在编译的时候将AOP逻辑织入到代码中,需要专有的编译器和织入器。优点:被织入的类性能不受影响。缺点:不够灵活动态AOPJDK动态代理 在运行期,目标类加载后,为接口动态生成代理类,将切面植入到代理类中。Java从1.3引入动态代理。实现原理是为被代理的业务接口

2016-12-04 16:57:33 11140

原创 初识Spring Batch

概念Spring Batch是一个优秀的离线批处理框架。可以批量处理的数据格式可以是文本文件、xml文件以及持久化的数据。当然Spring Batch还提供了丰富的接口可以扩展,处理不同格式的数据。处理规模为中小型(对于海量的数据可以考虑Hadoop)。使用场景可以考虑账单对账,数据迁移,定时批量更新数据等等。 层次架构如上图。分三层:应用层,核心层,基础设施层。应用层包括所有的batch作业和

2016-12-02 11:52:19 676

原创 Spring中Bean的生成过程

Spring是个Bean大工厂,负责Bean的创建和注入。核心接口BeanFactory是Spring最核心接口,它是Bean的容器,所有Bean的创建和注入几乎都与它有关。很多后缀是“Context”的类都继承或扩展了它,比如ClassPathXmlApplicationContext。最核心的方法是getBean,当然getBean有很多种重载形式,这里不一一列出。public interfac

2016-11-02 15:31:00 7165 3

原创 关于ThreadLocal内存泄漏引起的思考

概述最近在对一个项目进行重构,用到了ThreadLocal。场景如下:外围系统会调用接口上传数据,在接口中要记录数据的变化Id,在上传数据完后需要集中在一个地方把这些Id以消息形式发送出去。使用场景样例代码 public Result<Void> uploadOrder(TotalPayInfoVo totalPayInfoVo) { try { sav

2016-11-01 19:59:17 3042

原创 MapperScannerConfigurer在mybatis-spring的妙用

概述在mybatis中我们经常这样定义OrderInfoMapper这样的接口,然后配置OrderInfoMapper.xml映射到OrderInfoMapper,就可以直接注入OrderInfoMapperpublic interface OrderInfoMapper { int insert(Order order);}定义一个SQL操作<insert id="insert" param

2016-09-14 17:40:41 11960

原创 Spring事务源码分析

事务属性定义接口TransactionDefinition是事务属性定义接口,保存事务定义的各种属性,如超时时间、隔离级别、传播属性等。public interface TransactionDefinition { //获取事务传播类型 int getPropagationBehavior(); //获取事务隔离级别 int getIsolationLevel();

2016-09-13 21:58:28 945

原创 Redis统计某个时间段订单数量(用Guava缓存辅助解决)

简介公司有这么个需求,需用统计店铺某个时间段(按自然天计算,不超过24小时)类的订单数量。因为这些统计数据不用持久化,考虑到性能问题,准备用Redis做统计。 - 设计思路:用Reids的一个有序集合实现。店铺Id作为有序集合key,订单ID作为有序集合member,插入到Redis时间戳作为有序集合的score。增加的时候用zadd(cacheKey, System.currentTimeMil

2016-08-31 15:07:19 6322 2

原创 Redis在集群环境中生成唯一ID

概述设计目标:每秒最大生成10万个ID,ID单调递增且唯一。Reidis可以不需要持久化ID。 要求:集群时钟不能倒退。 总体思路:集群中每个节点预生成生成ID;然后与redis的已经存在的ID做比较。如果大于,则取节点生成的ID;小于的话,取Redis中最大ID自增。Java代码import org.apache.commons.lang3.RandomStringUtils;import

2016-08-28 21:38:22 20166 3

原创 面向对象设计原则

最近在重构老系统的代码,感觉有些疑惑,故重新看了《敏捷开发软件开发:原则、模式和实践》,记录一下。 面向对象设计要遵守下面几个原则:类单一职责原则(SPR)每个类承担的职责应该单一,实现高内聚。如果这个类承担太多,那么它变动的可能性很大,因为有太多原因导致这个类变化。就一个类而言,应该仅有一个引起它变化的原因。任何在设计类的时候,都需要考虑到这个类的职责,即这个类的边界。这提示我们,在设计系统或者

2016-08-21 07:52:40 402

原创 聊聊JVM常用参数设置

整体考虑堆大小-Xms3550m, 初始化堆大小。通常情况和-Xmx大小设置一样,避免虚拟机频繁自动计算后调整堆大小。 -Xmx3550m,最大堆大小。考虑分代设置堆大小首先通过jstat等工具查看应用程序正常情况下需要堆大小,再根据实际情况设置。新生代-xmn2g,新生代大小。Sun官方推荐配置为整个堆的3/8。 -XX:SurvivorRatio=8。Eden和Survivor的比值。老年代

2016-07-30 10:46:28 6076

转载 Mac OSX 10.10 Yosemite编译OpenJDK 8

编译时间:2016-04-03系统版本:Mac OS X Yosemite 10.10.2编译OpenJDK版本:JDK8相关软件版本:            •          XCode版本:Version 5.1.1 (5B1008)            •          JDK版本:1.8.0_51            •          软件管理工具:

2016-07-27 15:59:21 3227

转载 Mac编译OpenJDK7(8)和Eclipse调试Hotspot

一、前言Java是我主要的生产语言,但对JVM不是很了解,最近也在看《深入理解Java虚拟机 第二版》,所以想亲手编译OpenJDK和调试HotSpot虚拟机系统是15年的Mac OS X(10.11.5),而OpenJDK7却是13的,完全按照书本来,肯定是编译不过的,本文记录了在这个痛苦过程中遇到的坑,希望对其他人能有所帮助OpenJDK8使用configure && make

2016-07-27 14:50:03 3219 3

原创 dubbo间歇性超时问题解决

之前dubbo每隔十分钟左右会出现以下超时情况Caused by: com.alibaba.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2016-07-20 16:27:34.873, end time: 2016-07-20 16:27:39.895

2016-07-21 17:00:53 26192 6

原创 SOA研究-用zookeeper实现服务的注册和发现

注册中心一般具有以下功能:注册服务订阅服务失败重新注册和订阅本地缓存服务信息列表大体过程如下:1.服务提供者暴露服务后向注册中心注册,如果多个注册中心的话,需要分别注册到多个注册中心;注册信息包含自己主机名,端口号,服务名,其他额外参数等。本地一般用map缓存已经注册的服务,当然也可以用文件保存到本地,当网络抖动等原因重新恢复连接Zookeeper的时候,需要从缓存取出来重新注册。2.

2016-07-18 19:47:11 5606 1

原创 SOA如何设计传输模块(二)-Netty的实现

上一遍介绍了设计传输模时接口的定义(http://blog.csdn.net/csujiangyu/article/details/51761479)这里用了主流的框架netty来实现。首先设计NettyServer,主要功能是绑定端口,监听连接。public class NettyServer extends AbstractServer { private ServerBootstrap

2016-06-26 10:06:42 1029

原创 SOA如何设计传输模块(一)-接口的设计

SOA都离不开网络,现在的框架都集成了自己网络传输模块。但如果要自己写框架的时候,就需要思考如何设计了?出于这种好奇,尝试一下自己设计。首先要考虑远端传输需要满足什么,一般有哪些抽象实体,一般传输过程是怎么样的。既然面向对象思想是面向接口编程。又需要设计怎么样的接口来满足日后的扩展。这些都是我们需要思考的问题。基于性能考虑,都用NIO网络编程。一般都有Channel,所以还需要设计Channel接口

2016-06-26 09:39:12 1391

原创 Java优化考虑构建器创建对象

最近在做项目的时候,需要新建一个对象叫CartMessage。CartMessage只作为方法参数,如果要构建一个CartMessage,没有重构之前的做法是类似这样的:CartMessage msg = new CartMessage();msg.setA();msg.setB();msg.setC();...helpCartService.sendMsgToWebSocket(msg)

2016-06-06 11:29:32 617

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