自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(109)
  • 资源 (3)
  • 收藏
  • 关注

原创 持续更新MySQL和ORACLE实操区别

最近由于项目需要用上了oracle,几天感受下来感觉区别还是挺多的,方方面面,所以打算开一篇博,不详述,简单地持续更新。由于对Oracle不是很熟悉,如有错误谢谢指正:1.MySQL是可以设置主键自增的,但在Oracle里想让主键自增要先选一个number类型字段作为主键,然后自己写序列和触发器,总之要自己动手。2.两种数据库的索引类型都可选很多种,MySQL的默认引擎innoDB是可以选...

2019-11-04 15:19:55 167

原创 记录解决maven无法下载snapshot快照库

maven的依赖管理方式中将依赖分为两种版本,一种是Release正式版本,还有一种Snapshot快照版本。一般版本号后面带有Release或者什么都没有的就是正式版本,而版本号后面带有snapshot的则是快照版本,如图:...

2021-04-14 20:07:49 6399

原创 利用docker-compose搭建ES集群+cerebro+logstash+kibana步骤记录

这次记录的是一个完整的操作过程。使用了三台阿里云服务器,两个ES节点各占一台,另一台安装cerebro+logstash+kibana,当然都是使用docker-compose安装的。docker-compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。使用docker-compose当然得先安装docker。1.安装docker如果服务器中已经安装了docker,想安装最新版本的话,先卸载服务器中的旧版本docker:sudo yum remove dock

2021-02-18 17:57:04 1286 2

原创 登陆验证发展史(cookie认证->session认证->token认证->JWT,单系统登陆->多系统单点登陆)

登陆验证发展史有两条主线。在服务部署方式层面,早期的Web服务系统简单一般都是单系统,登陆的话就登陆这一个系统就好了,随着系统复杂性越来越高,一个大的系统往往由很多子系统组成,用户使用这个大系统时不可能一个一个地单独去登陆每个小系统,理想的是只要登陆上了这个大系统或者其中的一个小系统,其它所有小系统都不需要再输密码什么的登陆了,直接访问,所以登陆验证就从单系统登陆演进为多系统的单点登陆。而在验证方式层面,经历了cookie认证->session认证->token认证->JWT的发展史。

2021-01-27 21:49:16 1302

原创 TCP可靠性的体现:seq和ack机制

提到TCP和UDP的区别,很容易想到的就是TCP的可靠性,那TCP是通过什么机制实现了可靠性的呢?先来看一张经典的TCP三次握手过程图:这张图里似乎有个大写的ACK也有个小写的ack,这也是容易混淆的地方。大写的ACK是控制位,在TCP报文头中有8个标志比特,也就是TCP报文头中有8位大小的数据是标志位,看一下TCP报文格式更好理解:它们中的多个可以同时被设置成1:CWR(Congestion Window Reduce):拥塞窗口减少标志,用来表明它接收到了设置ECE标志的TCP包

2021-01-12 11:45:38 3087 3

原创 JAVA NIO的三要素(Buffer/Channel/Selector)、四种Channel事件SelectionKey以及Netty中的零拷贝串联理解

