- 博客(54)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 徒手撸一个简单的RPC框架(2)——项目改造
徒手撸一个简单的RPC框架(2)——项目改造在上一篇的徒手撸一个简单的RPC框架中再最后的服务器和客户端连接的时候只是简单的写了Socket连接,觉得有些不妥。正好最近学习了Netty,在平时工作中没机会运用,于是自己就给自己出需求将之前的项目改造一下。Netty是什么?在学习Netty之前呢我们首先得了解IO和NIOIO模型IO编程模型简单来说就是上一篇我写的服务端与客户端的连接,...
2019-06-20 13:40:23
249
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 徒手撸一个简单的RPC框架
徒手撸一个简单的RPC框架之前在牛逼哄哄的 RPC 框架,底层到底什么原理得知了RPC(远程过程调用)简单来说就是调用远程的服务就像调用本地方法一样,其中用到的知识有序列化和反序列化、动态代理、网络传输、动态加载、反射这些知识点。发现这些知识都了解一些。所以就想着试试自己实现一个简单的RPC框架,即巩固了基础的知识,也能更加深入的了解RPC原理。当然一个完整的RPC框架包含了许多的功能,例如服务...
2019-01-22 13:32:18
191
原创 关于加解密、加签验签的那些事
面对MD5、SHA、DES、AES、RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密、私钥解密、私钥加签、公钥验签。这些都什么鬼?或许在你日常工作没有听说过这些名词,但是一旦你要设计一个对外访问的接口,或者安全性要求高的系统,那么必然会接触到这些名词。所以加解密、加签验签对于一个合格的程序员来说是必须要掌握的一个概念。那么加解密相关的密码学真的离我们很遥远吗?其实生活中有很多常见的场景其实都用到了密码学的相关知识,我们不要把它想得太难,例如在《睡在我上铺的兄弟》这一段中作弊绕口令中,.
2020-05-12 18:29:02
862
原创 只需要这三步,用Java也能图片识别
最近闲来无事研究了一下用Java如何模拟浏览器的行为,在实验登录的步骤时碰到了识别验证码的问题,于是在网上查找了关于Java如何进行图片识别验证码,由于根据网上查找的相关文章都不适合我的配置,所以特开此博客进行记录一下采坑的过程以及解决方法。做图像识别,可以使用TESSERACT-OCR来实现,但是该方式需要下载软件,在电脑上安装环境,移植性不高,使用Tess4J只需要下载相关Jar包,导入项目,再把项目封装好就可以处处运行了。首先说一下我使用的电脑和JDK版本电脑:MacBookJDK版本:1.
2020-05-10 17:08:09
1352
原创 Java中的屠龙之术——如何修改语法树
在Lombok经常用,但是你知道它的原理是什么吗?,和Lombok经常用,但是你知道它的原理是什么吗?(二)两篇文章中介绍了关于Lombok的底层原理,其实总结为一句话来说就是在编译期通过改变抽象语法树而实现的。上面两篇文章已经讲了抽象语法树的相关知识点,如果有不清楚的可以看一下。本篇涉及到的所有代码都在github上面有本篇涉及到的所有代码都在github上面有本篇涉及到的所有代码都在g...
2020-03-26 15:09:18
1790
4
原创 如何快速对接Stripe国际支付系统
Stripe国际支付介绍Stripe是由20多岁的两兄弟Patrick Collison和John Collison创办的Stripe为公司提供网上支付的解决方案。Stripe向服务的公司收取每笔交易的2.9%加上30美分的手续费。很多中国卖家想要借用stripe来实现建站收款,Stripe现在被称为“移动时代PayPal”。目前服务的客户有大家熟知的facebook、Twitter、Sh...
2020-03-14 16:45:38
3780
3
原创 Lombok经常用,但是你知道它的原理是什么吗?(二)
在上一篇Lombok经常用,但是你知道它的原理是什么吗?简单介绍了注解处理器,是用来处理编译期的注解的一个工具,我们只是自己生成了一些代码,但是和Lombok却不一样,因为Lombok是在原有类的基础上增加了一些类,你那么Lombok是如何做到修改原有类的内容呢?接下来我们就再进一步了解Lombok的原理。Javac原理既然我们是在编译期对类进行操作了,那么我们就需要了解在Java中Javac...
2020-03-05 15:01:48
286
原创 Lombok经常用,但是你知道它的原理是什么吗?
相信大家在项目中都使用过Lombok,因为能够简化我们许多的代码,但是该有的功能一点也不少。那么lombok到底是个什么呢,lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情况下我们需要手动去建立getter和setter方法啊,构造函数啊之类的,lombok的作用就是为了省...
2020-02-26 16:43:16
586
原创 《沙盘模拟系列》JVM如何调优
纸上得来终觉浅 绝知此事要躬行我所在的公司基本上是没有机会进行JVM参数调优的,但是如果有些东西自己不亲身经历一下,看再多的理论知识也只能算是纸上谈兵,真正碰到问题的时候还是不知道该怎么分析。所以就自己制造一些问题然后看其现象,利用所学的知识事前推测,看现象是不是和自己推测的一样。这样不仅对自己所学的知识又是一次巩固,而且也能锻炼自己解决问题的能力(虽然问题是自己制造的)。其实在写这篇文章...
2019-12-29 14:09:47
204
原创 几百万数据放入内存不会把系统撑爆吗?
在公司有一个需求是要核对一批数据,之前的做法是直接用SQL各种复杂操作给怼出来的,不仅时间慢,而且后期也不好维护,就算原作者来了过一个月估计也忘了SQL什么意思了,于是有一次我就想着问一下之前做这个需求的人为什么不将这些数据查出来后在内存里面做筛选呢?直接说了你不怕把内存给撑爆吗?此核算服务器是单独的服务器,配置是四核八G的,配置堆的大小是4G。本着怀疑的精神,就想要弄清楚几百万条数据真的放入内存...
2019-12-21 16:49:33
3642
4
原创 后端框架开发需要注意的几点
后端框架开发需要注意的几点笔者文笔功力尚浅,如有不妥,请慷慨指出,必定感激不尽跌跌撞撞了在程序员的道路上也有一年的时间了,慢慢的觉得这一年的工作大部分时间都是在简单的CRUD中度过,而有时候我们在CRUD中有多少重复性的代码呢?有些代码我们每次写都需要重复性的写一次,不仅浪费时间,而且对于自己提升并没有多大的提高。无意中看到了程序员你为什么这么累文章后,才幡然醒悟,为什么我们工作这么久了不...
2019-09-03 20:49:14
318
原创 压缩20M文件从30秒到1秒的优化过程
压缩20M文件从30秒到1秒的优化过程有一个需求需要将前端传过来的10张照片,然后后端进行处理以后压缩成一个压缩包通过网络流传输出去。之前没有接触过用Java压缩文件的,所以就直接上网找了一个例子改了一下用了,改完以后也能使用,但是随着前端所传图片的大小越来越大的时候,耗费的时间也在急剧增加,最后测了一下压缩20M的文件竟然需要30秒的时间。压缩文件的代码如下。public static vo...
2019-08-16 11:49:13
134
原创 Java8——异步编程
Java8——异步编程异步编程所谓异步其实就是实现一个无需等待被调用函数的返回值而让操作继续运行的方法创建任务并执行任务无参创建 CompletableFuture<String> noArgsFuture = new CompletableFuture<>();传入相应任务,无返回值runAsync方法可以在后台执行异步计算,但是此时并没有返回值。持有...
2019-08-08 20:57:59
608
原创 SpringBoot 2.0 多图片上传加回显
SpringBoot 2.0 多图片上传加回显这两天公司有需求让做一个商户注册的后台功能,其中需要商户上传多张图片并回显。由于之前没做过这方面的东西,此篇文章用以记录一些知识点,以便后续查看。上传Controller的代码非常简单,由于用了SpringMVC框架,所以直接用MultipartFile来接即可。由于是多图片上传所以用数组来接。此处应该注意参数名应该和<input>中...
2019-07-19 17:40:24
402
原创 如何自己手写一个热加载
如何自己手写一个热加载热加载:在不停止程序运行的情况下,对类(对象)的动态替换Java ClassLoader 简述Java中的类从被加载到内存中到卸载出内存为止,一共经历了七个阶段:加载、验证、准备、解析、初始化、使用、卸载。接下来我们重点讲解加载和初始化这两步加载在加载的阶段,虚拟机需要完成以下三件事:通过一个类的全限定名来获取定义此类的二进制字节流将这个字节流所代表的...
2019-07-15 17:54:42
198
原创 Mac上最简单明了的利用Docker搭建Redis集群
Mac上最简单明了的利用Docker搭建Redis集群本文只是记录一下我在Mac上利用Docker搭建Redis集群成功后的步骤,期间走了许多的坑。有许多教程对于Mac用户不友好,搭建成功以后无法进行集群间的通信。首先说明一下有多简单,如果你机器上已经有了Docker,那么就一个步骤就行。如果没有Docker那么在Docker下载下载一个就行。接下来我们就开始进行Redis集群的搭建。首先...
2019-07-12 16:57:10
679
原创 批量测试Mybatis项目中Sql是否正确
去Oracle行动最近公司要发展海外项目,所以要将现有的系统全部平移过去,另外数据库也要从原来的Oracle变为Mysql。公司的数据库交互层面使用的是Mybatis,而Oracle与Mysql也有一些语法上的不同。所以在项目中的Sql要改动,但是多个项目中涉及到的Sql非常多,如果仅凭人工一条一条辨别的话,工作量有点大。所以就萌发出了直接将数据源变为Mysql,利用反射批量执行Mapper中的...
2019-07-12 16:56:21
473
原创 自定义Docker容器镜像并将其上传到DockerHub中
自定义Docker容器镜像并将其上传到DockerHub中Docker从2013年发布至今,一直是广受瞩目,所以我们或多或少也应该了解一些Docker的技术原理,而学习一项技术有了兴趣才能更好的让你持续学习下去。如果让你体会到Docker的神奇之处那么兴趣或许会大一点,接下来我们就先从自定义一个自己的Docker容器镜像来开启学习Docker的第一步。自定义Docker容器镜像在开始我们的...
2019-07-12 16:55:16
393
原创 死磕Tomcat系列(6)——Tomcat如何做到热加载和热部署的
死磕Tomcat系列(6)——Tomcat如何做到热加载和热部署的热部署就是在服务器运行时重新部署项目,热加载即在在运行时重新加载class,从而升级应用。通常情况下在开发环境中我们使用的是热加载,因为热加载的实现的方式在Web容器中启动一个后台线程,定期检测相关文件的变化,如果有变化就重新加载类,这个过程不会清空Session。而在生产环境我们一般应用的是热部署,热部署也是在Web应用后...
2019-07-11 18:14:14
1175
原创 关于Redis热点key的一些思考
关于Redis热点key的一些思考昨天在和一个已经跳槽的同事聊天时,询问他这段时间面试时碰到的一些问题。自己也想积累一下这方面的知识。其中他说了在面试某赞公司时面试官问他关于热点Key的的解决方案。于是针对这次谈话以及上网查的一些资料后的思考进行一下总结。方便后续自己查阅。什么是热点Key其实对于热点Key,网上一查一大堆,这里我就引用网上的一段话。从基于用户消费的数据远远大于生产的数据的...
2019-07-10 15:42:39
164
原创 死磕Tomcat系列(5)——容器
死磕Tomcat系列(5)——容器回顾在死磕Tomcat系列(1)——整体架构中我们简单介绍了容器的概念,并且说了在容器中所有子容器的父接口是Container。在死磕Tomcat系列(2)——EndPoint源码解析中,我们知道了连接器将请求过来的数据解析成Tomcat需要的ServletRequest对象给容器。那么容器又是如何将这个对象准确的分到到对应的请求上去的呢?容器的整体设计C...
2019-07-08 17:23:23
138
原创 死磕Tomcat系列(4)——Tomcat中的类加载器
死磕Tomcat系列(4)——Tomcat中的类加载器在学习Tomcat中的类加载器,并且Tomcat为什么要实现自己的类加载器打破双亲委派模型原因之前,我们首先需要知道Java中定义的类加载器是什么,双亲委派模型是什么。Java中的类加载器类加载器负责在程序运行时将java文件动态加载到JVM中从Java虚拟机的角度来讲的话,存在两种不同的类加载器:启动类加载器(Bootstr...
2019-07-05 15:36:30
329
原创 死磕Tomcat系列(3)——Tomcat如何做到一键式启停的
死磕Tomcat系列(3)——Tomcat如何做到一键式启停的在没有SpringBoot内嵌有Tomcat之前,我们都是将项目打为War包放在Tomcat的webapp目录下面,然后如果是Linux系统,运行命令start.sh、如果是Windows系统,运行命令start.bat以后就能启动起来并访问到页面。如果是想要停止运行只需要运行shutdown.sh或者shutdown.bat就能将程...
2019-06-26 17:14:50
281
原创 死磕Tomcat系列(2)——EndPoint源码解析
死磕Tomcat系列(2)——EndPoint源码解析在上一节中我们描述了Tomcat的整体架构,我们知道了Tomcat分为两个大组件,一个连接器和一个容器。而我们这次要讲的EndPoint的组件就是属于连接器里面的。它是一个通信的端点,就是负责对外实现TCP/IP协议。EndPoint是个接口,它的具体实现类就是AbstractEndpoint,而AbstractEndpoint具体的实现类就...
2019-06-25 11:20:34
250
原创 工作半年遇到最奇葩的问题
工作半年遇到最奇葩的问题背景公司最近买了一套项目,在启动的时候出现了一系列奇怪的问题,对方的技术栈要求是Tomcat7启动,但是由于我们公司出于安全的考虑所以是要求用Tomcat9进行启动的。问题描述下面情况都是相同war包相同Tomcat情况下系统Tomcat版本能否启动WindowsTomcat7能WindowsTomcat9能macOST...
2019-06-20 13:42:53
225
原创 死磕Tomcat系列(1)——整体架构
死磕Tomcat系列(1)——整体架构在许多的高端开发的岗位中都会或多或少有要求面试人员要研究过一些常用中间件源码。这是因为一切的秘密都是藏在源码中,阅读源码能够让我们对框架或者中间件的理解更加深刻,而我们也能够在源码的研究中获得其中一些优秀的设计方式。而我们的中间件和源码那么多,我们该从何入手呢?其实大部分的中间件或者框架都有一些共性的部分,例如网络编程、多线程、反射和类加载等技术。所以深入研...
2019-06-20 13:42:27
221
原创 解决Redis集群条件下键空间通知服务器接收不到消息的问题
解决Redis集群条件下键空间通知服务器接收不到消息的问题键空间通知介绍键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件。可以通过对redis的redis.conf文件中配置notify-keyspace-events参数可以指定服务器发送哪种类型的通知。下面对于一些参数的描述。默认情况下此功能是关闭的。字符通知K...
2019-06-20 13:41:39
1332
原创 一次奇怪的StackOverflowError问题查找之旅
一次奇怪的StackOverflowError问题查找之旅公司最近买了一套老代码,在测试环境部署的时候发生了nested exception is java.lang.StackOverflowError的异常,当时看到这个异常首先想到是栈内存溢出,网上给出的解决办法就是加栈内存大小就行。趁着这个机会也了解一下什么是Java虚拟机栈。Java虚拟机栈我们想要解决StackOverflowEr...
2019-06-20 13:41:14
220
原创 徒手撸一个简单的IOC
徒手撸一个简单的IOCSpring框架中最经典的两个就是IOC和AOP,其中IOC(Inversion of Control)是什么呢?控制反转,简单来说就是将控制实体Bean的动作交给了Spring容器进行管理。再简单点来说就是例如之前想用一个类,必须new一个,但是使用了Spring那么直接用@Autowired注解或者用xml配置的方式就能直接获得此对象,而且你也不用管它的生命周期啊等等之...
2019-01-25 16:13:12
168
原创 Mysql查询带树状结构的信息
Mysql查询带树状结构的信息在Oracle中有函数应用直接能够查询出树状的树状结构信息,例如有下面树状结构的组织成员架构,那么如果我们想查其中一个节点下的所有节点信息,在Oracle中可以直接用下面的语法可以进行直接查询。START WITH CONNECT BY PRIOR但是在Mysql中是没有这个语法的,而如果你也是想要查询这样的数据结构信息该怎么做呢?我们可以自定义函数。我们...
2019-01-22 13:33:06
884
原创 不学无数——Gson源码解析
Gson在用Gson解析时传过来的Json串时,如果将其解析为对象A,而这个对象A继承了对象B。这两个对象都有属性名为name的值,那么在进行解析的时候就会报如下错误。Exception in thread "main" java.lang.IllegalArgumentException: class Practice.Day12.Student2 declares multiple JSO...
2018-10-18 09:55:17
195
原创 不学无数——适配器模式
适配器模式智者千虑必有一失,愚者千虑必有一得在我们开发过程中也会经常碰到一些给原有的系统加一些功能,所以不管前期我们呢可行性、需求分析和系统设计处理的多好,随着时间的推移,总会出一些“意外”。因此我们该如何处理掉这些“意外”呢?聪明的程序员们就想到了许多的补救模式,其中适配器模式就是补救模式中的一种。这种模式可以能够让你从因为业务的快速迭代而引发代码改变的烦恼中解脱出来。适配模式的定义...
2018-10-12 17:57:17
111
原创 不学无数——Mybatis解析判断表达式源码分析
Mybatis解析判断表达式源码分析在我们开发过程中用Mybatis经常会用到下面的例子Mapper如下Map<String ,String > testArray(@Param("array") String [] array);XMl中的sql如下<select id="testArray" resultType="map"> select * f...
2018-10-12 17:56:36
210
原创 不学无数——JAVA中NIO再深入
JAVA中NIO再深入在上一章节的JAVA中的I/O和NIO我们学习了如何使用NIO,接下来再深入了解一下关于NIO的知识。缓冲器内部的细节Buffer由数据和可以高效地访问及操作这些数据的四个索引组成。这四个索引是mark:标记,就像游戏中设置了一个存档一样,可以调用reset()方法进行回归到mark标记的地方。position:位置,其实缓冲器实际上就是一个美化过的数组,从通道中...
2018-09-27 17:56:23
134
原创 不学无数——Java中IO和NIO
JAVA中的I/O和NIOI/O 问题是任何编程语言都无法回避的问题,可以说 I/O 问题是整个人机交互的核心问题,因为 I/O 是机器获取和交换信息的主要渠道。在当今这个数据大爆炸时代,I/O 问题尤其突出,很容易成为一个性能瓶颈。什么是I/OI/O ? 或者输入/输出 ? 指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口。它对于任何计算机系统都非常关键,因而所有 I/O...
2018-09-21 17:51:49
103
原创 不学无数——Mybatis自动映射器Mapper原理分析
在使用MyBatis时,有时候会想,为什么只写一个接口没有编写任何的实现类,但是就能返回接口的实例,并且调用接口的方法返回数据库中的数据?此时脑海中浮现了写动态代理时候的记忆,记得动态代理也是接管了接口,不需要实际的代理角色。然后经过源码的Debug发现果然是运用了动态代理的技术。如果对于动态代理技术不熟悉的同学可以看不学无数—动态代理Mybatis自动映射器Mapper的源码分析首先我们想D...
2018-09-21 17:51:05
295
原创 不学无数——装饰模式
装饰模式在开始之前我们可以用一个简单的例子引出来装饰模式,在小的时候,相信大家都有过这样的经历:小学每年会有好几次的考试,如果有一次成绩非常差,而且考完以后学校会有个很损的招,就是打印出来成绩单,然后让家长签字。那么拿着这个成绩单,肯定是不会直接告诉家长成绩什么的,肯定是会加一些,例如,语文考了65,就会说我们班最高的才75。如果成绩单没有排名的话,那么也会添油加醋的说排名靠前,这样父母的就会...
2018-09-18 19:06:57
134
原创 不学无数——个人搭建的博客已经好了,欢迎访问
新的博客的地址 http://modouxiansheng.top/,在csdn中也会更新文章,有感兴趣的小伙伴可以进去看看。有什么问题可以随时指出来。
2018-09-17 20:41:19
105
原创 不学无数——Spring注入后反射的空指针异常
Spring注入后反射的空指针异常自动装配是在spring环境下当使用该类的实例时由spring容器完成了类的实例化过程,包括对依赖对象的实例化过程。而通过反射创建实例时,是根据你调用的构造函数完成的实例化过程,没有容器的自动化创建实例了,所以需要自己对依赖对象进行注入。所以依赖spring容器实例化和自己用反射实例化是两种独立的方式,不能相互渗透的。1. 异常说明在单元测试...
2018-09-17 20:40:20
1273
原创 不学无数——记一次常见异常而导致的Debug源码之旅
1. 出现的异常以信息代码如下:Mapper接口中的代码:List<String> queryTransCdByType(String type);MapperXML中的SQL代码:<select id="queryTransCdByType" resultType="String" parameterType="String">SELECT ...
2018-09-12 16:44:59
139
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人