类加载机制
前言Java为了做到“一次编写,到处运行”,发布了运行在不同平台上的JVM,所有平台上的JVM都支持统一的程序存储格式————字节码(ByteCode),而存储字节码的二进制文件被称为Class文件。 对于JVM来说,不管是什么语言,只要能编译成Class文件,就可以在JVM中运行。换句话说,JVM不与任何语言绑定,而是与Class文件绑定。 任何一个Class文件都对应一个唯一的类或者接口,但是类或接口不一定定义在文件中(例如可以动态生成)。 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。 类文件结构在学习类加载之前,需要先了解Class文件的结构。 首先给出一个简单的代码样例: 12345678public class TestClass{ private int m; public int inc(){ return m + 1; }} 使用 javac...
Redis笔记
前言学习后端开发这么久,Redis 是我常用的一个中间件,以往主要是用于做缓存处理和暂存一些值。但用了这么多,却并没有深入地了解过 Redis 底层,并且平时的使用也大多都是通过 SpringData 封装的 RedisTemplate,连 Redis 本身的命令也几乎要忘掉了。因此打算写一篇总结性的博客,包括Redis的基础 + Redis底层 + Redis进阶使用。 Redis基础基础指令操作数据库相关指令 启动 Redis 客户端: redis-cli -h host -p port -a password 切换当前数据库: select 数据库index(0-15) 清空当前的库: FLUSHDB ;清空所有库: FLUSHALL 动态调整 Redis 的配置而不用重启(重启失效):CONFIG SET ... 操作数据类型相关指令StringString 是 Redis 中最简单的存储类型,一个 key 对应一个 value。其 value 是字符串(可以细分为字符串、整数、浮点数)。value 最大值不能超过512mb。 命令 说明 SET key...
配置HTTPS
前置由于 HTTP 本身是使用明文通信的,不加密、无法验证通信方的身份、无法证明报文的完整性,因此 HTTPS 出现了。HTTPS 本质上就是 HTTP 与 SSL/TLS...
浅析网络IO模型
前言I/O 泛指的是 CPU 向 I/O设备(硬盘、网卡)中读取/写入数据。而本文主要介绍的是网络 I/O,也就是借助于 Socket Api ,从网卡中读取数据。 Unix网络编程中的五种IO模型 参考:聊聊Linux 五种IO模型 - 简书 (jianshu.com) 一个I/O操作通常分为两个阶段: 等待数据准备(从磁盘/网卡中读取数据到内核空间中的缓冲区)。 从内核空间中的缓冲区向用户空间复制数据。 阻塞式I/O 假设在服务器上有一个应用需要接收客户端通过socket传递的数据。 1234567891011121314151617181920//服务端应用程序伪代码:listen_fd = socket(domain,type,protocol);bind(listen_fd,server_addr,server_addrlen);listen(listen_fd,backlog);while(1){ ...
Spring异步任务和定时任务线程池
前言我们都知道在Spring中,想要启用异步任务和定时任务非常简单,只要在配置类或者启动类上添加@EnableAsync和@EnableScheduling,然后在对应方法上添加@Async和@Schedule即可。那么@Async和@Schedule默认是在什么线程池中运行的呢?默认的线程池是什么配置?如何修改其配置?如何自定义线程池? 异步任务执行器 TaskExecutor异步任务执行器的接口是 TaskExecutor 。 12345@FunctionalInterfacepublic interface TaskExecutor extends Executor { @Override void execute(Runnable task);} TaskExecutor 继承了 JDK 的 Executor(即平时经常使用的 ExecutorService 的父接口)。TaskExecutor 有很多实现类,Spring Boot默认提供的实现类是...
SpringCloud笔记
前言什么是SpringCloud?Spring Cloud 被称为构建分布式微服务系统的“全家桶”,它并不是某一门技术,而是一系列微服务解决方案或框架的有序集合。它将市面上成熟的、经过验证的微服务框架整合起来,并通过 Spring Boot 的思想进行再封装,屏蔽调其中复杂的配置和实现原理,最终为开发人员提供了一套简单易懂、易部署和易维护的分布式系统开发工具包。 虽然 Spring Cloud 提供了很强大的功能,但是并没有提供所有的实现。其中的部分中间件只提供了统一的抽象API。不同厂商结合自身中间件,提供了自己的 Spring Cloud 套件。例如 Spring Cloud Netflix 、Spring Cloud Alibaba。(Netflix由于开源策略的调整,部分组件已经开始停止维护,因此不再适用于长久使用) 不同SpringCloud套件的常用组件 Spring Cloud 官方 Spring Cloud Netflix Spring Cloud Alibaba 配置中心 Spring Cloud Config/Spring Cloud...
GithubActions进行CICD一键部署
基本概念Github Actions 是 Github 推出的持续集成工具 workflow: 一个 workflow 工作流就是一个完整的过程,每个workflow 包含一组 jobs任务。 job : jobs任务包含一个或多个job ,每个 job包含一系列的 steps 步骤。 step : 每个 step 步骤可以执行指令或者使用一个 action 动作。 action : 每个 action 动作就是一个通用的基本单元。 workflow 必须存储在项目根路径下的 .github/workflows 中,每个workflow对应一个具体的 .yml 文件 workflow 文件1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465# 工作流程的名字name: summerbot's CI/CD# 触发时机: push 到 main 分支on: push: ...
ElasticSearch笔记
ElasticSearch安装安装 ES下载压缩包 1wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.14.0-linux-x86_64.tar.gz 解压 1tar -zxvf elasticsearch-7.14.0-linux-x86_64.tar.gz 修改配置文件,开启远程访问 1234vim elasticsearch-7.14.0/config修改network.host: 0.0.0.0 由于 ElasticSearch 不能在 root 用户下启动,所以需要创建一个新用户: 12345useradd temppasswd tempsu temp 启动 ElasticSearch 123cd elasticsearch-7.14.0/bin./elasticsearch port: http 9200 tcp 9300 可能遇到的问题: 如果启动后 ES 被 killed ,可能是服务器内存不够,可以修改分配给 ES 的 JVM...
docker-compose部署SpringBoot项目
docker-compose部署SpringBoot项目简介docker-compose 是 Docker 官方的开源项目,主要用于实现对 Docker 容器集群的快速编排。 用户可以通过 docker-compose.yml 来定义一组相关联的容器作为一个项目(project) docker-compose的两个概念: 服务(service):应用的容器 项目(project):一组关联的服务组成,在 docker-compose.yml 中定义 安装下载最新版的docker-compose文件 (截止2022.1.28) 1sudo curl -L https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose *下载慢换国内源 DaoCloud | Docker 极速下载 1sudo curl -L...
Java反射
Java 反射反射介绍概念 反射机制允许程序在执行期间借助于 Reflection Api 获取任何类的内部信息(成员变量、构造器、成员方法等),并能直接操作任意对象的内部属性和方法。 当一个类被加载之后,就在堆内存的方法区中产生了一个相应的 Class 类型的对象(一个类只有一个Class对象),这个对象包含了完整的类的结构信息,可以通过这个对象看到类的结构。 加载到内存中的运行时类会缓存一段时间,在此时间之内,通过不同方式获取到的都是同一个运行时类。(即同一个Class类的对象) 反射相关类吧java.lang.Class:标识某个类加载后在堆中的对象 java.lang.reflect.Method:代表类的方法 java.lang.reflect.Field:代表类的成员变量 java.lang.reflect.Constructor:代表成员的构造方法 Class类 Class 类也是类,继承 Object 类 Class 类的实例不是 new 出来的,而是在类被加载时由系统创建的 对于某个类的 Class...