自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 徒手撸一个简单的RPC框架(2)——项目改造

徒手撸一个简单的RPC框架(2)——项目改造 在上一篇的徒手撸一个简单的RPC框架中再最后的服务器和客户端连接的时候只是简单的写了Socket连接,觉得有些不妥。正好最近学习了Netty,在平时工作中没机会运用,于是自己就给自己出需求将之前的项目改造一下。 Netty是什么? 在学习Netty之...

2019-06-20 13:40:23 111 0

原创 徒手撸一个简单的RPC框架

徒手撸一个简单的RPC框架 之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的服务就像调用本地方法一样,其中用到的知识有序列化和反序列化、动态代理、网络传输、动态加载、反射这些知识点。发现这些知识都了解一些。所以就想着试试自己实现一个简单的RPC框架...

2019-01-22 13:32:18 32 0

原创 关于加解密、加签验签的那些事

面对MD5、SHA、DES、AES、RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密、私钥解密、私钥加签、公钥验签。这些都什么鬼?或许在你日常工作没有听说过这些名词,但是一旦你要设计一个对外访问的接口,或者安全性要求高的系统,那么必然会接触到这些名词。所以加解密、加签验签对于...

2020-05-12 18:29:02 53 0

原创 只需要这三步,用Java也能图片识别

最近闲来无事研究了一下用Java如何模拟浏览器的行为,在实验登录的步骤时碰到了识别验证码的问题,于是在网上查找了关于Java如何进行图片识别验证码,由于根据网上查找的相关文章都不适合我的配置,所以特开此博客进行记录一下采坑的过程以及解决方法。 做图像识别,可以使用TESSERACT-OCR来实现,...

2020-05-10 17:08:09 110 0

原创 Java中的屠龙之术——如何修改语法树

在Lombok经常用,但是你知道它的原理是什么吗?,和Lombok经常用,但是你知道它的原理是什么吗?(二)两篇文章中介绍了关于Lombok的底层原理,其实总结为一句话来说就是在编译期通过改变抽象语法树而实现的。上面两篇文章已经讲了抽象语法树的相关知识点,如果有不清楚的可以看一下。 本篇涉及到的所...

2020-03-26 15:09:18 66 0

原创 如何快速对接Stripe国际支付系统

Stripe国际支付介绍 Stripe是由20多岁的两兄弟Patrick Collison和John Collison创办的Stripe为公司提供网上支付的解决方案。Stripe向服务的公司收取每笔交易的2.9%加上30美分的手续费。 很多中国卖家想要借用stripe来实现建站收款,Strip...

2020-03-14 16:45:38 244 0

原创 Lombok经常用,但是你知道它的原理是什么吗?(二)

在上一篇Lombok经常用,但是你知道它的原理是什么吗?简单介绍了注解处理器,是用来处理编译期的注解的一个工具,我们只是自己生成了一些代码,但是和Lombok却不一样,因为Lombok是在原有类的基础上增加了一些类,你那么Lombok是如何做到修改原有类的内容呢?接下来我们就再进一步了解Lombo...

2020-03-05 15:01:48 44 0

原创 Lombok经常用,但是你知道它的原理是什么吗?

相信大家在项目中都使用过Lombok,因为能够简化我们许多的代码,但是该有的功能一点也不少。那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情...

2020-02-26 16:43:16 138 0

原创 《沙盘模拟系列》JVM如何调优

纸上得来终觉浅 绝知此事要躬行 我所在的公司基本上是没有机会进行JVM参数调优的,但是如果有些东西自己不亲身经历一下,看再多的理论知识也只能算是纸上谈兵,真正碰到问题的时候还是不知道该怎么分析。所以就自己制造一些问题然后看其现象,利用所学的知识事前推测,看现象是不是和自己推测的一样。这样不仅对自...

2019-12-29 14:09:47 22 0

原创 几百万数据放入内存不会把系统撑爆吗?

在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢?直接说了你不怕把内存给撑爆吗?此核算服务器是单...

2019-12-21 16:49:33 491 4

原创 后端框架开发需要注意的几点

