java
文章平均质量分 87
叶长风
会scala和python的程序员
展开
-
ThreadLocal详解(二)
ThreadLocal详解(二)上一篇文章讲了ThreadLocal的get、set、resize等方法的源码,但是对于一些单独的方法例如cleanSomeSlots、expungeStaleEntry并没有讲述,这一节就是要讲述这些源码,在讲之前首先提几个ThreadLocal的注意事项,一般来说就是ThreadLocal如果在使用不当的情况下会出现内存泄漏的问题,其原因就在于如果在线程清除时...原创 2019-10-22 07:30:39 · 434 阅读 · 0 评论 -
JDK 动态代理运行原理
JDK 动态代理运行原理 程序演示 源码讲解 总结 这几天有空研究了下JDk的动态代理,JDK的动态代理类都在java.lang.reflect包下,写了一些小程序来演示了相关类的使用,同时做了一些与CGLIb的对比,以后有空再讲述下lombok中相关注解的使用。1. 程序演示接口:HelloWorld:public interface HelloWorld { voi原创 2017-11-09 07:58:01 · 889 阅读 · 0 评论 -
netty编解码之使用protobuf
netty编解码之使用protobufprotobuf这个序列化框架在我们公司使用了,我负责的模块中使用protobuf生成了一些model,然后使用了protostuff对缓存在redis中的数据进行序列化和反序列化,速度非常快,解决了一些当时的序列化和反序列化太慢的问题,这节来讲下netty中使用protobuf进行序列化的用法。这里可以下载protobuf工具然后使用命令根据proto生成ja原创 2017-12-07 08:03:48 · 2060 阅读 · 3 评论 -
netty编解码之java原生序列化
netty序列化之java原生序列化前几天有空看了下netty使用java原生序列化、以及使用protobuf、jboss marshalling进行编解码,各种技术之间差异挺大,使用的方法各自不同,性能上原生的性能优势确实不大,但是另外两种确实很有优势,觉得有点意思,于是准备写一篇文章记载一下,但是一篇文章篇幅太长,因此拆成了三篇文章分别来讲。java序列化代码这个简单的程序就是server和cl原创 2017-12-06 07:46:06 · 1116 阅读 · 0 评论 -
netty编解码之jboss marshalling
netty编解码之jboss marshallingjboss marshalling是jboss内部的一个序列化框架,速度也十分快,这里netty也提供了支持,使用十分方便,不需要像protobuf一样编写proto文件,只需要提供两个编解码器即可,以下就是jboss marshalling使用的开始。源码程序model类model类和之前编写java序列化的时候没有区别,这里便不再多说,仅仅贴出原创 2017-12-11 08:10:28 · 3629 阅读 · 2 评论 -
netty中epoll server和nio server的使用
netty中epoll server和nio server的使用这几天有空研究了下netty中的EpollEventLoopGroup和NioEventLoopGroup的用法,在编码上没有显著的不同,对应的epoll,有一套的api供于使用,但是因为只能在linux机上使用,因此又借助了docker运行linux容器来运行相应程序,这节就来具体的讲述下。nio server编写了一个简单的Hell原创 2017-11-15 08:03:36 · 12797 阅读 · 3 评论 -
spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient
spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient在之前的一篇文章Spring Cloud feign使用中在使用服务发现的时候提到了两种注解,一种为@EnableDiscoveryClient,一种为@EnableEurekaClient,用法上基本一致,今天就来讲下两者,下文是从stackoverflow上面找到的对这两者的原创 2017-10-17 08:04:54 · 76335 阅读 · 9 评论 -
spring boot jar的启动原理分析
spring boot jar的启动原理分析 1、前言 2、分模块后的结构 3、MANIFEST.MF文件 4、运行 5、main程序的启动流程 6、总结 1.前言近来有空对公司的open api平台进行了些优化,然后在打出jar包的时候,突然想到以前都是对spring boot使用很熟练,但是从来都不知道spring boot打出的jar的启动原理,然后这回将j原创 2017-10-24 08:02:15 · 6910 阅读 · 1 评论 -
Spring cloud 中@EnableEurekaClient源码分析
Spring cloud 中@EnableEurekaClient源码分析上一篇文章中讲述了@EnableEurekaClient和@EnableDiscoveryClient区别,原想可能底层会有较多不同,但是查看源码的时候发现@EnableEurekaClient本身就是用@EnableDiscoveryClient来实现的,因此没有多大的研究价值,但是如果继续讲@EnableEurekaCli原创 2017-10-23 08:26:46 · 9301 阅读 · 5 评论 -
Spring Cloud feign使用
Spring Cloud feign使用 前言 环境准备 应用模块 应用程序 应用启动 feign特性 综上 1. 前言我们在前一篇文章中讲了一些我使用过的一些http的框架 服务间通信之Http框架,其实最终还是准备讲述spring cloud fegin,使用spring cloud fegin完成更为优雅的http的调用方式,以及在服务之间的调用与远程原创 2017-08-29 08:01:46 · 6910 阅读 · 0 评论 -
spring cloud 与 docker-compose构建微服务
spring cloud 与 docker-compose构建微服务 前言 目录结构 配置文件的修改 Dockerfile文件 bash脚本 docker-compose.yml文件 编译与运行 综上 1. 前言上一篇文章中讲了服务注册中心eureka-server、服务消费者service-a、服务提供者service-b,service-a和servi原创 2017-09-04 08:27:54 · 10806 阅读 · 5 评论 -
服务间通信之Http框架
服务间通信之Http框架 1.服务间通讯调用 2.jersey代理连接池 3.综上 1.服务间通信调用首先不提在微服务中,就是在我们使用spring cloud技术栈构建我们的服务中,如果我们需要调用其他的服务或者第三方的服务,一般的通信方式无非是http通信、rpc通信、异步消息通信等等,当然大多数服务一般都是以http接口的形式提供出来,那么可以用来调用该服务的方法可谓是原创 2017-08-03 07:59:46 · 4941 阅读 · 2 评论 -
netty之SimpleChannelInboundHandler
netty之SimpleChannelInboundHandler在最开始学些netty的时候,写的服务端demo的handler,继承的都是ChannelInboundHandlerAdapter,客户端继承的是SimpleChannelInboundHandler,当然最开始学的时候都是在不断的写demo,并不清楚为何两边继承的类还不一样,还想过服务端handler也继承SimpleChanne原创 2017-07-25 07:24:21 · 7091 阅读 · 3 评论 -
Eureka的高可用以及服务提供者、服务消费者集群之间的调用方式
Eureka的高可用以及服务提供者、服务消费者集群之间的调用方式 1.为什么要进行Eureka的集群 2.搭建eureka集群 3.服务提供者注册到高可用eureka上 4.服务提供者集群状态 5.服务消费者消费 6.综上 上文我们讲了服务提供者和服务消费者在eureka上进行服务注册和服务之间进行调用,这节来讲eureka的集群模式和服务消费者和服务提供者之间集原创 2017-03-06 08:45:02 · 17436 阅读 · 8 评论 -
netty入门及介绍
netty入门及介绍 1、前言 2、服务端程序 3、客户端程序 4.部分netty知识详解 5、总结 1.前言前段时间研究了一段时间的rpc框架,dubbo、zero ice等等都熟悉了一下,然后发现许多rpc框架底层都是采用netty进行通信,由此对netty有了一些兴趣,然后花了三个多月的时间学习了一下netty,一些博文专栏中的文章、官网的例子,都去写了一遍,不原创 2017-07-06 17:20:28 · 1111 阅读 · 0 评论 -
Spring cloud服务发现之服务提供者和服务消费者
Spring cloud服务发现之服务提供者和服务消费者 1.服务提供者 2.服务提供者 3.启动运行 4.综上 1.服务提供者根据上节讲述的服务注册之Eureka注册中心,这节讲述服务提供者和服务消费者,首先新建一个工程,命名为microservice-provider-user,其中pom.xml文件如下:<project xmlns="http://maven.ap原创 2017-02-27 08:48:16 · 14450 阅读 · 3 评论 -
spring cloud服务发现之Eureka
spring cloud服务发现之Eureka 1.服务发现 2.Eureka工作流程 3.搭建Eureka服务发现工程 4.启动运行 5.综合 1.服务发现当前互联网架构中,微服务架构越来越为盛行,在其中,服务发现是比较重要的,在构建微服务架构的程序中,个人仔细研究过spring cloud和osgi等技术,相对于spring cloud,osgi更为晦涩难懂一些,原创 2017-02-20 10:00:14 · 2334 阅读 · 2 评论 -
Spring boot 与 Docker-compose构建微服务应用(2)
Spring boot 与 Docker-compose构建微服务应用(2) mysql相关 spring boot应用 docker-compose管理 应用运行 综合 上一篇博客说的是spring boot应用使用mongodb后,使用docker分别创建springboot应用镜像和mongodb镜像,然后使用docker-compose进行统一管理,是一个简单原创 2017-01-16 10:04:02 · 5578 阅读 · 4 评论 -
leveldb中WriteBatch、Snapshot使用
leveldb中WriteBatch、Snapshot使用上一节中仅仅做了一个leveldb的介绍,以及简单的put、get、del的使用,没有对leveldb的一些深入的特性进行讲解,算得上只是一个入门罢了,知道什么是leveldb,而作为一个基础的存储引擎,本身没有太多的特性其实也是正常的,如果想要在生产环境使用一个类似的存储,其实还是更推荐使用mapdb,有着相当丰富的特性供以使用,我有...原创 2018-04-08 07:56:28 · 2826 阅读 · 2 评论 -
双重大数组循环优化
双重大数组循环优化一、前言这几天发现服务在凌晨时容易报警,持续半个小时才正常,第二天分析日志和检查代码发现,有一个过滤黑白名单的操作,其中黑名单的数据有39万,白名单数据30万,然后处理的数据也有80万左右,在业务逻辑中黑白名单本身有一个过滤逻辑,数据对黑白名单有一个过滤逻辑,此处总共耗时在30分钟左右,在耗时将近40分钟后,下一轮低频任务才开启,所以cat不断报警,此处开启下一轮时间...原创 2018-03-04 19:19:19 · 3097 阅读 · 2 评论 -
leveldb入门
leveldb入门leveldb简介以前在大学的时候偶尔了解过leveldb,当时只是知道leveldb是一个存取性能极强的存储引擎,非常适合于顺序存储,当时时间不多,有很多其他的需要去学习,另外也没没有用到,因此一直没有了解过,最近有一些功夫突然再次看到了leveldb,想接触一下,然后发现这个是C++编写的,原生不支持java,但是有一个开发者照着C++的源码编写了一个java版,...原创 2018-04-03 08:02:10 · 2976 阅读 · 0 评论 -
MyBatis源码分析之Script用法详解
MyBatis源码分析之在上一篇文章中讲到MyBatis的#{paras}和${paras}用法,在里面提到在解析sql组装成SqlSource对象时,会判断当前sql是否是动态类型,然后里面有一个对sql中是否含有**1. 与之前相同,讲到这里还是先讲一下@ResultMap(&quot;BaseResultMap&quot;)@Select(&quot;&amp;lt;script&amp;gt;&quo原创 2019-01-22 08:14:49 · 13370 阅读 · 0 评论 -
MyBatis源码分析之@ResultMap注解详解
MyBatis源码分析之@ResultMap注解详解在前一篇文章讲**@MapKey注解时,我原想将@ResultMap注解也一起拿出来说一下,但是发现@ResultMap解析加载源码非常多,想想就不在一篇文章中讲了,分开单独来说,这一篇就来彻底探索一下@ResultMap**注解。1. 加载过程说到解析Mapper方法上的注解**@ResultMap**,这个就要回到解析configur...原创 2019-01-10 08:19:22 · 12250 阅读 · 1 评论 -
Deque用法及原理讲解
Deque用法及原理讲解最近想着对现有知识点进行一个总结,决定从集合开始,想想便从Deque开始吧,Deque用的比较少,但是还是一个功能十分强大的队列,这种双向队列即可以支持先进后出,也能支持先进先出的格式,相当于同时实现了Stack和Vector,今天就来讲一讲Deque用法以及底层源码。1. Deque用法先写一个简单的demo,这个demo也是以前查Deque时看别人写的,然后对...原创 2019-01-14 08:17:35 · 5849 阅读 · 1 评论 -
MyBatis中@MapKey使用详解
MyBatis中@MapKey使用详解我们在上一篇文章中讲到在Select返回类型中是返回Map时,是对方法中是否存在注解@MapKey,这个注解我也是第一次看到,当时我也以为是纯粹的返回单个数据对象的Map类型,但是发现还是有些不同的,这个可以用来返回多条记录,具体用法与分析如下。@MapKey用法我查了一下MapKey的用法,这里加上MapKey注解后,还有指定一个字段作为返回Map中...原创 2019-01-08 08:18:23 · 77136 阅读 · 15 评论 -
MyBatis源码分析之防SQL注入
MyBatis源码分析之防SQL注入这一节来讲下MyBatis的防SQL注入,SQL注入大多数也会比较清楚,就是SQL参数对应的字段值时插入混合SQL,如 ** username = or 1= 1** 这种,如果有更恶劣的,带上drop database 这种都是有可能的,所以一般SQL都会进行一定防注入处理,MyBatis其实用法大都清楚,就是**#{paras}和${paras}**两种用...原创 2019-01-18 08:21:46 · 1503 阅读 · 2 评论 -
Mybatis之Mapper调用源码分析
Mybatis之Mapper调用源码分析这一篇是承接前面两篇的,分别为:Mybatis源码解析之配置加载(一), Mybatis源码解析之配置加载(二),前面两篇讲了在Mybatis启动时如何加载配置,这一节就讲在运行时,如何通过session获取Mapper代理类,从而实现对数据库的查询操作。程序首先展示下之前写的程序,main程序在第一篇中有展示,这里就不再完全的贴出来了,获取sess...原创 2019-01-03 08:08:56 · 660 阅读 · 0 评论 -
Mybatis源码分析之Select返回数据分析
Mybatis源码分析之Select返回数据分析在之前的一篇文章中分析了@Select注解的使用方法,在查询方法中我们知可以返回Map类型,也可以返回指针,或者是list集合,或是单条记录,今天就对这几种返回做一个源码分析。Select查询在这里就不需要再写一个demo演示了,用法无非这么多,直接看查询的源码吧。首先在看对应select的查询源码时先看下MyBatis是怎么定义metho...原创 2019-01-07 08:06:48 · 2012 阅读 · 1 评论 -
# Mybatis源码解析之配置加载(二)
Mybatis源码解析之配置加载(二)这一篇是承接上一篇文章Mybatis源码解析之配置加载(一),上一篇原本是想把整个配置加载都分析完全,然后发现内容还是比较多,所以决定分成两篇来说好了,现在就开始剩下的配置分析。配置加载继续回到parseConfiguration方法中,**parseConfiguration()**方法如下:private void parseConfigurat...原创 2019-01-02 08:13:53 · 620 阅读 · 1 评论 -
MyBatis源码分析之@SelectProvider注解使用详解
MyBatis源码分析之@SelectProvider注解使用详解之前讲了MyBatis的配置、plugin、Select查询,还有@MapKey注解的使用与原理,还有返回@ResultMap等等,我原想直接从MyBatis的缓存开始说起,但是想想还是得说一下MyBatis中的@selectProvider,这个注解我也是在用了好久的MyBatis才用到,功能就是用来单独写一个class类与方法...原创 2019-01-11 08:31:57 · 13432 阅读 · 0 评论 -
Mybatis源码解析之配置加载(一)
Mybatis源码解析之配置加载(一)用了好几年的mybatis了,但是很少来钻研mybatis原理所在,最近抽出空来,就把这一整套源码都研究了下,然后发现就是这些东西,mybatis没啥难度,于是决定把研究的这一整套写一个mybatis系列,记录一下,在这些完了以后,顺便写一个小的mybatis框架。1. demo演示还是从用法开始吧,就不开始就从源码说了,mybatis的conf配置文...原创 2019-01-01 11:27:08 · 3416 阅读 · 2 评论 -
MyBatis plugin的使用与源码解析
MyBatis plugin的使用与源码解析这一节来讲下Mybatis中的plugin的使用,plugin作为对执行期间对Executor、StatementHandler的一种增强等等,我见过用的最多的应该就是Mybatis的分页插件PageHelper,PageHelper因为简单易用被广泛用于各种大小工程中,虽说PageHelper使用起来确实挺舒服,但是在遇到一些查询性能上的问题时,Pa...原创 2019-01-05 08:59:55 · 864 阅读 · 0 评论 -
MyBatis注解@Select、@Update分析
MyBatis注解@Select、@Update分析前面几篇文章分别分析了Mybatis中的Configuration的配置信息,MyBatis中的Mapper调用等等,在分析配置信息时只是讲了如何解析xml中的sql查询,但是并没有讲怎么解析Mapper中注解对应的SQL,就是如下:@ResultMap("BaseResultMap")@Select("select id, usernam...原创 2019-01-04 09:47:00 · 5092 阅读 · 0 评论 -
Leveldb数据Compaction源码分析(1)
Leveldb数据Compaction源码分析(1)这一节来讲Leveldb的数据压缩过程,上一节讲了Leveldb的数据寻找过程,文章地址为:但是最后在讲Leveldb中的Leveln的层级寻找时,我想应该是有没有看懂的,直接二分法找到sstable,然后加载缓存就能找到文件,看源码或许有些疑惑,但是这个是和Leveldb的数据压缩过程是有关的,这节就来讲Leveldb的数据压缩过程。...原创 2018-07-31 10:06:52 · 942 阅读 · 2 评论 -
levelDB WriteBatch源码解析
levelDB WriteBatch源码解析上一篇文章中讲了leveldb中WriteBatch、Snapshot使用,但是leveldb毕竟只是一个基础的存储引擎,没有太多的特性或者api使用可以讲,因此便直接从源码上开始,我这就从WriteBatch开始吧。有一些遗漏的以后补充进来,以后再慢慢进行整理。WriteBatch源码我们先看下WriteBatch,Writebat...原创 2018-07-23 08:04:20 · 732 阅读 · 0 评论 -
Leveldb读取数据源码分析
Leveldb读取数据源码分析上一篇文章讲了Snapshot源码,在这一篇文章中原本是要讲version、versionSet这些,但是想想还是从Leveldb的读取和存储开始讲起,Leveldb的存储比较简单,主要麻烦的还是读取这一块,需要判断从memTable、memTable、level0、level层级中分开寻找,如果从上一级中找到了数据,那么下一级就不再继续寻找了,因此寻找要麻烦许多...原创 2018-07-30 07:53:43 · 1086 阅读 · 0 评论 -
level Snapshot源码分析
# level Snapshot源码分析上一篇文章中讲了WriteBatch,这一篇文章中开始讲快照Snapshot,Snapshot在文章中 leveldb中WriteBatch、Snapshot使用中讲过使用方法,这里面就不再继续讲用法了,这一节结合着之前写的Demo来讲源码。Snapshot源码之前写的demo为:private final File data...原创 2018-07-25 07:29:49 · 495 阅读 · 0 评论 -
springboot整合jedisCluster
springboot整合jedisClustermaven依赖springboot整合jedisCluster相当简单,maven依赖如下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </depende原创 2016-11-25 07:26:35 · 7762 阅读 · 0 评论 -
将spring boot应用打入docker中运行
将spring boot应用打入docker中运行这几天研究了一下将spring boot应用打入到docker中运行,先前有一个maven插件,可以直接在src/main中建一个docker文件夹,新建一个Dockerfile文件,在进行编译打包之后,可以直接运行docker插件,相当于在对应的docker目录中执行 docker build .命令,会直接将当前应用打成镜像,然后运行,十分方便,原创 2016-12-05 09:46:27 · 12166 阅读 · 3 评论 -
java,lang.Void类
在一次源码查看ThreadGroup的时候,看到一段代码,为以下: /* * @throws NullPointerException if the parent argument is {@code null} * @throws SecurityException if the current thread cannot create a原创 2016-06-08 16:59:28 · 6524 阅读 · 0 评论