自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 springboot3如何使用swagger和knife4j

升级springboot3后的knife4j使用

2023-12-23 21:51:09 513

原创 Spring Boot 3整合springbatch5新特性

在早期,Spring Batch提供了基于映射的作业存储库和作业浏览器实现使用内存中的作业存储库。这些实现在版本4中已弃用并在版本5中完全删除。建议使用基于jdbc的替换使用嵌入式数据库(如H2、HSQL等)实现。在spring batch 5中,注解@EnableBatchProcessing配置一个基于jdbc的JobRepository,此配置是需要DataSource和PlatformTransactionManager两个spring bean。

2023-06-10 10:05:36 762

原创 cglib动态代理使用和源码分析心得

前言前几天使用公司项目,分析到某个代码接口实现类扫包增强型执行,就是使用的cglib动态代理模式,用来实现对日志打印、分布式锁、事务和异步线程池执行的增强。这里的底层原理是怎样,我下文进行表述。使用maven依赖引入创建一个maven项目,pom.xml文件引入如下的依赖。 <dependencies> <dependency> <groupId>cglib</groupId> <

2022-01-03 18:07:12 382

原创 浅谈传统定时任务和分布式定时任务

为什么用定时任务?定时任务平台可以在后台自动检测数据并进行操作。主要应用在订单状态改变、后台统计、定时发送邮件或短信等。定时任务怎么部署实现?传统的定时任务可以通过可定时线程池、timertask、quartz、spring-schedule方式来进行处理。他们的依赖和代码如下面所示。maven依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spri

2021-11-20 20:00:09 1186

原创 超过500万海量数据怎样处理

前言最近笔者在工作中遇上一个测试人员通过压力测试反馈的问题。这个问题就是测试人员一下子制造了上千万的数据,造成某个mysql/oracle数据库表产生了500万以上的数据,造成分页查询offset过大的问题。即使查询条件加了索引以及采用懒加载策略,查询速率也还没提升。这里,笔者考虑了几种处理办法:oracle分区、分库分表、nosql法。下面对这几个方法进行表述。oracle分区法笔者在以前的公司工作时,遇上了告警数据量过多,超过1千万了,造成分页数据量过慢。当时存储告警的数据是在oracle里面,故

2021-10-17 19:54:30 1355

原创 线程池的描述

线程池的描述前言多线程的使用可以提升程序运行的时间效率,同时也发挥多核CPU的计算能力的优势,从而提升系统的吞吐量和性能。然而,如果不合理地使用多线程,就会造成CPU的上下文切换频繁,反而因为对CPU和内存耗尽造成对性能产生不利的影响,从而拖垮了系统。故我们需要对线程的使用有个限度,限制运行线程的数量的范围。1.线程池的定义线程池是一种存放一定数量的活跃线程的对象,在需要使用线程时,从其中拿出一个活跃线程,运行完毕之后把对应的线程放回。2.线程池的优势使用线程池,可以实现对活跃线程的复用来提高线

2021-01-17 17:22:41 237

原创 为何阿里官方不同意关联三张及以上数据库表

在阿里巴巴开发手册里有这样一条规定,禁止关联三张及以上的数据库表。这个是为何呢?笔者在之前工作中有了亲身的体验,现在对其进行总结。正如广大开发人员所知道的,多表关联查询是对一张表的某个字段来匹配另一张表的对应字段,进而从另外一张表里查询对应的属性。这里大家一般采用join查询,此类查询这里分为left join、right join、inner join、cross join这几种。其中,left join是把前面的表作为主表进行全表扫描的,而right join是把右表进行主表全表扫描的。另外两种则是把

2020-10-18 11:34:51 1327 1

原创 mq使用的心得

背景传统的同步请求(比如restful)虽然实现起来比较简单,但是随着请求线程数和存取数据量的增加,其局限性日益突显。典型的代表在于执行比较耗时的代码(例如导入大批量数据到数据库里)和非主业务(如埋点统计、记录登录日志、发送手机短信)的崩溃造成整个业务的崩溃(503错误)。同时一旦远程服务器宕机,造成消息数据丢失的问题。这个是笔者在前面公司工作遇上的问题,留下了惨痛的教训。为解决此类问题,需要采取异步的方法来另外开启线程执行比较耗时和非主要的线程。首先想到的是以线程池为代表的多线程,该方法是使用@Asy

2020-10-13 12:57:08 489

原创 用ApplicationEvent事件监听解决async注解不能嵌套的问题

前言笔者之前写的文章表述了async注解可以解决异步执行任务同时不影响主业务的功能的特点,很好解决响应超时出503问题影响主业务。然而,async除了在加入@Controller注解的有继承和实现的方法有坑之外,也不能够直接嵌套使用来再开一个线程。下面介绍的事件监听即可解决此类问题。ApplicationEvent简介ApplicationEvent是spring对事件监听的一种机制,采用了观察者模式来进行的。可以使核心业务与子业务进行解耦,还实现了异步事件的嵌套,也方便后期的业务的扩展。而类Appl

2020-08-07 15:35:43 917

原创 jvm类加载器Classloader原理