后端框架开发需要注意的几点 笔者文笔功力尚浅,如有不妥,请慷慨指出,必定感激不尽 跌跌撞撞了在程序员的道路上也有一年的时间了,慢慢的觉得这一年的工作大部分时间都是在简单的CRUD中度过,而有时候我们在CRUD中有多少重复性的代码呢?有些代码我们每次写都需要重复性的写一次,不仅浪费时间,而且对于...

2019-09-03 20:49:14 17 0

原创 压缩20M文件从30秒到1秒的优化过程

压缩20M文件从30秒到1秒的优化过程 有一个需求需要将前端传过来的10张照片,然后后端进行处理以后压缩成一个压缩包通过网络流传输出去。之前没有接触过用Java压缩文件的,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片的大小越来越大的时候,耗费的时间也在急剧增加,最...

2019-08-16 11:49:13 26 0

原创 Java8——异步编程

Java8——异步编程 异步编程 所谓异步其实就是实现一个无需等待被调用函数的返回值而让操作继续运行的方法 创建任务并执行任务 无参创建 CompletableFuture<String> noArgsFuture = new CompletableFuture<>(...

2019-08-08 20:57:59 279 0

原创 SpringBoot 2.0 多图片上传加回显

SpringBoot 2.0 多图片上传加回显 这两天公司有需求让做一个商户注册的后台功能,其中需要商户上传多张图片并回显。由于之前没做过这方面的东西,此篇文章用以记录一些知识点,以便后续查看。 上传 Controller的代码非常简单,由于用了SpringMVC框架,所以直接用Multipart...

2019-07-19 17:40:24 53 0

原创 如何自己手写一个热加载

如何自己手写一个热加载 热加载:在不停止程序运行的情况下,对类(对象)的动态替换 Java ClassLoader 简述 Java中的类从被加载到内存中到卸载出内存为止,一共经历了七个阶段:加载、验证、准备、解析、初始化、使用、卸载。 接下来我们重点讲解加载和初始化这两步 加载 在加载的阶段...

2019-07-15 17:54:42 44 0

原创 Mac上最简单明了的利用Docker搭建Redis集群

Mac上最简单明了的利用Docker搭建Redis集群 本文只是记录一下我在Mac上利用Docker搭建Redis集群成功后的步骤,期间走了许多的坑。有许多教程对于Mac用户不友好,搭建成功以后无法进行集群间的通信。 首先说明一下有多简单,如果你机器上已经有了Docker,那么就一个步骤就行。如果...

2019-07-12 16:57:10 117 0

原创 批量测试Mybatis项目中Sql是否正确

去Oracle行动 最近公司要发展海外项目,所以要将现有的系统全部平移过去,另外数据库也要从原来的Oracle变为Mysql。公司的数据库交互层面使用的是Mybatis,而Oracle与Mysql也有一些语法上的不同。所以在项目中的Sql要改动,但是多个项目中涉及到的Sql非常多,如果仅凭人工一条...

2019-07-12 16:56:21 40 0

原创 自定义Docker容器镜像并将其上传到DockerHub中

自定义Docker容器镜像并将其上传到DockerHub中 Docker从2013年发布至今,一直是广受瞩目,所以我们或多或少也应该了解一些Docker的技术原理,而学习一项技术有了兴趣才能更好的让你持续学习下去。如果让你体会到Docker的神奇之处那么兴趣或许会大一点,接下来我们就先从自定义一个...

2019-07-12 16:55:16 33 0

原创 死磕Tomcat系列(6)——Tomcat如何做到热加载和热部署的

死磕Tomcat系列(6)——Tomcat如何做到热加载和热部署的 热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载class,从而升级应用。 通常情况下在开发环境中我们使用的是热加载,因为热加载的实现的方式在Web容器中启动一个后台线程,定期检测相关文件的变化,如果有变化就重...

2019-07-11 18:14:14 73 0

原创 关于Redis热点key的一些思考

关于Redis热点key的一些思考 昨天在和一个已经跳槽的同事聊天时,询问他这段时间面试时碰到的一些问题。自己也想积累一下这方面的知识。其中他说了在面试某赞公司时面试官问他关于热点Key的的解决方案。于是针对这次谈话以及上网查的一些资料后的思考进行一下总结。方便后续自己查阅。 什么是热点Key 其...

2019-07-10 15:42:39 36 0

原创 死磕Tomcat系列(5)——容器

死磕Tomcat系列(5)——容器 回顾 在死磕Tomcat系列(1)——整体架构中我们简单介绍了容器的概念,并且说了在容器中所有子容器的父接口是Container。在死磕Tomcat系列(2)——EndPoint源码解析中,我们知道了连接器将请求过来的数据解析成Tomcat需要的ServletR...

2019-07-08 17:23:23 33 0

原创 死磕Tomcat系列(4)——Tomcat中的类加载器

死磕Tomcat系列(4)——Tomcat中的类加载器 在学习Tomcat中的类加载器,并且Tomcat为什么要实现自己的类加载器打破双亲委派模型原因之前,我们首先需要知道Java中定义的类加载器是什么,双亲委派模型是什么。 Java中的类加载器 类加载器负责在程序运行时将java文件动态加载到...

2019-07-05 15:36:30 47 0

原创 死磕Tomcat系列(3)——Tomcat如何做到一键式启停的

死磕Tomcat系列(3)——Tomcat如何做到一键式启停的 在没有SpringBoot内嵌有Tomcat之前,我们都是将项目打为War包放在Tomcat的webapp目录下面,然后如果是Linux系统,运行命令start.sh、如果是Windows系统,运行命令start.bat以后就能启动起...

2019-06-26 17:14:50 108 0

原创 死磕Tomcat系列(2)——EndPoint源码解析

死磕Tomcat系列(2)——EndPoint源码解析 在上一节中我们描述了Tomcat的整体架构,我们知道了Tomcat分为两个大组件,一个连接器和一个容器。而我们这次要讲的EndPoint的组件就是属于连接器里面的。它是一个通信的端点,就是负责对外实现TCP/IP协议。EndPoint是个接口...

2019-06-25 11:20:34 35 0

原创 工作半年遇到最奇葩的问题

工作半年遇到最奇葩的问题 背景 公司最近买了一套项目,在启动的时候出现了一系列奇怪的问题,对方的技术栈要求是Tomcat7启动,但是由于我们公司出于安全的考虑所以是要求用Tomcat9进行启动的。 问题描述 下面情况都是相同war包相同Tomcat情况下 系统 Tomcat版本 能否启动 ...

2019-06-20 13:42:53 133 0

原创 死磕Tomcat系列(1)——整体架构

死磕Tomcat系列(1)——整体架构 在许多的高端开发的岗位中都会或多或少有要求面试人员要研究过一些常用中间件源码。这是因为一切的秘密都是藏在源码中,阅读源码能够让我们对框架或者中间件的理解更加深刻,而我们也能够在源码的研究中获得其中一些优秀的设计方式。而我们的中间件和源码那么多,我们该从何入手...

2019-06-20 13:42:27 131 0

原创 解决Redis集群条件下键空间通知服务器接收不到消息的问题

解决Redis集群条件下键空间通知服务器接收不到消息的问题 键空间通知介绍 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件。 可以通过对redis的redis.conf文件中配置notify-keyspace-events参数可以指定服务器发...

2019-06-20 13:41:39 434 0

原创 一次奇怪的StackOverflowError问题查找之旅

一次奇怪的StackOverflowError问题查找之旅 公司最近买了一套老代码,在测试环境部署的时候发生了nested exception is java.lang.StackOverflowError的异常,当时看到这个异常首先想到是栈内存溢出,网上给出的解决办法就是加栈内存大小就行。趁着这...

2019-06-20 13:41:14 71 0

原创 徒手撸一个简单的IOC

徒手撸一个简单的IOC Spring框架中最经典的两个就是IOC和AOP,其中IOC(Inversion of Control)是什么呢?控制反转,简单来说就是将控制实体Bean的动作交给了Spring容器进行管理。再简单点来说就是例如之前想用一个类,必须new一个,但是使用了Spring那么直接...

2019-01-25 16:13:12 48 0

原创 Mysql查询带树状结构的信息

Mysql查询带树状结构的信息 在Oracle中有函数应用直接能够查询出树状的树状结构信息,例如有下面树状结构的组织成员架构,那么如果我们想查其中一个节点下的所有节点信息,在Oracle中可以直接用下面的语法可以进行直接查询。 START WITH CONNECT BY PRIOR 但是在M...

2019-01-22 13:33:06 303 0

原创 不学无数——Gson源码解析

Gson 在用Gson解析时传过来的Json串时,如果将其解析为对象A,而这个对象A继承了对象B。这两个对象都有属性名为name的值,那么在进行解析的时候就会报如下错误。 Exception in thread "main" java.lang.IllegalArgumentE...

2018-10-18 09:55:17 65 0

原创 不学无数——适配器模式

适配器模式 智者千虑必有一失,愚者千虑必有一得 在我们开发过程中也会经常碰到一些给原有的系统加一些功能,所以不管前期我们呢可行性、需求分析和系统设计处理的多好,随着时间的推移,总会出一些“意外”。因此我们该如何处理掉这些“意外”呢?聪明的程序员们就想到了许多的补救模式,其中适配器模式就是补救模...

2018-10-12 17:57:17 35 0

原创 不学无数——Mybatis解析判断表达式源码分析

Mybatis解析判断表达式源码分析 在我们开发过程中用Mybatis经常会用到下面的例子 Mapper如下 Map&lt;String ,String &gt; testArray(@Param("array") String [] array); XMl...

2018-10-12 17:56:36 45 0

原创 不学无数——JAVA中NIO再深入

JAVA中NIO再深入 在上一章节的JAVA中的I/O和NIO我们学习了如何使用NIO,接下来再深入了解一下关于NIO的知识。 缓冲器内部的细节 Buffer由数据和可以高效地访问及操作这些数据的四个索引组成。这四个索引是 mark:标记,就像游戏中设置了一个存档一样,可以调用reset()方法...

2018-09-27 17:56:23 59 0

原创 不学无数——Java中IO和NIO

JAVA中的I/O和NIO I/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代,I/O 问题尤其突出,很容易成为一个性能瓶颈。 什么是I/O I/O ? 或者输入/输出 ? 指的...

2018-09-21 17:51:49 31 0

原创 不学无数——Mybatis自动映射器Mapper原理分析

在使用MyBatis时,有时候会想,为什么只写一个接口没有编写任何的实现类,但是就能返回接口的实例,并且调用接口的方法返回数据库中的数据?此时脑海中浮现了写动态代理时候的记忆,记得动态代理也是接管了接口,不需要实际的代理角色。然后经过源码的Debug发现果然是运用了动态代理的技术。如果对于动态代理...

2018-09-21 17:51:05 184 0

原创 不学无数——装饰模式

装饰模式 在开始之前 我们可以用一个简单的例子引出来装饰模式,在小的时候,相信大家都有过这样的经历:小学每年会有好几次的考试,如果有一次成绩非常差,而且考完以后学校会有个很损的招,就是打印出来成绩单,然后让家长签字。那么拿着这个成绩单,肯定是不会直接告诉家长成绩什么的,肯定是会加一些,例如,语文考...

2018-09-18 19:06:57 32 0

原创 不学无数——个人搭建的博客已经好了,欢迎访问

新的博客的地址 http://modouxiansheng.top/,在csdn中也会更新文章,有感兴趣的小伙伴可以进去看看。有什么问题可以随时指出来。

2018-09-17 20:41:19 33 0

原创 不学无数——Spring注入后反射的空指针异常

Spring注入后反射的空指针异常 自动装配是在spring环境下当使用该类的实例时由spring容器完成了类的实例化过程,包括对依赖对象的实例化过程。 而通过反射创建实例时,是根据你调用的构造函数完成的实例化过程,没有容器的自动化创建实例了,所以需要自己对依赖对象进行注入。 所以依赖s...

2018-09-17 20:40:20 632 0

原创 不学无数——记一次常见异常而导致的Debug源码之旅

1. 出现的异常以信息 代码如下: Mapper接口中的代码: List&lt;String&gt; queryTransCdByType(String type); MapperXML中的SQL代码: &lt;select id="queryT...

2018-09-12 16:44:59 44 0

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