OSPP参与记录
前言今年毕业前申请参与了2024年的开源之夏(OSPP),是一次很宝贵的开源项目经验,最终成功结项。写这篇博客以此记录留存。 本博客记录的内容截至日期为 2024:09:30,最终方案相比本文有变动,例如放弃 jprotobuf 方案、重构 Grpc 调用模块等。具体详见:https://github.com/alibaba/arthas/pull/2914 项目申请书项目名称:探索 Java 低资源消耗的 gRPC 实现 项目主导师:断岭 申请人:风业 日期:2024.06.03 邮箱:1129126684@qq.com 项目背景Arthas 是一个 Java 诊断工具,它允许开发人员在无需修改应用程序代码的情况下,动态地监视和解决生产环境中 Java 应用程序的问题。目前 Arthas 主要是通过交互式的命令行提供服务,此外也提供了 http api。但是 http api 比较简陋,预期通过grpc server提供服务。但是官方的 grpc 实现依赖多、运行时内存占用高,本项目旨在提供一种低资源消耗的 grpc 实现,需要支持 stream...
部署Grafana+Prometheus+Exporter
Grafana1docker run -d --name=grafana --network host grafana/grafana-enterprise Prometheus下载并解压 123wget https://github.com/prometheus/prometheus/releases/download/v2.42.0/prometheus-2.42.0.linux-amd64.tar.gztar xvfz prometheus-*.tar.gz 给 prometheus 配置 systemd 启动,默认运行端口为 9090 12345678910111213141516171819202122vim /usr/lib/systemd/system/prometheus.service[Unit]Description=prometheus[Service]WorkingDirectory=/home/fengye/prometheus/prometheus-2.42.0.linux-amd64#...
类加载机制
前言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...