-
深入分析Java反射(一)-核心类库和方法
所属栏目:[Java] 日期:2020-12-15 热度:169
前提 Java反射的API在JavaSE1.7的时候已经基本完善, 但是本文编写的时候使用的是Oracle JDK11 ,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。 本文主要介绍反射的基本概念以及核心类 Class 、 Constructor 、 Method[详细]
-
SpringBoot使用Nacos进行服务注册发现与配置管理
所属栏目:[Java] 日期:2020-12-15 热度:128
前提 最近由于业务发展,需要调研一套完善和主流的基础架构,进行中台化(微服务)的实施,考虑到技术栈切换到 SOFAStack 。既然整个体系都切换到蚂蚁金服的技术栈,那么自然考虑一些基础组件如服务注册发现、配置管理等都切换为阿里的技术栈。考虑到目前比[详细]
-
线程上下文类加载器ContextClassLoader内存泄漏隐患
所属栏目:[Java] 日期:2020-12-15 热度:183
前提 今天( 2020-01-18 )在编写 Netty 相关代码的时候,从 Netty 源码中的 ThreadDeathWatcher 和 GlobalEventExecutor 追溯到两个和线程上下文类加载器 ContextClassLoader 内存泄漏相关的 Issue : ThreadDeathWatcher causes custom classLoader script[详细]
-
Mybatis代码生成器Mybatis-Generator使用详解
所属栏目:[Java] 日期:2020-12-15 热度:99
前提 最近在做创业项目的时候因为有比较多的新需求,需要频繁基于 DDL 生成 Mybatis 适合的实体、 Mapper 接口和映射文件。其中,代码生成器是 MyBatis Generator(MBG) ,用到了 Mybatis-Generator-Core 相关依赖,这里通过一篇文章详细地分析这个代码生成器[详细]
-
你的SpringBoot应用真的部署更新成功了吗
所属栏目:[Java] 日期:2020-12-15 热度:168
前提 当我们在生产环境部署了 SpringBoot 应用的时候,虽然可以通过 Jenkins 的构建状态和 Linux 的 ps 命令去感知应用是否在新的一次发布中部署和启动成功,但是这种监控手段是运维层面的。那么,可以提供一种手段能够在应用层面感知服务在新的一次发布中的[详细]
-
基于Netty和SpringBoot实现一个轻量级RPC框架-Client端请求响应
所属栏目:[Java] 日期:2020-12-15 热度:148
前提 前置文章: 《基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇》 《基于Netty和SpringBoot实现一个轻量级RPC框架-Server篇》 《基于Netty和SpringBoot实现一个轻量级RPC框架-Client篇》 前一篇文章简单介绍了通过动态代理完成了 Client 端契约接口[详细]
-
基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇
所属栏目:[Java] 日期:2020-12-15 热度:119
基于Netty和SpringBoot实现一个轻量级RPC框架-协议篇 前提 最近对网络编程方面比较有兴趣,在微服务实践上也用到了相对主流的 RPC 框架如 Spring Cloud Gateway 底层也切换为 Reactor-Netty ,像 Redisson 底层也是使用 Netty 封装通讯协议,最近调研和准备[详细]
-
深入分析Java反射(六)-反射调用异常处理
所属栏目:[Java] 日期:2020-12-15 热度:184
前提 Java反射的API在JavaSE1.7的时候已经基本完善, 但是本文编写的时候使用的是Oracle JDK11 ,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。 本文主要介绍一个使用反射一定会遇到的问题-反射调用异常处理。 反射调用[详细]
-
一个基于RabbitMQ的可复用的事务消息方案
所属栏目:[Java] 日期:2020-12-15 热度:179
前提 分布式事务是微服务实践中一个比较棘手的问题,在笔者所实施的微服务实践方案中,都采用了折中或者规避强一致性的方案。参考 Ebay 多年前提出的本地消息表方案,基于 RabbitMQ 和 MySQL ( JDBC )做了轻量级的封装,实现了低入侵性的事务消息模块。本[详细]
-
理解RabbitMQ中的AMQP-0-9-1模型
所属栏目:[Java] 日期:2020-12-15 热度:118
前提 之前有个打算在学习RabbitMQ之前,把AMQP详细阅读一次,挑出里面的重点内容。后来找了下RabbitMQ的官方文档,发现了有一篇文档专门介绍了RabbitMQ中实现的AMQP模型部分,于是直接基于此文档和个人理解写下这篇文章。 AMQP协议 AMQP全称是Advanced Messa[详细]
-
深入分析Java反射(七)-简述反射调用的底层实现
所属栏目:[Java] 日期:2020-12-15 热度:197
前提 Java反射的API在JavaSE1.7的时候已经基本完善, 但是本文编写的时候使用的是Oracle JDK11 ,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。 本文主要介绍反射调用的底层实现,当然还没有能力分析JVM的实现,这里只分[详细]
-
深入分析Java反射(八)-优化反射调用性能
所属栏目:[Java] 日期:2020-12-15 热度:101
Java反射的API在JavaSE1.7的时候已经基本完善, 但是本文编写的时候使用的是Oracle JDK11 ,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。 前一篇文章已经介绍了反射调用的底层原理,其实在实际中对大多数Java使用者来说[详细]
-
冷饭新炒:理解Snowflake算法的实现原理
所属栏目:[Java] 日期:2020-12-15 热度:116
前提 Snowflake (雪花)是 Twitter 开源的高性能 ID 生成算法(服务)。 上图是 Snowflake 的 Github 仓库, master 分支中的 REAEMDE 文件中提示:初始版本于 2010 年发布,基于 Apache Thrift ,早于 Finagle (这里的 Finagle 是 Twitter 上用于 RPC 服[详细]
-
编写一个可复用的SpringBoot应用运维脚本
所属栏目:[Java] 日期:2020-12-15 热度:99
前提 作为 Java 开发者,很多场景下会使用 SpringBoot 开发 Web 应用,目前微服务主流 SpringCloud 全家桶也是基于 SpringBoot 搭建的。 SpringBoot 应用部署到服务器上,需要编写运维管理脚本。本文尝试基于经验,总结之前生产使用的 Shell 脚本,编写一个[详细]
-
深入分析Java反射(三)-泛型
所属栏目:[Java] 日期:2020-12-15 热度:150
前提 Java反射的API在JavaSE1.7的时候已经基本完善, 但是本文编写的时候使用的是Oracle JDK11 ,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。 本文主要介绍反射中一个比较难的问题-泛型。 泛型的简介 泛型是在2004年Ja[详细]
-
通过源码理解Spring中@Scheduled的实现原理并且实现调度任务动态
所属栏目:[Java] 日期:2020-12-15 热度:54
前提 最近的新项目和数据同步相关,有定时调度的需求。之前一直有使用过 Quartz 、 XXL-Job 、 Easy Scheduler 等调度框架,后来越发觉得这些框架太重量级了,于是想到了 Spring 内置的 Scheduling 模块。而原生的 Scheduling 模块只是内存态的调度模块,不[详细]
-
深入理解Java的动态编译
所属栏目:[Java] 日期:2020-12-15 热度:106
前提 笔者很久之前就有个想法:参考现有的主流 ORM 框架的设计,造一个 ORM 轮子,在基本不改变使用体验的前提下把框架依赖的大量的反射设计去掉,这些反射 API 构筑的组件使用 动态编译 加载的实例去替代,从而可以得到接近于直接使用原生 JDBC 的性能。于[详细]
-
SonarQube搭建手记
所属栏目:[Java] 日期:2020-12-15 热度:113
前提 这篇文章记录的是 SonarQube 服务搭建的详细过程,应用于云迁移后的 PipleLine 的代码扫描环节。 笔者有软件版本升级强迫症,一般喜欢使用软件的最新版本,编写此文的时候( 2020-05-17 ) SonarQube 的最新版本为 8.3.1 。 SonarQube简介 SonarQube是[详细]
-
理解和运用Java中的Lambda
所属栏目:[Java] 日期:2020-12-15 热度:57
前提 回想一下, JDK8 是2014年发布正式版的,到现在为( 2020-02-08 )止已经过去了5年多。 JDK8 引入的两个比较强大的新特性是 Lambda 表达式(下文的 Lambda 特指 JDK 提供的 Lambda )和 Stream ,这两个强大的特性让函数式编程在 Java 开发中发扬光大。[详细]
-
MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘
所属栏目:[Java] 日期:2020-12-15 热度:162
背景 最近有一个数据统计服务需要升级 SpringBoot 的版本,由 1.5.x.RELEASE 直接升级到 2.3.0.RELEASE ,考虑到没有用到 SpringBoot 的内建 SPI ,升级过程算是顺利。但是出于代码洁癖和版本洁癖,看到项目中依赖的 MyBatis 的版本是 3.4.5 ,相比当时的最[详细]
-
通过transmittable-thread-local源码理解线程池线程本地变量传递
所属栏目:[Java] 日期:2020-12-15 热度:126
前提 最近一两个月花了很大的功夫做 UCloud 服务和中间件迁移到阿里云的工作,没什么空闲时间撸文。想起很早之前写过 ThreadLocal 的源码分析相关文章,里面提到了 ThreadLocal 存在一个不能向预先创建的线程中进行变量传递的局限性,刚好有一位 HSBC 的技术[详细]
-
深入理解RabbitMQ中的prefetch_count参数
所属栏目:[Java] 日期:2020-12-15 热度:65
前提 在某一次用户标签服务中大量用到异步流程,使用了 RabbitMQ 进行解耦。其中,为了提高消费者的处理效率针对了不同节点任务的消费者线程数和 prefetch_count 参数都做了调整和测试,得到一个相对合理的组合。这里深入分析一下 prefetch_count 参数在 Rab[详细]
-
Java线程生命周期与状态切换
所属栏目:[Java] 日期:2020-12-15 热度:138
前提 最近有点懒散,没什么比较有深度的产出。刚好想重新研读一下 JUC 线程池的源码实现,在此之前先深入了解一下 Java 中的线程实现,包括线程的生命周期、状态切换以及线程的上下文切换等等。编写本文的时候,使用的 JDK 版本是11。 Java线程的实现 在 JDK[详细]
-
ThreadLocal源码分析-黄金分割数的使用
所属栏目:[Java] 日期:2020-12-15 热度:120
前提 最近接触到的一个项目要兼容新老系统,最终采用了 ThreadLocal (实际上用的是 InheritableThreadLocal )用于在子线程获取父线程中共享的变量。问题是解决了,但是后来发现对 ThreadLocal 的理解不够深入,于是顺便把它的源码阅读理解了一遍。在谈到 Thr[详细]
-
JSR310新日期API(完结篇)-生产实战
所属栏目:[Java] 日期:2020-12-15 热度:193
前提 前面通过五篇文章基本介绍完 JSR-310 常用的日期时间 API 以及一些工具类,这篇博文主要说说笔者在生产实战中使用 JSR-310 日期时间 API 的一些经验。 系列文章: JSR310新日期API(一)-时区与时间偏移量 JSR310新日期API(二)-日期时间API JSR310新日期A[详细]