SpringBoot 3 开发随笔
SpringBoot 3 版本
2022 年 11 月 24 日,SpringBoot 3.0 正式发布了。此版本包含了 12 个月以来 151 个人的 5700 多次 Commit 的工作结晶。这是自 4.5 年前发布 2.0 以来,Spring Boot 的第一次重大修订。它也是第一个支持 Spring Framework 6.0 和 GraalVM 的 Spring Boot GA 版本。
新变化
- 支持响应式编程
- 支持 Spring Framework 6.0
- 支持 GraalVM native images
- Spring 自身与第三方包版本升级
- 最低支持 JDK 17,最高支持 JDK 19
- 从 Java EE API (Javax) 迁移到 Jakarta EE API
- 自动配置的包位置变化
- 旧版本:
META-INF/spring.factories
- 新版本:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
- 旧版本:
JMeter 压测教程之一基础使用
Java 的五种代理实现方式
大纲
前言
本文主要介绍 Java 的五种代理实现方式,包括 JDK 动态代理、Cglib、ASM、Javassist、Byte Buddy,点击 下载完整的案例代码。
准备工作
先定义出一个接口和相应的实现类,方便后续使用代理类在方法中添加日志信息。
- 接口
1 | public interface IUserApi { |
Java 的静态代理使用
如何估算 Java 线程池的大小与队列长度
估算算法
第一种估算算法
先来一个天真的估算算法:假设要求一个系统的 TPS(Transaction Per Second 或者 Task Per Second)至少为 20,然后假设每个 Transaction 由一个线程完成,继续假设平均每个线程处理一个 Transaction 的时间为 4s。那么问题可以转化为:如何设计线程池大小,使得可以在 1s 内处理完 20 个 Transaction?这里计算过程可以很简单,每个线程的处理能力为 0.25TPS,那么要达到 20TPS,显然需要 20/0.25=80 个线程。
很显然这个估算算法很天真,因为它没有考虑到 CPU 数目。一般服务器的 CPU 核数为 16 或者 32,如果有 80 个线程,那么肯定会带来太多不必要的线程上下文切换开销。
第二种估算算法
第二种估算算法比较简单,但不知是否可行(N 为 CPU 总核数):
- 如果是 CPU 密集型应用,则线程池大小设置为 N+1
- 如果是 IO 密集型应用,则线程池大小设置为 2N+1
如果一台服务器上只部署这一个应用并且只有一个线程池,那么这种估算或许合理,具体还需自行测试验证。
Java 代码规范检测与格式化(超详细)
前言
本文主要介绍如何检测 Java 代码规范与格式化 Java 代码,包括 IDEA 插件与 Maven 插件的使用。
代码规范检测插件
IDEA 代码规范检测插件
IDEA 可以使用 CheckStyle-IDEA 插件来检测 Java 代码的规范,它可以保证每位提交者的代码规范都保持一致。值得一提的是,CheckStyle-IDEA
插件只能检测代码的规范,并不能格式化代码。
创建规则文件
在项目中创建 checkstyle.xml
规则文件,例如路径为 config/checkstyle/checkstyle.xml
。
提示
- Alibaba Nacos 的 CheckStyle 规则文件如下,要求 CheckStyle 的版本至少为
8.30
VuePress 渲染 Mermaid 绘图
前言
本文将介绍 VuePress 如何渲染 Mermaid 绘图,适用于 VuePress 1.x 与 VuePress 2.x。
VuePress 1.x
VuePress 1.x 可以直接安装第三方插件 vuepress-plugin-mermaidjs 来渲染 Mermaid 绘图,插件的详细文档可看 这里。
安装插件
安装插件时必须指定具体的版本号,否则默认会安装最新版本的插件,最新版本不兼容 VuePres 1.x。
1 | $ npm install vuepress-plugin-mermaidjs@1.9.1 -D |
配置插件
编辑 VuePress 1.x 的 .vuepress/config.js
配置文件,新增 mermaidjs
插件,如下所示:
1 | module.exports = { |
Docker 安装 Oracle 11g 数据库
前言
Docker 镜像说明
本文使用了 DockerHub 平台上的 Oracle 11g 镜像,基于 Ubuntu 18.04 LTS 系统,数据库版本是 Oracle Express Edition 11g Release 2 (11.2.0.2.0)。
Oracle 各版本介绍
在 Oracle 数据库的发展中,数据库一直处于不断升级状态,一共有以下几个版本:
Oracle 8i
:Oracle 8i 表示 Oracle 正式向 Internet 上发展,其中 i 表示就是 internet。Oracle 9i
:Oracle 8i 是一个过渡版本,Oracle 9i 是一个更加完善的数据库版本。Oracle 10g
:g 表示 grid,代表网格的意思,即这种数据库采用网格计算的方式进行操作。Oracle 11g
:是 Oracle 10g 的稳定版本,Oracle 11g 是目前使用最广泛的版本。Oracle 12c
:是 Oracle 2013 年推出的数据库版本,c 代表 Cloud,代表云计算的意思,同时 Oracle 12c 支持大数据的处理能力。Oracle 18c、Oracle 19c
是对 12c 版本的完善和发展。
C++ 进阶基础之十一
大纲
- C++ 进阶基础之一、C++ 进阶基础之二、C++ 进阶基础之三
- C++ 进阶基础之四、C++ 进阶基础之五、C++ 进阶基础之六
- C++ 进阶基础之七、C++ 进阶基础之八、C++ 进阶基础之九
- C++ 进阶基础之十、C++ 进阶基础之十一
算法
算法的基本概念
算法的简介
函数库对数据类型的选择对其可重用性起着至关重要的作用。举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。而 C++ 通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL 就利用了这一点提供了相当多的算法。它是在一个有效的框架中完成这些算法的 —— 可以将所有的类型划分为少数的几类,然后就可以在模板的参数中使用一种类型替换掉同一种类中的其他类型。