众所周知,java是一门面向对象的编程语言,具有跨平台性高的特点。它也是靠编译后在机器上运行。Java编译运行的平台就是java虚拟机(JVM),其内存结构如下图(图1)所示。图1 jvm基本结构(方法区在java8及以后改为元空间了)如图1可知,java文件是先编译成.class扩展名文件之后再加载到jvm系统运行的。加载此类文件的部分叫做类加载子系统(ClassLoader),该系统加载过程是通过校验、准备、解析三个步骤来进行的。其中校验这个过程是来校验.class文件是否有利于jvm的安全以防jv

2020-08-07 15:22:12 206

原创 spring事务失效原因我工作和学习体会

spring事务一般采用aop的形式来配置的。这样的方法可以减少代码的冗余。xml这里配置统一拦截的方法,而注解形式则放到aop的java文件里来拦截方法上面的@Transactional注解,从而抽取出冗余的代码。但是,使用事务时有人因为配置缺失和操作不当导致事务失效,我这里以自己亲身的失误来解释相关的原因。1.没有加入注册aop到容器的注解aop相关的类需要注册到容器里才可生效,@Transactional注解是spring自带的事务注解,要想生效需要引入对应得aop的java文件好比写入对应的类到

2020-07-16 20:09:05 99

原创 volatile关键字的使用心得

在多线程操作中,一个线程类的全局变量在直接用传统的关键字情况下,是无法通过另外一个线程更改它的值。具体的代码和执行结果如下:public class DemoThread1 implements Runnable { private static boolean flag = true; @Override public void run() { System.out.println(Thread.currentThread().getName());

2020-06-17 13:59:27 185

原创 我所见的orm映射对比

我所见的orm映射对比前言笔者在开发和学习中接触了5种orm框架,他们各有各的优缺点,应用的场景也不一样。下面对这五种orm大体状况进行表述。1.原始jdbc原始jdbc是所有java orm映射的底层封装实现的代码,它通过数据库驱动java类字符串反射初始化驱动来创建连接。在执行完对应的sql后传递到resultset,再通过循环来封装到对应的实体类中。其优点在于可以直接迅速地执行sql,灵活将结果转换为实体类或者vo、dto,但缺点是数据库连接资源利用率不高,同时代码繁琐,开发成本高。2.qu

2020-06-13 13:12:14 210

原创 导入大批量数据的案例及@Async注解用法

在导入数据量较大的excel文件到数据库中,常常遇上因为性能问题导致导入失败或响应失败的问题。这里涉及的知识点包含异步执行,线程导入分片和休眠的模块。笔者在最近和之前的工作中针对踩到的坑进行分析,对上面的知识点进行表述。一般的网页请求是同步的,前端默认响应时间是30秒,最多为2分钟,这一点笔者在与前端联调时发现的。导入大量的数据到数据库中往往耗时超过2分钟,这一点超过了前端最长响应时间,前端一旦超时就容易报错(503错误)。故笔者采用异步的方式来进行导入,但是缺点是导入是否失败还不能直接响应给前端,此时笔

2020-05-08 23:22:57 1116 1

原创 服务降级与熔断(基于sentinel)(1)

一、背景在高并发的状态下服务器被访问量很多,但是服务器中可连接的线程数目有限。故访问量一旦超限,很容易导致其他服务无法访问,甚至让整个系统崩溃。为了解决这种问题,需要对某些接口访问的数量进行限制来对该服务进行保护。为此,服务降级与熔断产生了。二、服务保护的基本概念和基本理论2.1 服务限流/熔断服务限流指的是限制某个服务接口高并发状态下的访问数目,即阈值。当服务请求数量超过阈值时,服务器就...

2020-03-17 22:22:08 879

原创 docker简介和使用

1.docker简介docker是基于go语言实现的开源容器引擎,有助于快速交付使用。它可以将应用程序和基础设施层隔离,并且将基础设施层和应用程序一样进行管理。使用docker可以更快地打包、测试及部署应用程序,并且能缩短从编写到部署的周期。2.Docker与虚拟机区别虚拟化技术是在一个物理机上虚拟化不同的操作系统。而docker是在物理机上容器化虚拟应用程序,启动速度比虚拟机更快。3.d...

2020-03-09 22:42:39 119

原创 knife4j使用(整合spring boot和spring cloud gateway)

一、背景前后端分离大大实现了项目的解耦合,可扩展性,以及专业人做专业事的特点。前端开发不仅仅有网页端,还有ios、安卓、小程序等,他们都可调用后端的接口。然而,传统的手写文档说明增加了后端开发的成本,同时也不利于前后端之间的沟通。与此同时,传统的浏览器直接测试法不仅不方便接口调用方法的指定,而且填写传递参数的方法耗时很大。为此swagger-ui这个能够在线生成接口说明文档及调试的框架诞生了。...

2020-03-08 00:11:15 7730 1

原创 springcloudalibaba之注册和配置中心nacos

1.微服务背景1.1传统项目的局限性传统项目即单体应用,是把项目中所有模块和代码都整合在一个项目里,它虽然开发和运维比较简单,但随着业务和需求的发展,其局限性明显体现了。这些局限性体现在耦合度高,业务逻辑没有充分拆分,往往在某个模块崩溃了造成整个系统的崩溃。1.2分布式微服务架构演变为了解决单体应用的局限性,分布式系统就此诞生。分布式系统就是根据业务逻辑将系统进行拆分,降低了耦合度。然而,...

2020-02-22 11:00:16 389

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除