JAVA NIO全称是Java non-blocking IO或者Java New IO。在之前的文章中(https://blog.csdn.net/weixin_42447959/article/details/107233189)提到过,NIO是IO理论思想,其中同步阻塞IO(Non-Blocking IO)演进为多路复用IO(Multiplexing IO),是IO理论思想的演进。JAVA NIO是NIO在JAVA领域的实现。JAVA NIO的三要素,即Buffer、Channel和Selecto

2021-01-06 19:14:49 965

原创 Tomcat利用Servlet处理请求的过程以及自定义Servlet

Tomcat利用Servlet处理请求的过程画了一张图,先上图:Servlet全称Java Servlet,没有对应中文翻译,都叫Servlet,其实就是Java编写的服务端程序。tomcat-embed-core包中有一个Servlet接口:它有很多实现类:其中我们最熟悉的就是Spring MVC里面的DispatcherServlet即前端控制器。回忆一下之前用XML是怎么配置DispatcherServlet的:配合了<servlet>和<servl.

2020-12-30 13:00:20 810

原创 BeanPostProcessor接口的理解

好久没有写博客了,看了一眼自己的文章列表,上次写还是8月份的时候,9月份转载了两篇。今天想起来写一篇,是因为自己纠正了对BeanPostProcessor接口的理解误区,写文章往往都是源于这种豁然开朗的灵感。不过今天又是孤陋寡闻的一天呢,一个知识点理解错了这么长时间居然都不自知。Bean的生命周期应该都很清楚,先贴这张图:这张Bean生命周期顺序图里大部分环节都是比较好理解的,比如setBeanName和setBeanFactory包括setApplicationContext,都是实现了对应的

2020-12-10 15:57:34 1318

转载 转载一篇详尽的Synchronized底层理解

记得开始学习Java的时候,一遇到多线程情况就使用synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着学习的进行我们知道在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒弃它。不过,随着Javs SE 1.6对synchronized进行的各种优化后,synchronized并不会显得

2020-09-16 11:39:45 266

转载 转载一篇GC日志格式用时查阅

JVM相关参数设置堆设置-Xms :初始堆大小-Xmx :最大堆大小-XX:NewSize=n :设置年轻代大小-XX:NewRatio=n: 设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4-XX:SurvivorRatio=n :年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5-XX:MaxPermSize=n..

2020-09-15 20:07:40 324

原创 贴一张SQL关键字执行顺序图

但是,在实际当中,数据库不一定会按照 JOIN、WHERE、GROUP BY 的顺序来执行查询,因为它们会进行一系列优化,把执行顺序打乱,从而让查询执行得更快,只要不改变查询结果。

2020-08-19 14:39:20 238

原创 hutool的HttpUtil没有使用连接池,为此看了一下apache的httpclient是怎么实现连接池的

之前有篇文章介绍过这个甜甜的java工具类库hutool,也用过它导出excel,对它印象还不错。今天需要开发一个小工具jar,小工具的目的简单来说就是要去疯狂的远程调用几个http接口,开发之前首先就想到了用hutool试一下它里面的HttpUtil,因为小工具去调用远程http接口是要大量循环地进行的,是疯狂的,所以http连接池是必不可少的,为此特意去看了一下hutool的HttpUtil有没有应用连接池。打开了hutool的HttpUtil类,有很多重载的get()和post()方法,想知道

2020-08-14 14:29:58 7181 3

原创 发现了一个好玩的SQL函数-soundex()

今天又是孤陋寡闻的一天呢。先来看一段实操演示:首先我往表里插入了一行数据如图:没啥毛病,两个简单的String类型的字符串。然后我想查出这行,常规操作是这样对吧:今天学到了一个骚操作,看图:这两句貌似一顿乱传参数,Field_Value_Sign和Smythe没有半毛钱关系,Field_Sign和sim也只是像啊,居然也都能查询出来!这就是soundex()函数在其中起作用。soundex()函数简单点说就是返回表示字符串声音的一串字符,字符串的 SOUNDEX ..

2020-08-13 14:45:07 823

转载 转发一篇Redis五种数据结构详解,写的太棒太详细留下来慢慢消化

以下文章来源于公众号"非科班的科班",作者黎杜。本文脑图前言Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库、缓存、消息中间件,这么优秀的东西一定要一点一点的吃透它。话不多说,我们直接进入主题,很多人都知道Redis的五种数据结构包括以下五种: String:字符串类型 List:列表类型 Set:无序集合类型 ZSet:有序集合类型 Hash:哈希表类型 但是作为一名优秀的程序员可能不能只停留在只会用这五种类型进行c.

2020-07-23 14:56:30 277

原创 推荐一个甜甜的java工具类库-Hutool

今天又是孤陋寡闻的一天呢,偶然接触到了Hutool这个java工具类库,第一眼就觉得很有意思,把这个jar包下载下来之后看了一眼:哈哈哈,很是想看看它怎么让java语言甜甜的。先看一下jar包里面有什么东西:一顿点之后发现,Hutool其实就是帮我们封装了很多Util,比如我们想导出excel,里面有ExcelUtil,如果我们想用Json操作,里面有JsonUtil。还挺多,HttpUtil和ProxyUtil这些,很多都是我们平常能用得到的。先直接上手试一下吧,就试一下这个Exce.

2020-07-10 17:13:15 773

原创 理清同步/异步、阻塞/非阻塞、BIO、NIO/JAVA NIO、多路复用IO、AIO、select、poll和epoll,题目很乱但思路清晰。

题目看上去真的很乱,写之前先贴一张写之前理出来的思路图:题目里那些乱七八糟的名词都能在图里找到自己的位置了。 下面就是解释一下这张图了。从IO开始讲吧,先简单解释一下IO。其实IO这个概念真的很杂容易混淆,我理解的IO是分两个大概念的,即网络IO和磁盘IO。网络IO就是socket网络数据传输,磁盘IO就是磁盘文件读写这些。上图中的IO理论思想在网络IO和磁盘IO中都可以适用的,因为这两个有很多共同之处。为什么有共同之处呢?可以这么理解。磁盘IO就是文件读写嘛,文件是在磁盘上的要读到内存中,

2020-07-10 10:24:29 604 1

原创 将一个maven项目和第三方依赖一起打成没有main-class的普通jar

最近开发的项目需要给一个jdk1.7的项目写一个SDK,而且这个jdk1.7的项目也不是maven项目,是那种原始的java web。既然这样,想法就有了。开发这个SDK的时候我是肯定要用maven的,打包的时候可以打成一个普通jar包,并且把第三方依赖也打进jar包中,还要注意开发编译得用jdk1.7,这样就可以直接提供这个jar包给他们,也不会出现jdk版本问题。思路清晰就开始开发一个demo了。将一个maven项目和第三方依赖一起打成没有main-class的普通jar,这种场景其实挺多的,比如很

2020-06-30 18:59:54 1665 1

原创 记录前几天在一台内网服务器中先装Docker再装RabbitMQ的经历

开发的时候需要在测试环境安装RabbitMQ,而测试环境一般是不会去麻烦运维大哥的,所以就自己安装。想着直接yum install不就好了嘛,当时也没当回事。可以在真正安装的时候傻眼了,测试服务器是一台内网服务器,直接yum install根本不行,因为只能用公司自己的镜像源,这不完了嘛,早知道就不活要面子死受罪得说自己装了。没办法去网上百度了半天,找到一篇文章是教怎么在内网服务器离线安装Docker的,前提是需要一台有外网的服务器,自己刚好有几台阿里云服务器,又想到了Docker可以保存本地镜像打包到

2020-06-18 16:55:29 401

原创 利用AOP简单实在的防止系统垂直越权

还是前几篇博客中提到过的项目,接盘过来后一直在重构它。重构的过程中,JIRA就给我发了个警告:天呐真的是会给我找事情,那就趁着这次重构顺便解决它吧。一个成熟的系统权限控制都会用角色去控制用户权限,比如admin管理员和operate操作员两个角色,如果系统中某个功能只能管理员使用,但是如果操作员也能使用的话就是垂直越权。防止垂直越权...

2020-06-16 15:40:56 2181 2

原创 今天绞尽脑汁地去防止RabbitMQ消息丢失

项目中有一个往ES里面写数据的逻辑,可是数据比较多往ES里面写得很慢,影响系统处理效率。最近在做的事就是将数据写进ES优化为异步动作,这样就不会影响项目处理接下来逻辑了。方案选型是用RabbitMQ消息队列做异步,生产环境中的这些数据是很重要的,是不允许丢失的,所以今天也是绞尽脑汁地去防止消息丢失,这篇博客总结一下。要想解决消息丢失问题,首先得了解消息为什么会丢失。RabbitMQ是基于AMQP协议,高级消息协议嘛,设计上就和其他MQ产品不一样,关于AMQP协议的设计画了一个简单的图:AMQP.

2020-06-10 20:03:39 418

原创 Spring Cloud用OpenFeign做远程调用的话要注意返回值类型能不能被反序列化

每次从零开发一个服务的时候总是遇到各种各样奇怪的问题,今天又从Spring Initializr开始开发一个服务。抄自己的不算抄,本着CV大法优先的原则,从之前其他项目中拷贝了几个component,比如响应Entity封装的类型啊,自定义异常枚举啊这些,如图:坏就坏在这些不是从Spring Cloud项目中拷过来的,浑然不知已经埋下了坑还嘻嘻哈哈地写了一个client,就是一个简单的用OpenFeign调用一个远程服务,如图:可以看到这里给响应Entity封装了一个HikResponse类

2020-06-05 21:04:56 10684

原创 com.baomidou.mybatisplus在XML中写insert/update的时候要注意有没有parameter

事情是这样的,最近在重构旧项目,项目中有一段逻辑调用了Oracle的存储过程,类似于这样:这段存储过程的SQL是在数据库里面的,非常长,我是很不喜欢在程序中使用存储过程的,这些逻辑也可以放在程序中啊。看不过眼就把这段长长的SQL复制到XML中了,就成了这样:这是insert,还有update:太长了还用了begin/end就都截图了一部分。可以看出来这段存储过程执行的时候是不需要任何参数的,所以这里<update>和<insert>标签页没有写parame..

2020-06-02 15:21:18 4044

原创 在SpringBoot中弃用自带的StandardServletMultipartResolver更换为CommonsMultipartResolver也有坑

还是上篇传统Spring项目换SpringBoot框架中的一个问题,先描述一下问题:整和SpringBoot后系统中的文件上传都不能用了,统统报错如下:大致就是Failed to parse multipart servlet request; nested exception is org.apache.commons.fileupload.FileUploadException: Stream closed这样,通过异常栈信息可以看出当时使用的文件上传解析器是CommonsMultipart

2020-05-28 15:07:46 3911 3

原创 传统Spring项目换SpringBoot的问题记录

起因就是组内旧项目也要接入现有的微服务部署,该项目大致上就是后台MVC和前端JSP写在了一起,还用了一堆shiro、mybatis-plus这些组件,整改过程想必问题很多,所以写一篇博客,事无巨细,都简单地记录下来。原项目目录结构如图: 被我一顿换后,改了pom.xml文件加了启动类,有点boot项目的样子了,项目结构如图:主要就是把webapp里面的stati...

2020-05-15 16:34:21 872

原创 话不能说得太绝对不然下不了台(单点登录Filter排除部分url)

其实这次的问题解决分分钟按以往习惯是不值得啰嗦一篇博客的,但这次着实有点下不了台,归根结底还是自己对单点登录的jar包不了解,所以想记录一下,以后好好看源码再说话,即:事情是这样的,现在公司项目集成单点登录不奇怪,负责的一个Spring项目用的这个jar包。老项目了,过滤器是配置在web.xml中,<filter-mapping>配置的时候也是"/*"全部拦,如下:<filter> <filter-name>CasSingleSignOutFilte

2020-05-13 16:29:41 823

原创 SpringBoot项目启动过程源码终于整体捋了一遍(完结)

上篇看到了refreshContext()方法:refresh()分析完了,接下来看一下这个shutdownHook,撸源码之前先介绍一下它。我们做开发的经常需要考虑服务宕机的情况,OOM内存溢出也好,断电断网也好,甚至用户直接点了叉强制退出了。如果服务正在进行很重要的操作处理很重要的数据这个时候进程挂掉了,那之前的活岂不是白干了,甚至还会导致系统bug。所以这个时候我们希望在服务宕机...

2020-04-15 19:53:17 669 1

原创 SpringBoot项目启动过程源码终于整体捋了一遍(九)

上篇介绍了run()方法中context三连中的prepareContext()方法,先贴一下这个三连:这篇的重点是refreshContext()方法,先看一下这个方法:接下来的方法比较多,想着自己写有点懒了,看到其他文章中直接在源码中添加注释的方法还挺直观的,接下来就当一下搬运工,自己也补充了部分地方,下面的原文出处:作者:ygxing链接:https://www.ji...

2020-04-15 18:47:04 807

原创 SpringBoot项目启动过程源码终于整体捋了一遍(八)

上篇遗留了一个问题,即初始化SpringApplication时设置初始化器setInitializers()有什么用。上篇依然是没有看完run()方法,先贴一下run()方法:上篇看到了打印Banner,继续往下看:ConfigurableApplicationContext是run()方法的返回值,看来是在这个方法里初始化的,看一下这个方法:又是分应用类型,之前遇到...

2020-04-07 13:58:17 296

原创 SpringBoot项目启动过程源码终于整体捋了一遍(七)

上篇看了一部分的run()方法,先贴一下run()方法:上篇看到了listeners.starting();介绍了SpringBoot启动时的事件发布机制,并且遗留了一个问题,即初始化SpringApplication时设置初始化器setInitializers()有什么用,这篇继续往下看:利用参数args构建了一个DefaultApplicationArguments对象,顾名思...

2020-04-03 16:05:53 913

原创 SpringBoot项目启动过程源码终于整体捋了一遍(六)

截止上篇,关于SpingBoot的启动流程终于看完了如何初始化SpringApplication,内容还是挺多的足足写了5篇。并且过程中遗留了一个问题,即初始化SpringApplication的时候设置初始化器setInitializers()和设置监听器setListeners()在启动流程中起着什么作用。带着遗留问题这篇开始看初始化完SpringApplication之后的run方法,先...

2020-04-02 15:37:06 601

原创 孤陋寡闻的我刚知道怎么debug远程服务

之前在IDEA中debug一般也就在本地代码本地起个服务跑一跑,孤陋寡闻的我今天才知道还可以用本地代码去debug远程服务,其实debug远程服务这个应用场景说多不多说少也不少,举个例子,比如你想复现一个bug,可以本地没有数据,在本地代码上debug怎么都复现不了,可是bug在测试服务器上疯狂复现,这时候就想能不能用本地的代码,测试服务器上的数据来debug,其实我每次都是这么想的,有办法啊,直...

2020-03-26 15:06:20 226

原创 SpringBoot项目启动过程源码终于整体捋了一遍(五)

这篇继续看初始化SpringApplication的时候如何设置初始化器的,上篇看到了getSpringFactoriesInstances()方法,先贴出来:上篇撸了第一行,理了java的类加载相关,继续往下看:注释说使用名称并确保唯一,以防止重复,这些names被放进了Set集合,原来大佬们也喜欢用Set防止重复啊,继续看这些names怎么来的,这个SpringFactori...

2020-03-26 13:51:06 515

原创 SpringBoot项目启动过程源码终于整体捋了一遍(四)

上篇分析了初始化SpringApplication时是如何推断应用类型的,并且问题依然遗留着,即初始化SpringApplication的时候resourceLoader为null怎么拿类加载器。这篇带着这个问题继续往下撸源码,还是把SpringApplication的构造方法贴一下:继续往下看:setInitializers()方法即设置初始化器,ApplicationCon...

2020-03-24 18:40:14 1193 2

原创 SpringBoot项目启动过程源码终于整体捋了一遍(三)

上篇分析到了构造SpringApplication的过程,为了了解这个主源类primarySources,大致撸了一遍bean加载的过程。同时还遗留了一个问题,已经看到初始化SpringApplication的时候esourceLoader是为了拿类加载器,那如果resourceLoader为null怎么办呢,总不能不要类加载器吧,这篇带着这个问题继续看SpringApplication的初始化过...

2020-03-23 20:11:52 314

原创 SpringBoot项目启动过程源码终于整体捋了一遍(二)

上一篇写到run()方法分两步,即:1.new SpringApplication() 利用主源类primarySources初始化SpringApplication类2.调用SpringApplication的run()方法启动项目,并传递参数args。也提到启动的时候主源类primarySources可以有多个,那就有一个问题了,这个primarySources为什么还可以有多个呢...

2020-03-21 15:37:29 1320 2

原创 没有设置jdbcType的话Mybatis不能将null设置为sql语句的参数值(Oracle)

今天遇到一个问题,数据库用的oracle,先简单描述一下,Mybatis不能将null值设置为待执行sql语句的参数,再详细描述一下发现问题的经过:之前用Mybatis时,在xml文件中写SQL的时候,常会用到<if test="">这样的判断条件,如下:一大堆,之前对<if>标签的理解本质上就是看条件拼SQL,条件成立了就拼上这一句,不符合条件就不要这句了SQ...

2020-03-21 12:18:04 1703

原创 SpringBoot项目启动过程源码终于整体捋了一遍(一)

写在前面:这几天撸这段源码过程中,发现好多东西之前都忽视了,所以决定连载几篇,把之前漏掉的、现在想起来了的,都整理总结下来。Spring Boot项目启动过程这个问题过于经典,之前也是能说上来一点,但是说实话,源码都是一个片段一个片段的看过,没有系统性地连起来,这几天从头开始捋了一遍,也不是闲的无聊,是因为确实遇到了一个问题。问题是这样的:现在项目部署一般都分测试环境和生成环境甚至更多,不...

2020-03-17 19:10:36 1030

原创 记一次VUE项目在nginx上的部署经历

由于最近的项目需要全栈,其实接触vue有一段时间了,但至今仍然感觉是个小白,所以想借这次在nginx上部署vue项目的机会,给前端相关的博客开个头,可以从平时的总结中积累。首先当然是npm run build打包项目,生成static文件夹和index.html文件。然后一顿百度nginx如何部署vue项目,做做准备工作,过程中看到不少文章写需要将打包模块build中assetsPubli...

2020-03-10 21:09:49 1489 1

原创 Redis 3.0版本前后,分片与集群的实现

首先这篇博客对Redis的集群部署工作不予介绍,因为最近的开发涉及到了使用jedis客户端操作Redis,借此机会总结梳理一下jedis客户端操作Redis的三种模式:单机模式(Jedis)、分片模式(ShardedJedis)和集群模式(JedisCluster)。首先当然是把依赖引进来:<!-- redis客户端 --><dependency> &...

2020-01-08 22:02:05 433

原创 由传统IO演化至零拷贝的过程

零拷贝(Zero-Copy)用于在数据读写过程中减少不需要的CPU拷贝,CPU就那么几个,减少它的负担自然可以提高处理效率。数据传输有本地的文件拷贝和通过socket进行文件传输两种,两者区别不大,只是文件数据最终的去向仍然是本地磁盘还是网卡的区别,这里以socket文件为例介绍传统IO演化至零拷贝的过程。介绍零拷贝之前,可以先看一下传统IO,借此熟悉一些相关概念,先上图:首先要知道操...

2019-12-13 15:01:21 914 4

离线安装docker.zip

在内网服务器中离线安装Docker的本地源,rpm完整,版本适配,附教程链接,亲试有效

2020-06-18

rabbitmq镜像包.zip

RabbitMQ的Docker镜像包,带管理界面版本和不带两个镜像包都有,直接拷贝到服务器中load

2020-06-18

linux安装RabbitMQ(3.6版本)

linux中安装RabbitMQ所需的三个rpm以及详细安装教程,亲试可用,包含RabbitMQ、Erlang以及Socat三个rpm,版本互相适配

2020-06-08

空空如也

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

TA关注的人

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