- 博客(496)
- 收藏
- 关注
原创 深度探索JFR - JFR详细介绍与生产问题定位落地 - 1. JFR说明与启动配置
本文基于 OpenJDK 11 并涉及一些之后版本的特性,非 OpenJDK 11 的特性会被特殊标记出来什么是 JFR?我们都知道,黑匣子是用于记录飞机飞行和性能参数的仪器。在飞机出问题后,用于定位问题原因。JFR 就是 Java 的黑匣子。JFR 是 Java Flight Record (Java飞行记录) 的缩写,是 JVM 内置的基于事件的JDK监控记录框架。这个起名就是参考了...
2020-04-01 11:04:22 62424 4
原创 OpenJDK 11 JVM日志相关参数解析与使用
OpenJDK 11是在OpenJDK 8之后的第一个长期支持版本,这一版本在JVM日志配置有了很大改动,主要是规范化,统一化了。在OpenJDK 8中,日志配置有很多状态位,让人摸不着头脑,并且比较难以维护与进一步迭代。在OpenJDK 11终于将JVM日志相关的配置规范起来,统一配置。这篇文章会对于这些配置做一个详尽的说明和解析。一、JVM日志标签JVM日志和我们java代码中的日志,其实...
2020-02-28 16:01:08 5611
原创 Java中对于位运算的优化以及运用与思考
引言随着JDK的发展以及JIT的不断优化,我们很多时候都可以写读起来易读但是看上去性能不高的代码了,编译器会帮我们优化代码。之前大学里面学单片机的时候,由于内存以及处理器性能都极其有限(可能很多时候考虑内存的限制优先于处理器),所以很多时候,利用位运算来节约空间或者提高性能,那么这些优秀的思想,放到目前的Java中,是否还有必要这么做呢?我们逐一思考与验证下(其实这也是一个关于Premature...
2020-01-08 19:02:10 727 4
原创 JEP解读与尝鲜系列1 - Java Valhalla与Java Inline class
涉及到的JEP:Project ValhallaJEP 169: Value ObjectsJEP 218: Generics over Primitive Types这些特性将在JDK14实现Valhalla项目背景最主要的一点就是,让Java适应现代硬件:在Java语言发布之初,一次内存访问和一次数字计算的消耗时间是差不多的,但是现在,一次内存访问耗时大概是一次数值计算的2...
2019-10-22 19:54:09 2981 3
原创 从JDK8升级到JDK11,看这篇就足够了
原文地址:https://blog.codefx.org/java/java-11-migration-guide/。 在原文的基础上,增加了一些我遇到的具体的坑还有在特定场景下的解决方案,供大家参考一些背景在背景知识,我们会讨论一些关于新的JDK Release周期,OpenJDK特性归一化,LTS(Long-term support长期支持版本)的事情。1. 新的发布周期这个就可以...
2019-10-17 15:47:27 24944 2
原创 OpenJDK11与Spring Cloud Finchley的不兼容问题与解决
本文的环境:OpenJDK 11.0.4,Spring Cloud finchley SR4,Spring Boot 2.0.3最近遇到了一个问题,在feign调用的时候,时常会出现这样一个奇怪的错误:2019-10-07 08:00:00.620 ERROR [xxx,e1ba4c7540954aa3,871b99c4576d42e3] [24] [XNIO-2 task-286][xx...
2019-10-07 17:37:58 5523
原创 OpenJDK8升级到OpenJDK11需要注意的修改与异常
目前,JDK两个长期版本是8和11,由于大部分项目使用的还是8,所以从8升级到11会遇到一些困难。本篇文章会基于实践遇到的问题,分类总结可能1. Java模块化从Java 9开始,由于引入了JPMS(https://openjdk.java.net/projects/jigsaw/spec/),开始更精细化的包管理和模块复用,导致很多JDK默认加载的包被移除了。其中我们可能会碰到的例如:...
2019-09-11 12:26:23 15765 1
原创 JDK核心JAVA源码解析(7)- 集合相关(1) - LinkedList
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中集合类LinkedList进行分析,通过代码解释Java中的Fail-fast设计思想,以及LinkedList底层实现和与ArrayList对比下的就业场景。本文会...
2019-09-04 18:33:56 4903
原创 Spring cloud实现FeignClient指定Zone调用
本文基于Spring Cloud Fincheley SR3背景介绍目前项目多个区域多个集群,这些集群共用同一个Eureka集群。通过设置eureka.instance.metadata-map.zone设置不同实例所属的zone,zone之间不互相调用,只有zone内部调用(其实这里用zone做了集群隔离,实际上集群肯定是跨可用区的,这里的eureka中的zone在我们项目里面并不是可用...
2019-06-13 15:52:05 19001 8
原创 Spring Cloud Finchley OpenFeign的重试配置相关的坑
如题,本文基于Spring Cloud Finchley.SR2OpenFeign的重试OpenFeign配置重试后,逻辑分析对比Daltson和Finchley的基本组件,发现Ribbon还有Hystrix的重试逻辑基本没变,feign编程openfeign之后,增加了个重试逻辑,我们用下面这个图来展示其中的逻辑:首先搞清楚调用链:可以总结如下:OpenFeign有自己的重试...
2019-04-24 12:30:53 11972 4
原创 Ribbon的AvailabilityFilteringRule的坑(Spring Cloud Finchley.SR2)
如题,本文基于Spring Cloud Finchley.SR2我们项目配置了AvailabilityFilteringRule作为所有Ribbon调用的负载均衡规则,它有那些坑呢(理解歧义和注意点)?首先来看源码,核心是choose方法:public Server choose(Object key) { int count = 0; //通过轮询选择一个server...
2019-04-24 12:04:12 20607 2
原创 分布式缓存存储算法与实践思考
最近遇到一个问题,可能很多人也遇到过:由于业务量的增长,缓存节点个数不够用了。现在的Redis-Cluster直接就加个节点就解决了,但是之前Redis-Cluster不稳定时,我们并不敢用这个,而是通过自己实现分布式缓存Redis实现,在遇到这个问题时,碰到不少麻烦。由于我们分片算法很简单,直接用户id的哈希值对节点个数取余。假设原来是3,现在是4,那么至少有1-(3/4*3)=四分之三的数据...
2019-04-12 11:40:18 1656
原创 大数据级新闻去重实现 - 1.在线实时方案
最近针对爬虫爬下来的新闻进行去重。这个去重要考虑很多方面:不同网站发布的要点新闻,基本上是有通稿的,内容大同小异,基本一致,有些细节不同,需要去掉重复的,保留质量最好的。去重对比的时间跨度是多大呢?可能刚开始我们会考虑搜索整个库,每篇文章都对比,但是这样会效率太差了,没有必要。新闻有发布时间,以新闻发布时间前后一周为时间段, 对比这个时间段内的新闻即可。发布的新闻可能有很类似的,例如一个新...
2019-02-25 16:58:59 3929 1
原创 BookKeeper全解(1)-BookKeeper简介和快速上手
什么是BookKeeperBookKeeper是一个提供日志条目流存储持久化的服务框架。特别适合日志流存储,一个比较经典的应用是作为消息队列Pulsar的持久框架。那么BookKeeper是怎样产生的呢?这个灵感来源于Hadoop生态系统。我们知道,Haddop生态系统的文件存储是HDFS,HDFS包含一种节点叫做NameNode,用于记录所有的操作,在宕机的时候可以通过这些记录进行恢复。...
2018-10-16 16:06:44 23175 2
原创 Redis系列-生产应用篇-分布式锁(5)-单进程Redis分布式锁的Java实现(Redisson使用与底层实现)-原子锁类
Redisson单进程Redis分布式悲观锁的使用与实现本文基于Redisson 3.7.54. 原子锁类Redisson中实现了两种原子锁类:RAtomicLong和RAtomicDouble,还有RLongAdder和RDoubleAdderRAtomicDouble和RAtomicLong其实一样的,RLongAdder和RDoubleAdder其实原理也是一样的,这里我们只说R...
2018-09-19 10:43:58 16001
原创 JDK核心JAVA源码解析(6) - 原子类AtomicLong与LongAdder对比
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中的原子类以及JDK1.8新增的LongAdder进行对比,探究它们的原理以及为何LongAdder在多线程环境下比较快。本文基于JDK 1.8性能对比:测试程...
2018-09-18 14:10:42 8587 18
原创 Redis系列-生产应用篇-分布式锁(4)-单进程Redis分布式锁的Java实现(Redisson使用与底层实现)-读写锁
Redisson单进程Redis分布式悲观锁的使用与实现 本文基于Redisson 3.7.53. 读写锁Redisson的分布式可重入读写锁RReadWriteLock Java对象实现了java.util.concurrent.locks.ReadWriteLock接口。同时还支持自动过期解锁。该对象允许同时有多个读取锁,但是最多只能有一个写锁。写锁是排它锁,获取写锁的时...
2018-09-13 19:43:38 15753
原创 Redis系列-生产应用篇-分布式锁(3)-单进程Redis分布式锁的Java实现(Redisson使用与底层实现)-公平锁
Redisson单进程Redis分布式悲观锁的使用与实现 本文基于Redisson 3.7.52. 公平锁这种锁的使用方式和Java本身框架中的FairLock一模一样:RLock fairLock = redisson.getFairLock("testLock");try{ // 最常见的使用方法 fairLock.lock();
2018-09-11 20:34:09 18749
原创 Redis系列-生产应用篇-分布式锁(2)-单进程Redis分布式锁的Java实现(Redisson使用与底层实现)-可重入锁
Redisson单进程Redis分布式悲观锁的使用与实现 本文基于Redisson 3.7.51. 可重入锁(Reentrant Lock)这种锁的使用方式和Java本身框架中的Reentrant Lock一模一样RLock lock = redisson.getLock("testLock");try{ // 1. 最常见的使用方法 //lock....
2018-09-05 16:22:35 16869
原创 Redis系列-生产应用篇-分布式锁(1)-单进程Redis分布式锁实现思路
什么是分布式锁针对共享内存模型的程序(例如JAVA程序),锁就是一个非常常用的机制。 一般简单分为悲观锁和乐观锁。悲观锁就是你获取这块数据的锁之后,别人就无法访问或操作这块数据,直到你释放这个锁。乐观锁一般就是CAS更新。 在单进程内内存的锁,只控制进程内数据的,就是非分布式锁。相反的,跨进程,需要锁住多个进程访问数据的锁就是分布式锁。 悲观锁一般由Redis的SETNX实现,乐观锁一般...
2018-09-03 17:12:25 15339 1
原创 JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中的MMAP的文件映射读写机制,来分析为何很多告诉框架用了这个机制,以及这个机制好在哪里,快在哪里。 本文基于JDK 1.8JAVA File MMA...
2018-07-20 12:14:14 21430 5
原创 JDK核心JAVA源码解析(4) - 堆外内存、零拷贝、DirectByteBuffer以及针对于NIO中的FileChannel的思考
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对堆外内存与DirectBuffer进行深入分析,了解Java对于堆外内存处理的机制,为下一篇文件IO做好准备Java堆栈内存与堆外内存首先我们扔出一个公式:...
2018-07-17 17:05:18 17209 29
原创 JDK核心JAVA源码解析(3) - 引用相关
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对引用分析,是后面分析各种框架机制的基础Java引用相关强引用(Strong Reference)强引用就是指在程序代码之中普遍存在的,一般的new一个对象并...
2018-07-10 20:44:45 9168
原创 JDK核心JAVA源码解析(2) - String(上)
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。 本文从JDK 1.8 & JDK 9.0 String的组成区别开始讨论,之后以9.0为准讨论代码2. String类2.1. String的基本组成(1....
2018-06-25 16:12:46 11692
原创 Spring Cloud Ribbon 全解 (8) - SpringCloud环境下Ribbon+Eureka配置
本文基于SpringCloud-Dalston.SR5一般SpringCloud环境下是Ribbon+Eureka一起使用的:SpringCloud环境下Ribbon+Eureka配置示例项目实例项目地址:https://github.com/HashZhang/ScanfoldAll/tree/master/Scanfold-SpringCloud/Scanfold-Sp...
2018-05-16 11:05:24 25217
原创 Spring Cloud Ribbon 全解 (7) - SpringCloud环境下纯Ribbon(不包含Eureka)重试配置
本文基于SpringCloud-Dalston.SR5前面已经分析了Ribbon各个组件详细的源码,以及整体的流程SpringCloud环境下纯Ribbon(不包含Eureka)使用与启动分析:示例项目以下项目可以参考:https://github.com/HashZhang/ScanfoldAll/tree/master/Scanfold-SpringCloud/Scan...
2018-05-16 11:03:08 7705 3
原创 Spring Cloud Ribbon 全解 (6) - SpringCloud环境下纯Ribbon(不包含Eureka)使用与启动分析
本文基于SpringCloud-Dalston.SR5前面已经分析了Ribbon各个组件详细的源码,以及整体的流程SpringCloud环境下纯Ribbon(不包含Eureka)使用与启动分析:示例项目以下项目可以参考:https://github.com/HashZhang/ScanfoldAll/tree/master/Scanfold-SpringCloud/Scan...
2018-05-16 11:01:48 21833 1
原创 Spring Cloud Ribbon 全解 (5) - 基本组件实现源码(3)
本文基于SpringCloud-Dalston.SR5我们继续分析如下组件:所有Ribbon负载均衡器需要实现的接口IClient服务实例列表维护机制实现的接口ServerList负载均衡数据记录LoadBalancerStats负责选取Server的接口ILoadBalancer负载均衡选取规则实现的接口IRule检查实例是否存活实现的接口IPing服务实例列表更新机制实现...
2018-05-08 08:36:34 19059
原创 Spring Cloud Ribbon 全解 (4) - 基本组件实现源码(2)
本文基于SpringCloud-Dalston.SR5我们继续逐个分析所有Ribbon负载均衡器需要实现的接口IClient服务实例列表维护机制实现的接口ServerList负载均衡数据记录LoadBalancerStats负责选取Server的接口ILoadBalancer负载均衡选取规则实现的接口IRule检查实例是否存活实现的接口IPing服务实例列表更新机制实现的接口...
2018-05-08 08:34:32 18077
原创 Spring Cloud Ribbon 全解 (3) - 基本组件实现源码(1)
本文基于SpringCloud-Dalston.SR5上一篇我们了解到Ribbon主要由如下几个组件组成:所有Ribbon负载均衡器需要实现的接口IClient服务实例列表维护机制实现的接口ServerList负载均衡数据记录LoadBalancerStats负责选取Server的接口ILoadBalancer负载均衡选取规则实现的接口IRule检查实例是否存活实现的接口IPi...
2018-03-27 19:14:43 18767 4
原创 Spring Cloud Ribbon 全解 (2) - 基本组件简介
本文基于SpringCloud-Dalston.SR5对于一个负载均衡器,就是以用户请求为输入,请求响应为输出的代理模块。 这个模块基本上就是包括一个服务实例列表,根据请求还有负载均衡规则选择一个合适的实例来执行请求并返回响应。 这个服务实例列表,一般包含每个实例基本信息,然后还有,这个实例相关的负载均衡统计信息(例如请求失败多少次,有多少正在处理的请求等等,用于实例过滤和负载均衡...
2018-03-27 11:53:12 14938
原创 Spring Cloud Eureka 全解 (8) - 安全配置
本文基于SpringCloud-Dalston.SR5一般的,Eureka在内网服务,我们不会对于外网暴露Eureka端口,所以一般Eureka不做任何验证。假设我们想进一步增强Eureka的安全性,可以结合spring security来简单配置一些安全设置首先在Spring Cloud Eureka Server所在的项目中添加对于spring security的依赖:<...
2018-03-26 18:14:21 12535
原创 Spring Cloud Ribbon 全解 (1) - 总览篇
本文基于SpringCloud-Dalston.SR5Ribbon是一个客户端负载均衡解决方案,简单来说,就是从Eureka获取可用服务实例列表,然后将请求根据某种策略发到这些实例上面执行What is Spring Cloud Netflix?其官方文档中对自己的定义是: Spring Cloud Netflix provides Netflix OSS integrat...
2018-03-05 18:11:25 27990
原创 Spring Cloud Eureka 全解 (7) - 生产配置最佳实践
本文基于SpringCloud-Dalston.SR5可以实现比较快的服务上下线:EurekaServer配置:#eureka server刷新readCacheMap的时间,注意,client读取的是readCacheMap,这个时间决定了多久会把readWriteCacheMap的缓存更新到readCacheMap上#默认30seureka.server.respons
2018-01-24 17:47:46 63013 9
原创 Spring Cloud Eureka 全解 (6) - 一些热门QA
本文基于SpringCloud-Dalston.SR5Eureka服务实例启动时,是否会立刻向EurekaServer注册?是的,立刻会。EurekaClient在每次实例状态发生改变时,有一个Listener:statusChangeListener = new ApplicationInfoManager.StatusChangeListener() { @Ov
2018-01-24 17:44:02 16049 2
原创 Spring Cloud Eureka 全解 (5) - 自我保护机制
本文基于SpringCloud-Dalston.SR5自我保护机制 关闭自我保护机制(默认是打开的):eureka.server.enable-self-preservation=false自我保护机制:默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒)。但是当网络分区故障发生时,微服务
2018-01-24 17:07:36 62452 6
原创 Spring Cloud Eureka 全解 (4) - 核心流程-服务与实例列表获取详解
本文基于SpringCloud-Dalston.SR5关于服务与实例列表获取EurekaClient端我们从Ribbon说起:EurekaClient也存在缓存,应用服务实例列表信息在每个EurekaClient服务消费端都有缓存。一般的,Ribbon的LoadBalancer会读取这个缓存,来知道当前有哪些实例可以调用,从而进行负载均衡。这个loadbalancer同样也有缓
2018-01-24 16:29:58 34339
原创 一次由于YoungGC引起的性能问题分析
问题现象应用用druid连接池,设置慢SQL时间为500ms。在线上应用报了一些但是不多的慢查询日志,并且这个慢查询日志居然是单条插入的语句。后台数据库是MySQL,有查询统计日志监控,并没有发现很慢的插入语句。觉得很奇怪,需要仔细定位下问题定位为了确认问题,搭建压测环境,并在应用和MySQL所在的机器上进行抓包分析。压测开始后,又发现了很多是单条插入语句的慢查询日
2018-01-19 12:26:26 12577
原创 Log4j2一些tips与最佳实践
Log4j2相对于log4j来说扩展了多种接口,并重新定义了日志记录流程,并且引入了一些框架例如Disruptor来加速。Log4j2无论在日志记录上,还有效率速率上都相对于log4j有很大的进步,下面我们来看一些比较有意思的使用和配置的最佳实践。使用Tip1.方法参数使用Java8 lambda表达式:在java8之前,有时候log日志的参数是某个方法,可能很耗时,为了提高性
2018-01-15 18:23:33 14093
原创 Tomcat容器下Zuul网关加解密后的第一次请求出现400错误的问题
问题现象某些前端发来的请求会在前端加密发送到网关,并在网关解密之后发到真正的微服务,并将结果加密返回给前端。 实现网关加密后,发现一次加密请求后,紧接着的非加密GET请求,就会出现400的错误。再发一次相同的GET请求,就会正常,观察后端微服务的收到网关请求的accessLog,发现接收到的请求解析有问题:## 400的请求- - - [04/Jan/2018:19:48:30 +
2018-01-05 17:37:32 16439 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人