12 张哈希

尚未进行身份认证

我要认证

暂无相关简介

等级
TA的排名 1k+

Project Reactor 深度解析 - 2. 响应式编程调试,FLow的概念设计以及实现

响应式编程的首要问题 - 不好调试我们在分析传统代码的时候,在哪里打了断点,就能看到直观的调用堆栈,来搞清楚,谁调用了这个代码,之前对参数做了什么修改,等等。但是在响应式编程中,这个问题就很麻烦。来看下面的例子。public class FluxUtil1 { public static Flux<Integer> test(Flux<Integer> integerFlux) { return FluxUtil2.test2(integerFlux.ma

2020-08-03 19:45:53

HashMap 的 defaultLoadFactor 的一种推导计算思路

1. 为啥需要 defaultLoadFactor现在主流的 HashMap,一般的实现思路都是开放地址法+链地址法的方式来实现。即数组 + 链表的实现方式,通过计算哈希值,找到数组对应的位置,如果已存在元素,就加到这个位置的链表上。在 Java 8 之后,链表过长还会转化为红黑树。红黑树相较于原来的链表,多占用了一倍的空间,但是查询速度快乐一个数量级,属于空间换时间。 同时,链表转换红黑树也是一个耗时的操作。并且,一个效率高的哈希表,这个链表不应该过长。所以,如果数组的很多元素上面已经有值了,那么

2020-08-03 19:45:09

Project Reactor 深度解析 - 1. 响应式编程介绍,实现以及现有问题

现在, Java 的各种基于 Reactor 模型的响应式编程库或者框架越来越多了,像是 RxJava,Project Reactor,Vert.x 等等等等。在 Java 9, Java 也引入了自己的 响应式编程的一种标准接口,即java.util.concurrent.Flow这个类。这个类里面规定了 Java 响应式编程所要实现的接口与抽象。我们这个系列要讨论的就是Project Reactor这个实现。这里也提一下,为了能对于没有升级到 Java 9 的用户也能兼容,java.util.conc

2020-07-29 20:09:35

Spring Cloud升级之路 - Hoxton - 10. 网关重试带Body的请求Body丢失的问题

带 Body 的重试 Body 丢失之前我们的配置里面,只对 Get 请求针对 500 响应码重试,但是针对像 Post 这样的请求,只对那种根本还没到发送 Body 的阶段的异常(例如连接异常)这种重试,那么如果我们要对带 Body 的 Post 进行重试呢?或者就是用 Postman 构建一个带 Body 的 Get 请求,重试是否正常呢?我们启动之前第6节的 EurekaServer,修改/test-exception-thrown接口,增加 RequestBody 参数:@RequestMap

2020-07-29 20:03:29

Spring Cloud升级之路 - Hoxton - 9. 针对网关非 Get 请求的重试

针对网关非 Get 请求的重试在之前的系列里面Spring Cloud升级之路 - Hoxton - 5. 实现微服务调用重试,我们针对 OpenFeign 和 Spring Cloud Gateway 都设置了重试。对于 OpenFeign:Get请求:任何非200 响应码,任何异常,都会重试。非 Get 请求:任何IOException(除了SocketTimeOutException,这个是read time out 导致的),还有 redilience 断路器异常,都会重试,其他的都不重试

2020-07-19 20:54:48

JVM相关 - SafePoint 与 Stop The World 全解(基于OpenJDK 11版本)

本文基于 OpenJDK 11在分析线上 JVM 性能问题的时候,我们可能会碰到下面这些场景:1.GC 本身没有花多长时间,但是 JVM 暂停了很久,例如下面:2.JVM 没有 GC,但是程序暂停了很久,而且这种情况时不时就出现。这些问题一般和 SafePoint 还有 Stop the World 有关。什么是 SafePoint?什么是 Stop the world?他们之间有何关系?我们先来设想下如下场景:当需要 GC 时,需要知道哪些对象还被使用,或者已经不被使用可以回收了,这样.

2020-07-19 20:32:21

Spring Cloud升级之路 - Hoxton - 8. 修改实例级别的熔断为实例+方法级别

实例级别的熔断带来的困扰如之前系列(Spring Cloud升级之路 - Hoxton - 4. 使用Resilience4j实现实例级别的隔离与熔断)所述,我们实现了实例级别的熔断。但是在生产中发现,并不是所有情况下都表现良好。首先如果发布了新接口,但是不小心回滚了,调用新接口就会报错,从而导致整个实例都不能访问。还有就是某些实例某个接口出现了问题,但是其他接口是好的,熔断掉整个实例有点浪费。于是乎,我们将实例级别的熔断改成 实例 + 方法级别。对于 OpenFeign 修改首先,我们只针对断路器进

2020-07-14 10:24:08

深度探索JFR - JFR详细介绍与生产问题定位落地 - 3. 各种Event详细说明与JVM调优策略(3)

本文基于 OpenJDK 113. 虚拟机相关 Event3.3. JIT即时编译相关JIT 即时编译可能会遇到编译后的代码缓存占满,或者因为空间有限或者代码设计问题,导致某些关键方法需要重编译导致性能问题,以及因为代码块过大导致编译失败从而性能有问题,这些问题我们可以通过 JFR 中相关的 Event 进行查询。JFR 对于 Java 开发可以完全替换 JVM 编译日志。额外讲解:JIT 相关的知识首先,这里简单介绍下 JIT 相关的知识(这里我推荐看 O’Rerilly 上面的 Java.

2020-07-10 19:01:12

MySQL原理 - InnoDB引擎 - 行记录存储 - Redundant行格式

本文基于 MySQL 8在上一篇:MySQL原理 - InnoDB引擎 - 行记录存储 - Compact格式 中,我们介绍了什么是 InnoDB 行记录存储以及 Compact 行格式,在这一篇中,我们继续介绍其他三种行格式。Redundant 行格式这个是最古老的,最简单粗暴的行格式了,现在基本上已经不用了,因为占用空间最多,从而导致内存碎片化最严重,是最低效的行格式了(针对现在varchar字段使用的更多,而对于 varchar 字段改变长度的更新大部分情况下就是将原有行的数据标记为已删除,.

2020-07-09 18:14:00

MySQL原理 - InnoDB引擎 - 行记录存储 - Compact 行格式

MySQL 服务器上负责对表中数据的读取和写入工作的部分是存储引擎,比如 InnoDB、MyISAM、Memory 等等,不同的存储引擎一般是由不同的人为实现不同的特性而开发的,目前OLTP业务的表如果是使用 MySQL 一般都会使用 InnoDB 引擎,这也是默认的表引擎。为了能说明 InnoDB 引擎的原理,我们必须先搞清楚 InnoDB 的存储结构,通过这些存储结构才能实现 InnoDB 的事务特性。首先我们来看看 InnoDB 表的一行数据是如何存储的。InnoDB是一个持久化的存储引擎,也就是

2020-06-30 20:31:42

JFR定位由于可能的JDK11的bug导致Log4j2 CPU占用100%的问题

本文基于OpenJDK 11最近使用Spring Cloud Gateway的时候,遇到了一个奇怪的问题:线上有3个 API 网关实例,压力均衡,平稳运行3天后,突然有一个实例,CPU飚高,并且响应时间增加很多,从几十毫秒涨到了几分钟。线上是 k8s 管理容器,立刻停掉了这个 pod,重建,恢复正常。线上我们开启了 JFR 记录(可以参考我的另外系列文章:Java 监控 JFR),通过 JMC 查看下出问题的 JFR 记录。首先我们来看 GC,我们的 GC 算法是 G1,主要通过 G1 Gar.

2020-06-28 20:07:56

JDK核心JAVA源码解析(8) - 自动封箱拆箱与效率的思考

想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本文基于 Java 14在JDK1.5引入自动装箱/拆箱,让开发更高效。自动装箱时编译器调用valueOf()将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。自动装箱是将 boolean 值转换成 Bo

2020-06-16 20:19:38

Spring Cloud升级之路 - Hoxton - 7. 后续更新(WebFlux等)

1. 修正实例列表乱序导致的负载均衡重试相同实例的问题虽然之前考虑了通过每个请求的traceId隔离负载均衡的position来实现重试不会重试相同实例的问题,但是没有考虑在负载均衡过程中,实例列表的更新。例如:请求第一次调用负载均衡,实例列表是:[实例1,实例2],position为1,对2取余=1,所以请求发送到实例2上面了请求失败,触发重试,实例列表缓存失效,更新后变成了:[实例2,实例1],position为2,对2取余=0,所以请求又发送到实例2上面了private Response

2020-06-15 15:21:57

MySQL原理 - 字符集与排序规则

任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集)。这些字符如何排序呢?决定字符排序的规则就是排序规则。查看内置字符集与比较规则通过show charset;命令,可以查看所有的字符集。以下仅展示了我们常用的字符集:+----------+---------------------------------+---------------------+--------+| Charset | Descrip

2020-06-11 17:51:02

Spring全解系列 - @Import注解

本文基于 Spring 5.2.x@Import注解@Import是Spring基于 Java 注解配置的主要组成部分。@Import注解提供了@Bean注解的功能,同时还有原来Spring基于 xml 配置文件里的<import>标签组织多个分散的xml文件的功能,当然在这里是组织多个分散的@Configuration的类。下面将分别说明@Import注解的功能。1. 引入其他的@Configuration假设有如下接口和两个实现类:package com.testinter.

2020-06-09 20:17:01

Spring Cloud升级之路 - Hoxton - 6. 场景测试

准备工作首先拉取项目源码:git clone https://github.com/HashZhang/spring-cloud-scaffold.git打开其中的 spring-cloud-hoxton 项目。启动Eureka启动zone1-service-provider-instance1,zone1-service-provider-instance2,zone1-service-provider2-instance1,zone2-service-provider-instance1这

2020-06-05 17:39:26

Spring Cloud升级之路 - Hoxton - 5. 实现微服务调用重试

feign 实现重试我们继续使用resilience4j实现重试,根据上一篇Spring Cloud升级之路 - Hoxton - 4. 使用Resilience4j实现实例级别的隔离与熔断,我们已经加载了RetryReqistry这个核心配置Bean。Retry相关的配置:create-and-configure-retry配置项默认值说明maxAttempts3最大重试次数,不包括本身那次调用waitDuration500[ms]重试间隔时间interva

2020-06-05 17:38:52

Spring Cloud升级之路 - Hoxton - 4. 使用Resilience4j实现实例级别的隔离与熔断

如何不启用Hystrix由于我们的入口注解类从@SpringCloudApplication替换成了SpringBootApplication,这样不会启用Spring-Cloud-CircuitBreaker。引入的Hystrix依赖也就没有效果。请参考本系列第二节: Spring Cloud升级之路 - Hoxton - 2.入口类注解修改与OpenFeign的改造使用Resilience4j实现实例级别的隔离与熔断为什么需要实例级别的熔断呢?因为某个微服务可能某些实例暂时不可用,我们希望在重试的

2020-06-05 11:13:39

Spring Cloud升级之路 - Hoxton - 3. 负载均衡从ribbon替换成spring-cloud-loadbalancer

本系列示例与胶水代码地址: https://github.com/HashZhang/spring-cloud-scaffold负载均衡Ribbon替换成Spring Cloud Load BalancerSpring Cloud Load Balancer并不是一个独立的项目,而是spring-cloud-commons其中的一个模块。 项目中用了Eureka以及相关的 starter,想完全剔除Ribbon的相关依赖基本是不可能的,Spring 社区的人也是看到了这一点,通过配置去关闭Ribbo.

2020-06-04 11:14:18

Spring Cloud升级之路 - Hoxton - 2.入口类注解修改与OpenFeign的改造

本系列示例与胶水代码地址: https://github.com/HashZhang/spring-cloud-scaffold入口类注解修改之前的项目,我们也许会用@SpringCloudApplication作为我们入口类的注解。这个注解包括:@SpringBootApplication@EnableDiscoveryClient@EnableCircuitBreakerpublic @interface SpringCloudApplication {}其中的@EnableDis.

2020-05-28 18:43:28

查看更多

CSDN身份
  • 博客专家
勋章 我的勋章
  • 新人勋章
    新人勋章
    用户发布第一条blink获赞超过3个即可获得
  • 阅读者勋章Lv1
    阅读者勋章Lv1
    授予在CSDN APP累计阅读博文达到3天的你,是你的坚持与努力,使你超越了昨天的自己。
  • 专栏达人
    专栏达人
    授予成功创建个人博客专栏的用户。专栏中添加五篇以上博文即可点亮!撰写博客专栏浓缩技术精华,专栏达人就是你!
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 博客之星
    博客之星
    授予通过"CSDN博客之星评选"中脱颖而出的十大博客之星称号的用户。
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。
  • 学习力
    学习力
    《原力计划【第二季】》第一期主题勋章 ,第一期活动已经结束啦,小伙伴们可以去参加第二期打卡挑战活动获取更多勋章哦。
  • 博客之星-入围
    博客之星-入围
    授予每年博客之星评选结果第21-200名的用户
  • 原力新人
    原力新人
    在《原力计划【第二季】》打卡挑战活动中,成功参与本活动并发布一篇原创文章的博主,即可获得此勋章。