荔枝岛岛主
LV.2
这个用户很懒,还没有个人简介
声望 126
关注 0
粉丝 0
私信
主帖 25
回帖
视频
提问
回答
资源
专栏
大家好,我是三友这篇文章我准备来聊一聊如何去阅读开源项目的源码。在聊如何去阅读源码之前,先来简单说一下为什么要去阅读源码,大致可分为以下几点原因:最直接的原因,就是面试需要,面试喜欢问源码,读完源码才可以跟面试官battle提升自己的编程水平,学习编程思想和和代码技巧熟悉技术实现细节,提高设计能力...那么到底该如何去阅读源码呢?这里我总结了18条心法,助你修炼神功学好JDK身为一个Javaer,不论要不要阅读开...
2023-03-06 16:30:21 304浏览 0点赞 0回复 0收藏
大家好,我是三友这篇文章我准备来扒一扒Bean注入到Spring的那些姿势。其实关于Bean注入Spring容器的方式网上也有很多相关文章,但是很多文章可能会存在以下常见的问题注入方式总结的不全没有分析可以使用这些注入方式背后的原因没有这些注入方式在源码中的应用示例...所以本文就带着解决上述的问题的目的来重新梳理一下Bean注入到Spring的那些姿势。配置文件配置文件的方式就是以外部化的配置方式来声明SpringBean,在Spring容...
2023-03-06 16:29:14 135浏览 0点赞 0回复 0收藏
大家好,我是三友这篇文章我准备来聊一聊RocketMQ消息的一生。不知你是否跟我一样,在使用RocketMQ的时候也有很多的疑惑:消息是如何发送的,队列是如何选择的?消息是如何存储的,是如何保证读写的高性能?RocketMQ是如何实现消息的快速查找的?RocketMQ是如何实现高可用的?消息是在什么时候会被清除?...本文就通过探讨上述问题来探秘消息在RocketMQ中短暂而又精彩的一生。如果你还没用过RocketMQ,可以看一下这篇文章​​Ro...
2023-03-06 16:27:53 145浏览 0点赞 0回复 0收藏
大家好,我是三友背景随着微服务盛行,很多公司都把系统按照业务边界拆成了很多微服务,在排错查日志的时候,因为业务链路贯穿着很多微服务节点,导致定位某个请求的日志以及上下游业务的日志会变得有些困难。这时候可能有的小伙伴就会想到使用SkyWalking,Pinpoint等分布式追踪系统来解决,并且这些系统通常都是无侵入性的,同时也会提供相对友好的管理界面来进行链路Span的查询,但是搭建分布式追踪系统还是需要一定的成本的...
2023-03-06 16:27:01 156浏览 0点赞 0回复 0收藏
大家好,我是三友不知道大家有没有经历过维护一个已经离职的人的代码的痛苦,一个方法写老长,还有很多的ifelse,根本无法阅读,更不知道代码背后的含义,最重要的是没有人可以问,此时只能心里默默地问候这个留坑的兄弟。。其实造成这些原因的很大一部分原因是由于代码规范的问题,如果写的规范,注释好,其实很多问题也就解决了。所以本文我就从代码的编写规范,格式的优化,设计原则和一些常见的代码优化的技巧等方面总结了...
2023-03-06 16:25:31 174浏览 0点赞 0回复 0收藏
责任链模式在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,由该链上的某一个对象或者某几个对象决定处理此请求,每个对象在整个处理过程中值扮演一个小小的角色。举个例子,现在有个请假的审批流程,根据请假的人的级别审批到的领导不同,比如有有组长、主管、HR、分管经理等等。先需要定义一个处理抽象类,抽象类有个下一个处理对象的引用,提供了抽象处理方法,还有一个对下...
2023-03-02 15:33:56 146浏览 0点赞 0回复 0收藏
大家好,我是三友之前有小伙伴私信我说看源码的时候感觉源码很难,不知道该怎么看,其实这有部分原因是因为没有弄懂一些源码实现的套路,也就是设计模式,所以本文我就总结了9种在源码中非常常见的设计模式,并列举了很多源码的实现例子,希望对你看源码和日常工作中有所帮助。单例模式单例模式是指一个类在一个进程中只有一个实例对象(但也不一定,比如Spring中的Bean的单例是指在一个容器中是单例的)单例模式创建分为饿汉式...
2023-03-02 15:31:47 140浏览 0点赞 0回复 0收藏
大家好,我是三友最近突然心血来潮(就是闲的)就想着撸一个简单的配置中心,顺便也照葫芦画瓢给整合到SpringCloud。本文大纲配置中心的概述随着历史的车轮不断的前进,技术不断的进步,单体架构的系统都逐渐转向微服务架构。虽然微服务架构有诸多优点,但是随着越来越多的服务实例的数量,配置的不断增多,传统的配置文件方式不能再继续适用业务的发展,所以急需一种可以统一管理配置文件应用,在此之下配置中心就诞生了。所以...
2023-03-02 15:29:44 149浏览 0点赞 0回复 0收藏
大家好,我是三友在对于读写锁的认识当中,我们都认为读时加读锁,写时加写锁来保证读写和写写互斥,从而达到读写安全的目的。但是就在我翻Eureka源码的时候,发现Eureka在使用读写锁时竟然是在读时加写锁,写时加读锁,这波操作属实震惊到了我,于是我就花了点时间研究了一下Eureka的这波操作。Eureka服务注册实现类众所周知,Eureka作为一个服务注册中心,肯定会涉及到服务实例的注册和发现,从而肯定会有服务实例写操作和读...
2023-03-02 15:28:29 176浏览 0点赞 0回复 0收藏
大家好,我是三友上周花了一点时间从头到尾、从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家。前言RocketMQ是阿里巴巴旗下一款开源的MQ框架,经历过双十一考验、Java编程语言实现,有非常好完整生态系统。RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等,总之就是葛大爷的一句话整篇文章可以大致分为三个部分,第一部分...
2023-03-02 15:27:31 134浏览 0点赞 0回复 0收藏
大家好,我是三友,我又来了最近仍然畅游在RocketMQ的源码中,这几天刚好翻到了消费者的源码,发现RocketMQ的对于push消费方式的实现简直太聪明了,所以趁着我脑子里还有点印象的时候,赶紧来写一篇文章,来掰扯一下,防止过两天就忘得一干二净了。MQ消费方式消费方式就是指消费者如何从MQ中获取到消息,分为两种方式,push(推方式)和pull(拉方式)。1、push(推方式)push,顾名思义,就是推的意思。就是当MQ收到生产者产生...
2023-03-02 15:25:54 154浏览 0点赞 0回复 0收藏
SpringEvent事件Event事件可以说是一种观察者模式的实现,主要是用来解耦合的。当发生了某件事,只要发布一个事件,对这个事件的监听者(观察者)就可以对事件进行响应或者处理。举个例子来说,假设发生了火灾,可能需要打119、救人,那么就可以基于事件的模型来实现,只需要打119、救人监听火灾的发生就行了,当发生了火灾,通知这些打119、救人去触发相应的逻辑操作。什么是SpringEvent事件那么是什么是SpringEvent事件,就是...
2023-03-02 15:25:18 230浏览 0点赞 0回复 0收藏
大家好,我是三友。Spring对于每个Java后端程序员来说肯定不陌生,日常开发和面试必备的。本文就来盘点SpringSpringBoot常见的扩展点,同时也来看看常见的开源框架是如何基于这些扩展点跟SpringSpringBoot整合的。话不多说,直接进入正题。FactoryBean提起FactoryBean,就有一道“著名”的面试题“说一说FactoryBean和BeanFactory的区别”。其实这两者除了名字有点像,没有半毛钱关系。。BeanFactory是Bean的工厂,可以帮我们生...
2023-03-02 15:18:02 149浏览 0点赞 0回复 0收藏
大家好,我是三友。背景前段时间,一个同事小姐姐跟我说她的项目起不来了,让我帮忙看一下,本着助人为乐的精神,这个忙肯定要去帮。于是,我在她的控制台发现了如下的异常信息:Exceptioninthread"main"org.springframework.beans.factory.BeanCurrentlyInCreationException:Errorcreatingbeanwithname'AService':Beanwithname'AService'hasbeeninjectedintootherbeans[BService]initsrawversionaspartofacircularreference,bu...
2023-03-02 15:17:13 132浏览 0点赞 0回复 0收藏
大家好,我是三友。最近一直畅游在RocketMQ的源码中,发现在RocketMQ中很多地方都使用到了CompletableFuture,所以今天就跟大家来聊一聊JDK1.8提供的异步神器CompletableFuture,并且最后会结合RocketMQ源码分析一下CompletableFuture的使用。Future接口以及它的局限性我们都知道,Java中创建线程的方式主要有两种方式,继承Thread或者实现Runnable接口。但是这两种都是有一个共同的缺点,那就是都无法获取到线程执行的结果,也...
2023-03-02 15:15:31 107浏览 0点赞 0回复 0收藏
背景介绍Cobar简介Cobar是阿里开源的一款数据库中间件产品。在业务高速增长的情况下,数据库往往成为整个业务系统的瓶颈,数据库中间件的出现就是为了解决数据库瓶颈而产生的一种中间层产品。在软件工程中,没有什么问题是加一层中间层解决不了的,如果有,再加一层。一款proxy类型(本文不讨论clientSDK类型的数据库中间件)的数据库中间件具备以下能力:支持数据库的透明代理,做到用户无感知能够水平、垂直拆分数据库和表,...
2022-10-25 11:46:25 941浏览 0点赞 0回复 0收藏
上周遇到个关于升级dubbo2.6到2.7的兼容性问题,差点造成线上故障,这里记录下,也给大家提个醒。问题回放有一个接口的提供方(dubbo2.6.6)这么配置接口的版本号<dubbo:providerversion"1.0.0">消费方(也是dubbo2.6.6)的reference这么配置<dubbo:referenceid"sampleService"version"1.0.0"check"false"interface"com.newboo.basic.api.SampleService">然后升级​​消费方的dubbo版本​​​,经过一通操作将消费者升级到dubbo...
2022-10-25 11:45:38 765浏览 0点赞 0回复 0收藏
前言在前面文章​​《CobarSQL审计的设计与实现》​​中提了一句关于时间戳获取性能的问题获取操作系统时间,在Java中直接调用​​System.currentTimeMillis();​​就可以,但在Cobar中如果这么获取时间,就会导致性能损耗非常严重(怎么解决?去Cobar的github仓库上看看代码吧)。这个话题展开具体说说,我们在Java中获取时间戳的方法是​​System.currentTimeMillis()​​,返回的是毫秒级的时间戳,查看源码,注释写的比较清...
2022-10-25 11:45:06 681浏览 0点赞 0回复 0收藏
ShutdownHook介绍在java程序中,很容易在进程结束时添加一个钩子,即​​ShutdownHook​​。通常在程序启动时加入以下代码即可Runtime.getRuntime().addShutdownHook(newThread(){Overridepublicvoidrun(){System.out.println("I'mshutdownhook...");}});有了ShutdownHook我们可以在进程结束时做一些善后工作,例如释放占用的资源,保存程序状态等为优雅(平滑)发布提供手段,在程序关闭前摘除流量不少java中间件或框架都使用...
2022-10-25 11:37:40 508浏览 0点赞 0回复 0收藏
背景我在公司内负责​​自研的dubbo注册中心​​​相关工作,群里经常接到业务方反馈dubbo​​接口注销​​​报错。经排查,确定是同一个接口调用了两次注销接口导致,由于我们的注册中心注销接口不能重复调用,调用第二次会因为实例已经注销而报​​实例找不到​​的错误。虽然这个报错仅会打印一条错误日志,不影响业务,但本着followthrough的精神,我决定还是一探究竟,更何况重复注销也增加了应用的结束时间,影响了发布回...
2022-10-25 11:36:45 644浏览 0点赞 0回复 0收藏