- 博客(36)
- 收藏
- 关注
原创 JVM原理(四):字节码
java源码编译后都会生成字节码,字节码是JVM执行代码的中间形态,到运行时jvm会将字节码文件读取到内存中并翻译为机器可识别执行的机器码。JVM字节码是一种基于栈的指令集架构(Stack-based Instruction Set Architecture)。每个字节码指令都会在JVM上执行一系列的操作,如加载、存储、运算、跳转等。
2025-03-11 17:01:39
622
原创 JVM原理(一):JVM基础知识
JVM经历了过去辉煌的28年,但在已经来临的云时代,原有的优势面临着新的挑战,为了适应云时代高性能、高可扩展性、高可靠性和高安全性的要求,JVM也在努力地进行自我革新。总的来说,JVM的发展方向主要包括3个方面。首先是性能优化,通过提高性能和资源利用率来适应云原生时代的需求。其中最主要的技术是AOT编译器和JIT编译器的结合,以及JVM的内存管理和垃圾回收机制的优化。其次是对容器化的支持,通过支持容器化和新的微服务架构以适应云原生时代的需求。
2025-03-04 11:27:45
1041
原创 架构设计系列(七):微服务架构
随着业务规模的不断扩大,开发团队不断扩张,传统的单体服务会出现团队协助和系统性能上的问题。基于以上的痛点,微服务在业务开发上的应用越来越广。其实在初期的技术选型上,是选用微服务还是使用单体,需要根据当时的团队规模,业务量等综合因素作为评估。而不是一股脑的拍板新的就是好的。
2025-03-02 20:59:04
803
原创 架构设计系列(六):缓存
Cache-Aside 策略的优点是实现简单,只有被请求的数据才会被缓存起来,减少一些不必要数据的缓存。但程序需要管理其时效性及一致性,增加了系统的复杂度。该策略更多的使用在数据读取比较频繁,更新比较少的场景。Read-Through 策略 应用程序将不与数据库进行交互,简化了读取流程,由缓存系统自己管理缓存提高了数据的一致性。但缓存的写入需要单独处理,需要与其他写策略结合使用。该策略适用于读写操作频繁的场景。Read-Through 策略保证了数据的一致性,读取时总是能够在缓存中获取到最新的数据。
2025-02-25 15:37:51
1031
1
原创 Spring高级篇-Spring IOC容器 Aware 接口
BeanClassLoaderAware 接口为开发者提供了一种简单而有用的方式来获取 Bean 的类加载器信息。通过实现该接口,Bean 可以在初始化阶段获取自身类加载器,从而更灵活地处理一些与类加载器相关的逻辑。BeanFactoryAware 接口是一个回调接口,它提供了一个用于设置 Bean 工厂的方法。
2025-02-24 17:14:00
998
原创 架构设计系列(五):数据存储
在技术选择中,数据存储方案的选择极其重要。为自己的项目选择适合的数据存储是一项复杂的任务。不同的数据库的诞生是为了解决现实存在的业务场景,市面上的数据库产品众多,这样子也会导致在做技术选型的时候产生决策疲劳。
2025-02-21 15:45:44
869
原创 架构设计系列(四):设计模式
设计模式是软件开发中的宝贵工具,它们提供了解决常见问题的标准化方法。通过合理使用设计模式,可以提高代码的质量、可维护性和可扩展性。模式分类核心思想抽象工厂模式创建型创建一组相关对象。建造者模式创建型分步骤构建复杂对象。原型模式创建型通过复制现有对象创建新对象。单例模式创建型确保一个类只有一个实例。适配器模式结构型转换接口以兼容不同类。桥接模式结构型将抽象与实现分离。组合模式结构型构建树形结构以表示部分-整体关系。装饰器模式结构型动态扩展对象功能。外观模式结构型。
2025-02-15 16:02:16
1033
原创 架构设计系列(三):架构模式
模式核心特点优点缺点适用场景MVC分离 Model、View 和 Controller简单易用Controller 臃肿,耦合高小型应用MVP引入 Presenter 解耦 View 和 Model便于测试Presenter 可能复杂中型应用MVVM引入 ViewModel 和数据绑定高度解耦,便于测试数据绑定调试复杂大型应用MVVM-C引入 Coordinator 解耦导航逻辑适合复杂导航场景增加了复杂性大型应用,复杂导航VIPER高度模块化,职责分离明确适合大型团队。
2025-02-15 15:06:53
671
原创 架构设计系列(二):CI/CD
CI/CD 是 持续集成(Continuous Integration) 和 持续交付/持续部署(Continuous Delivery/Continuous Deployment) 的缩写,是现代软件开发中的一套核心实践和工具链,旨在提高软件交付的效率、质量和可靠性。
2025-02-13 17:43:37
1490
原创 架构设计系列(一):通信协议
polling and Webhook 对比假设我们运营一个电子商务网站。客户端通过 API 网关将订单发送至订单服务,订单服务再将请求转发至支付服务以处理支付交易。支付服务随后与外部支付服务提供商(PSP)通信,完成交易。短轮询(Short Polling)支付服务向 PSP 发送支付请求后,不断向 PSP 询问支付状态。经过多次轮询后,PSP 最终返回状态。短轮询有两个缺点:不断轮询状态会消耗支付服务的资源。外部服务直接与支付服务通信,可能产生安全漏洞。
2025-02-13 15:08:54
1098
原创 Prometheus 监控实施 -- (五)Prometheus添加监控对象
Prometheus 通过提供 各种应用的 Exporter来对不同应用进行指标采集及监控,Exporter 相当于一个agent 暴露对应的采集指标接口,并对目标实例进行指标采集。添加监控对象的流程大致如下:下载对应的 Exporter ->配置 Exporter参数->启动 Node Exporter->配置Prometheus 配置文件Exporter下载URL。
2025-01-12 12:22:35
990
原创 使用 docker-compose 部署java 应用
docker-compose 是一个很好用的容器编排工作,使用docker 直接部署应用的话过程过于繁琐,也不利于维护。本文将介绍怎么使用docker-compose 去部署应用,前期需要先部署docker-compose 可参考centOS7 安装docker-compos这篇博文。
2024-12-13 10:35:35
410
原创 容器环境下 jvm问题排查
Docker 容器利用 CGroup 对进程使用的资源进行限制,而在容器中的 JVM 依然会利用宿主机环境的内存大小和 CPU 核数进行缺省设置,这导致了 JVM Heap 的错误计算。) + Heap + JVM进程运行所需内存 + 其他数据,我们所设置的 -Xmx 等参数只是限制了 JVM 堆内存(Heap) 的大小,当 -Xmx 设置的值接近与容器限制的值的时候,堆内存 + 非堆内存的使用总和超出了 CGroup 的限制就会被操作系统 Kill 掉。了解了问题的根源,我们就可以非常简单地解决问题了。
2024-11-05 18:34:06
793
1
原创 Prometheus 监控实施 -- (四)实现Prometheus自动对应用服务进行监控
在常规的运维配置中,每新增一个应用,我们就需要修改Prometheus 的配置文件,重启Prometheus,在这种情况下对于运维监控带来操作不便及较大的维护成本。针对以上问题,Prometheus能不能每新增一个服务可以进行服务发现,自动的去获取服务信息并进行监控呢?
2024-01-07 12:03:59
560
原创 Prometheus 监控实施 -- (三)整合grafana
在服务启动完毕以后,在浏览器中输入 http://XXXX.XXXX.XXXX.XXXXX:19090/在实际应用中,我们还需要根据自身的 需求去筛选对应的指标,这个需要使用花点时间去学习对应语法应用。1、在首页找到配置选项–点击connection下面的 DataSource进行配置。grafana在每个仪表盘中都提供了自定义筛查的设置,需要用户自己去实现。选择DataSource 的类型,在此选择Prometheus。配置完成以后,点击进入仪表盘则将出现对应的数据展示;2、配置DataSource。
2024-01-07 11:51:55
455
原创 Prometheus 监控实施 -- (二)应用服务集成Prometheus
选择合适的镜像,docker镜像可以自己制作也可以从 镜像仓库下载 (https://hub.docker.com/ ) ,本文选择从仓库中下载 bitnami/prometheus 镜像。也可以是选择二进制文件安装,但过程相对复杂,本文只介绍docker安装过程。在浏览器中输入 http://XXXX.XXXX.XXXX.XXXXX:19090/ ,将出现 点击targets 将会出现 下图。1、先使用 docker pull bitnami/prometheus:latest 下载镜像。
2024-01-07 11:40:46
583
原创 Prometheus 监控实施--(一)介绍
Prometheus是一个开源系统监控和警报工具包,最初在SoundCloud上构建。自2012年成立以来,许多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发人员和用户社区。它现在是一个独立的开源项目,独立于任何公司进行维护。为了强调这一点,并澄清项目的治理结构,Prometheus于2016年加入了云原生计算基金会,成为继Kubernetes之后的第二个托管项目。Prometheus将其指标收集并存储为时间序列数据,即指标信息与记录它的时间戳一起存储,以及称为标签的可选键值对。
2024-01-07 11:33:46
375
原创 Elasticsearch+Fluentd+Kibana 日志收集系统的搭建
*值得注意的是,fluent-plugin-elasticsearch 插件的版本应该和 elasticsearch 对应,我这边使用的elasticsearch 为7.6.2 则 fluent-plugin-elasticsearch 应该在 5.0.3,版本无法对应的话,fluent 启动时 将报 无法连接至elasticsearch,如下:**[在这里插入图片描述](https://img-blog.csdnimg.cn/1d4eb6e305e246409a2f31e0357bb8ef.png)
2023-10-24 17:45:13
460
原创 关于慢sql的分析定位
在java项目中最大的隐患项之一就是慢SQL,它影响到服务的稳定性,也是日常工作中经常导致程序的最大隐患,在日常开发中如何避免出现慢SQL,出现了慢SQL应该按照什么思路去解决是我们必须要知道。科学创建索引减少不必要的列查询使用覆盖索引语句改写适当的应用内存进行条件组合分次查询选择合适的列进行排序适当的列冗余,减少关联表SQL 拆分,化繁为简适当结合 ES。
2023-09-24 14:10:47
197
原创 JDK8 升级至 JDK17 打包问题分析
近日为了满足客户需求将项目的jdk版本由原先的1.8升级至17,整个过程比较顺利,但是在maven 打包时出现了报错。报错信息为:(程序包 sun.security.util 已在模块 java.base 中声明, 但该模块未将它导出到未命名模块)
2023-09-12 19:58:06
2937
1
原创 JVM原理(三):javac编译器
java是一种跨平台的语言,它的平台无关性让java在计算机上运行时不受平台的约束,可以做到一次编译,到处执行。这也是java能够迅速崛起并长久不衰的一个重要原因。而对于Java的平台无关性的支持,就像对安全性和网络移动性的支持一样,是分布在整个Java体系结构中的。其中扮演者重要的角色的有Java语言规范、Class文件、Java虚拟机(JVM)等。下面通过阅读源码的方式去了解java源码文件编译成class文件的过程。
2023-09-03 12:12:14
537
原创 SpringCould openFeign 配置动态路由实现本地调试
现在很多项目都基于微服务开发,而对于开发来说,最困扰的就是本地服务间的调试。在此之前在网上给出的方案都是 直接在feign 调用接口 写死url,但这会出现团队成员不小心将调试的url提交到仓库中,无形的增加了产线事故的产生。本文将介绍一下我自身基于项目改造的 可配置feign 路由的方案。
2023-06-17 15:15:12
1581
原创 JVM原理(二):编译原理
Java作为一种跨平台的编程语言,其源代码需要经过编译器编译成字节码文件(即Class文件),然后由Java虚拟机(JVM)解释执行。这种机制使得Java程序具有良好的可移植性和高效性。因此,了解Java源代码编译器的工作原理以及Class文件的生成过程对于Java程序员来说具有重要意义,而源代码编译成字节码文件的这个过程正是由javac来完成的,本节我们就来了解一下它的工作原理及编译过程。
2023-06-13 08:54:44
115
原创 quartz 定时框架整合多数据源
最近,因为saas系统需要支持 租户可配置数据源的需求,所以将系统改造为多数据源,从而也对定时任务进行改造。
2022-12-31 15:57:32
1945
原创 CentOS7 使用docker 安装redis
1、获取 redis版本信息docker search redis2、获取redis镜像(不指定版本,默认拉取最新版本)docker pull redis:5.0.93、创建 redis安装目录mkdir -p /root/redis/data /root/redis/conftouch /root/redis/data /root/redis/conf/redis.conf/root/redis/data 、/root/redis/conf为 redis 挂载目录redis.co
2021-10-21 11:45:14
661
1
原创 CentOS7 使用docker 安装mysql
1、查询 mysql 镜像docker search mysql2、拉取 mysql 镜像,不加版本号则默认拉取最新版本docker pull mysql #可以选择特定版本,如 docker pull mysql 5.53、查看docker镜像docker images4、创建应用目录,如:/opt/mysqlmkdir /opt/mysql 5、进入该目录,设置相关参数并启动容器cd /opt/mysql docker run --name mysqlserver -v
2021-10-21 11:01:47
892
原创 CentOs7 安装docker
Cent os7 安装docker1、先检查自身内核版本uname -r2、使用 root 权限登录,保证 yum 包更新到最新。sudo yum update2.1、如果存在旧版本,则需先删除sudo yum remove docker docker-common docker-selinux docker-engine3、安装需要的软件包, yum-util 提供yum-config-manager功能 sudo yum install -y yum-utils device-m
2021-10-21 10:09:30
138
原创 Mysql笔记(三)-Mysql的事务
一、数据库事务:1、数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。简单而言就是要保证一组数据可以操作,要么全部成功,要嘛全部失败。2、数据库事务的特性数据库事务拥有以下四个特性,习惯上被称之为ACID特性。原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。一致性(Consis...
2019-07-17 07:40:13
121
原创 Mysql笔记(二)-Mysql的日志系统
Mysql笔记(二)-Mysql的日志系统mysql 有两个重要的日志模块,redo log (重做日志) 和 bin log(归档日志)。一、redo logredo log 是innoDB的日志,用于记录数据的更新信息。在更新数据时,如果每一次的操作都需要写进磁盘的话,程序需要在磁盘中找到相对的数据,然后进行更新。整个过程的IO消耗,查找成本很高。为了解决这个问题,Merys...
2019-06-18 07:11:42
202
原创 JVM原理及调优(二)----垃圾收集器
一、概述说起java人们总会想到它的垃圾收集器,从java诞生以来,GC就是它的伴生产物。对于GC我一直有几个疑问,那就是:1、哪些内存是需要被回收的?2、是在什么时候会被回收 ?3、是通过怎么样的机制进行回收?带着这些问题,深入的去学习。二、对象和类的的生命周期2.1、java对象的生命周期java对象在JVM的生命周期有:1、创建(created):对象通过 new、反射、clon...
2019-05-21 08:13:14
160
原创 Linux日常命令整理
** Linux日常命令整理**欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器...
2019-04-29 19:40:22
116
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人