- 博客(31)
- 问答 (1)
- 收藏
- 关注
原创 springboot实现异步导入Excel的注意点
前文介绍了使用断点续传优化同步导入Excel,即使并发上传分片,依然会因上传耗时对用户体验感不好,故上文只起到抛砖引玉的作用,生产上使用较多的还是异步导入的方式。
2025-03-30 22:49:16
1097
原创 Springboot实现使用断点续传优化同步导入Excel
在跨境电商系统中,其中下单方式之一就是通过Excel记录多个用户该下单哪些商品实现批量下单,就需要实现导入Excel的方案,最简单的就是同步导入Excel,但同步导入大Excel文件时,网络原因抑或误刷新了页面,就需要重新上传,这就造成用户体验感不好,于是引入断点续传来优化同步导入Excel。
2025-03-21 12:40:23
778
原创 剖析sentinel的限流和熔断
平时发起一个请求,在系统内部微服务之间调用就会形成一条调用链路,那对于每个服务要起到保护的作用,如何保护呢?本文就来做一个介绍,笔者平时是使用sentinel居多,是通过其提供的限流和熔断的措施来保护的,于是文本来剖析sentinel的限流和熔断;例如a1服务——》b服务——》c服务;a2服务——》b服务——》c服务;a3服务——》b服务;d服务——》a3服务;
2025-03-16 22:57:18
1164
原创 GC安全点导致停顿时间过长的案例
前段时间在使用G1垃圾收集时,因服务读写压力过大,于是将-XX:MaxGCPauseMillis参数调整为500ms,运行一段时间后发现垃圾收集的停顿时间经常达到3s以上,但实际垃圾收集器进行回收的动作就只占其中的几百毫秒。MaxGCPauseMillis:最大停顿时间,默认200ms。顾名思义,G1是garbage first。垃圾优先。G1在该最大停顿时间的指定范围内优先收集收益最大(标记垃圾对象最多)的region。user:进程执行用户态代码所耗费的处理器时间。
2025-03-09 10:27:24
1071
原创 回忆Redis的持久化机制
大家都知道,Redis是内存数据库,也就是说client与Redis交互的过程,无论是读key还是写key都是直接访问Redis的内存即可,但对于宕机备份容灾等问题,就需要引入持久化,Redis提供RDB或AOF,还有从版本4.0开始引入这RDB和AOF两种的混合持久化方式。
2025-03-02 22:59:17
793
原创 istio介绍补充以及使用篇
前篇istio介绍了引入istio前以及k8s的关系,下文主要做出补充以及对它的使用pilot:负责服务发现与路由规则(平面数据规则),pilot只提供服务注册接口,真正注册的工作还是会对接真正的注册中心nacos这些;数据平面下发规则:Mixer:该组件不是必须的,主要有两个功能,在调用服务时决定是否满足调用权限;收集上游和下游服务envoy日志;(这两个功能分别由mixer里的两个组件,policy和另一个组件来完成)catedel:该组件也不是在架构中必须的。
2025-02-21 10:42:30
812
原创 聊聊istio服务网格
特点:非侵入性;解决了服务与服务之间通讯的问题。通讯包括服务发现、负载均衡、监控、AB测试、速率限制、访问控制;引入istio,可以做到用户代码几乎不需要改动,而且可以做到用户代码与服务治理无感;
2025-02-21 10:32:54
830
原创 在后端服务和redis的方式实现概率抽奖逻辑
"999"类似于这样的逻辑。但随着需求变更,代码版本也需要迭代,每次保险代理人开单满多少金额就拥有一次抽奖机会,而且是开单金额越高,抽到一等奖的概率就越高,这种情况就要配置概率,例如有888、666、233、10元红包,所有概率加起来为1,开单10w以下,概率分别为“0.1”,“0.2”,“0.2”,“0.4”,10w以上,概率就配置为“0.4”,“0.3”,“0.2”,“0.1”,类似于这样的配置,这种配置的好处是扩展性啊,后续有关于新的活动上线,配置其他中奖概率即可。
2025-02-10 22:53:58
507
原创 响应式编程与协程
后来,操作系统开始提供多线程的支持,靠应用自己模拟多线程的做法自然是变少许多,而是演化为用户线程继续存在,也就说虚拟线程是在用户线程的基础上创建的,无论是创建和销毁都无需切换到内核态,性能自然高,而且一个协程的栈通常在几百个字节到几KB之间,所以Java虚拟机里线程池容量达到两百就已不小了,而支持协程的应用中,同时存在的协程数量可数以十万计;内核线程直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。
2025-02-03 22:57:22
934
原创 步入响应式编程篇(三)之spring webFlux与R2DBC
前面介绍响应式编程主要用到基于Stream API的Reactor API的方式,但如今业务操作需结合springboot,所以spring webFlux使用的更多,它是类似于spring mvc的web框架,不像springmvc的阻塞操作,一个请求通常对应一个线程,而spring webFlux响应式编程,天然支持异步+非阻塞+信号驱动;而且即使web框架用到响应式编程,但瓶颈仍然可能会出现在与关系型数据库的交互,遂引入了R2DBC等响应式方式与DB交互;
2025-01-26 07:07:15
1165
原创 步入响应式编程篇(二)之Reactor API
对于响应式编程的基于概念,以及JDK自带的落地实现,可以查看步入响应式编程篇(一)本篇将介绍Reactor API的使用:reactor官网介绍,响应式编程是一种与数据流和变化传播相关的异步编程范式。这意味着可以通过所采用的编程语言轻松表达静态(例如数组)或动态(例如时间发射器)数据流;
2025-01-21 11:05:40
1162
原创 步入响应式编程篇(一)
而且在查DB和访问第三方接口,各自维护一个异步线程,都有IO阻塞,为了解决这个问题,就要使用非阻塞的方式,而NIO就叩开了非阻塞的大门,其连接、读、写都是非阻塞的,只需一个线程就可以处理以上两步骤,节省JVM维护多个线程的成本。而响应式编程,是基于Stream流,可看做水流,简单来说,是定义流源头,然后往下流,使用链式处理多个步骤,最后流向最后,就是异常或响应信号。传统编码,操作流程常见的是命令式编程范式,如对于一个请求或操作来说,都是串行执行,直到异常或执行结束;命令式编程和响应式编程都是一种编程范式;
2025-01-16 18:39:12
902
原创 【设计模式篇】几分钟快速上手建造者模式
在开发时,类似于以上方式使用构造器来创建对象,是最常见的,①参数过多赋值属性时,容易赋值位置错误,如第一个参数和第二个都是String类型,所以第一个容易赋值到第二个参数那里去了;如//赋值乱了②有些参数用不到时,可以使用多个参数互相组合来构造不同的构造器,但又因参数过多而组合过多,需创建多组构造器,这又是一个问题;如//创建多组构造器③使用set对属性赋值,但是如果设置一个变量需要依赖另一个变量,就需要严格按照赋值的顺序,并且set破坏了”不可变对象“的密封性;
2025-01-11 22:37:40
1019
原创 使用模板方法模式+责任链模式优雅校验入参
无论是对于前端发起调用接口,抑或是内部RPC等方式调用接口,对于一个下游接口来说,众所周知,毫无疑问,一开始要做的肯定是对入参进行校验,但直接在controller写校验,或者封装一个校验方法(将多种类型的校验,如判空、判长度等),都违背了设计模式的单一职责,显得太不优雅。文本将介绍使用模板方法模式+责任链这两种设计模式,优雅地解决入参校验问题!因本文重要是介绍如何解决入参,故而模板方法模式和责任链模式是简单介绍。
2025-01-02 21:32:39
994
2
原创 【Elasticsearch篇】使用Reindex修改索引字段的解决方案
平时我们业务上,对于一个已建的索引,需要修改它的字段,或者新增字段是很平常的需求。对于新增字段,无论是索引已建还是未建情况,ES提供dynamic Mapping的方式都可以解决:是根据添加文档时,ES帮我们根据文档的信息自动推算出了各个字段的信息。但是啊,推算的东西它不一定是准确的,很多时候并不是我们想要的东西!所以我们一般是提前定义索引的mapping,而不是使用dynamic Mapping,避免在添加文档时让ES推断新增的字段类型!但需求要在已有的索引上添加字段,
2024-12-28 22:46:12
442
原创 【操作系统篇】白话讲Linux进程如何被CPU调度
CPU调度分为主动式调度和抢占式调度。其实通常不采用主动式调用,而是采用抢占式调用;举例:先有一块CPU,然后有a进程和b进程启动;
2024-12-22 13:40:46
1108
原创 关于k8s的无状态服务Deployment的滚动更新
无状态的服务是指不会对本地环境产生任何依赖。例如不会存储数据到本地磁盘,如Nginx。不像MySQL或Redis强依赖本地存储的数据;Deployment:可以理解为控制器,每个服务是部署在pod中,pod是由replica Set管理,Deployment通过selector标签管理replica Set。在K8s中通过编写资源清单yml文件来创建Deployment进而控制容器;滚动更新触发时机:只有修改了Deployment配置文件中的template中的属性后,才会触发更新操作;
2024-12-15 23:35:40
367
原创 JVM初始化时发生了死锁,该怎么办呢?
最近发现在启动一个项目花的时间很长,结果是一直卡死,启不起来。static {System.out.println("初始化类1……");try {static {System.out.println("初始化类2……");try {/*** @Describe 多线程同时创建两个对象*/System.out.println("开始执行……");}).start();}).start();执行结果发生了死锁。
2024-12-08 16:10:03
203
原创 关于mybatis的xml文件解析sql报错
在mybatis的xml文件中,如果sql的判断条件写成“=”是报解析错误,如图:因为在xml语法中,“”属于敏感字符,开头和结尾分别是用该字符来描述,以免解析存在歧义,索性提前报错。使用“
2024-11-25 09:54:10
568
原创 弄懂JDK和Dubbo的SPI,分别加载和实例化的时机
说起JDK和Dubbo中SPI区别的第一印象:JDK是按META-INFO/service下,接口全限定命名的文件上,指定该接口的所有实现类全限定名后,会全部加载该接口的所有实现类。而Dubbo和JDK类似,在META-INFO/dubbo/、META-INF/services/、META-INF/dubbo/internal/下指定,只不过接口全限定名文件里,指定的是key-value格式,key为扩展点名称,value为对应实现类的全限定名,然后根据key按需加载。
2024-11-22 17:25:30
638
原创 MySQL主从同步不一致遇到的问题
为了更了解binlog日志的结构,于是使用mysqlBinlog工具查看binlog日志,其中选取的binlog日志量是从主库同步过来的,进行重放,导致本地执行的事务与主库的不一致;主从同步的binlog格式使用的是mixed,也就是MySQL会判断同步的sql是否会引起主备不一致,当认为同步的sql不会引发不一致,就使用statement格式,否则使用row格式;
2024-11-09 17:10:41
1074
原创 一文彻底弄懂子查询在MySQL的执行以及优化过程
在写分页展示的接口时,因为需要考虑深度分页问题,于是将分页查询的sql改成子查询。SELECTFROMWHERE面对子查询,感觉要回顾一下它的执行过程了,毕竟MySQL对于后端来说,掌握到何种程度都不为过!
2024-10-29 19:33:21
684
原创 spring中两个bean之间使用@Autowire相互依赖,仍然报循环依赖问题的原因
3、因为步骤1,所以可以从三级缓存中找到,就执行getObject逻辑生成userService对象(此时仍然未初始化完毕),或判断有transactional注解或自定义aop,就会生成userService的代理对象,并放入二级缓存中,并删除三级缓存,然后orderService还要完成接下来的初始化阶段,此时orderService已经创建完毕,可以放入一级缓存;其实循环依赖说到底是因为编写代码不规范导致的,为了约束代码规范,于是spring官方默认关闭了开关,但仍然保留开启循环依赖;
2024-10-15 14:11:45
1018
原创 【操作系统篇】聊聊内核态和用户态
CPU正在执行用户进程指令,当外围设备完成用户请求的操作后,会对CPU发起中断信号,CPU会暂停执行下一条指令,然后转到和中断信号对应的处理程序去执行,也就是切换到了内核态。在系统处理上,中断和异常类似,都是从中断向量表找到相应的处理程序进行处理,区别在于中断来源于外部,不是由任何一条专门的指令造成,而异常是当前执行指令的结果),操作系统做相应的系统调用,将执行结果返回给应用程序时,就从内核态切换回用户态;在CPU所有指令中,有些指令是非常危险的,例如内存清除、设置时钟等,错误使用会导致系统崩溃。
2024-09-22 14:09:31
504
原创 ThreadPoolExecutor线程池的理解误区
ThreadPoolExecutor.execute()提交任务时,是先判断核心线程是否有空闲,如果有空闲就复用,核心线程没有空闲,就判断当前线程池的线程数如果小于corePoolSize核心线程数,才创建核心线程,直到大于coreSize,才将任务放入阻塞队里,如果阻塞队列满了,就加开线程,直到加开的线程等于maximumPoolSize,如果还有任务提交,就执行拒绝策略。在结束当前线程时,会判断线程池的线程数是否小于核心线程数,如果小于就addWorker创建新的线程。经过翻看源码,大致的认知没错,
2024-09-12 14:20:20
389
原创 未上传图片成功,导致查看图片失败的解决方案
创建调查问卷任务时,支持上传或不上传图片,而图片是上传到oss后返回图片路径,操作“创建任务”按钮,图片路径就和任务信息一起入库。但为了应对图片过大上传太慢的问题(同步上传会严重影响用户体验和系统效率),创建任务时需支持图片异步上传,就会出现任务信息入库时,oss还未返回图片URL。就会导致用户创建完任务立即查看,图片就加载失败。
2024-08-30 10:23:18
372
原创 idea导入项目(包括maven项目和普通javaweb项目)
idea导入Maven项目如果idea还在打开,可以点击close project,然后如下教程开始导入项目1.2.3.一般就可以引入成功了,但是也会有导入后无法识别是maven项目的情况,也就是pom文件没有变蓝,解决办法如下图:最后再打开pom文件,右击鼠标->maven->Reimport就可以将依赖导入。idea导入JavaWeb项目这种方式通常是用于导入旧项目,本人最近曾因导入旧项目而搞了太长时间。ps:前提是完整版的idea,官网免费的社区版是不完整的,没有Java
2021-04-18 22:57:45
1459
4
原创 Nginx负载均衡配置全过程
本文主要介绍使用配置Nginx的负载均衡过程。一台centos虚拟机充当3台应用服务器和负载均衡器。一、概念准备:负载均衡原理-原来发送到一台服务器的请求,经过负载均衡后,可以让多台服务器分担多个请求,减轻单台服务器的压力。单从字面上的意思来理解就可以解释N台服务器平均分担负载,不会因为某台服务器负载高宕机和某台服务器闲置的情况。所以说负载均衡通常应用在服务器集群上。而负载均衡器有多...
2020-02-12 23:11:59
683
原创 Tomcat和内存优化
参数调优:tomcat的四个参数-1、connectionTimeOut2、maxThreads,处理连接的最大线程数3、acceptCount,是socket的参数,底层有一个队列存储tomcat没来得及处理的请求。默认值为1004、maxConnections,tomcat最大连接处理数。默认值为1w.所以服务器处理请求数是acceptCount+maxConnections数。线程...
2020-01-06 06:57:06
340
原创 关于io流对象基本操作
首先输入、输出流的方向是针对java程序来说的,例如FileOutputStream就是程序到文件的,也就是写入文件。OutputStream、InputStream、Writer、Reader是抽象类。io流对象主要分三步:锁定目的路径、进行操作、关闭流。io流是没有实际功能的,主要交给os进行操作。字节流对象每一次只能进行操作一个字节,除非用数组、循环FileOutputStream...
2018-12-06 00:10:02
434
原创 新手写博客,当做练习,有错误的请各位前辈指教
**##File类1、io流中的File类,构造方法有(String name),(String prarent,String child),(Fileparent,String child)三种, 创建文件夹 boolean mkdir(),创建文件 booleancreateNewFile().2、删除文件、文件夹:file.delete()3、查看在构造方法传递的路径名,file....
2018-12-05 00:01:15
238
空空如也
世纪难题救急!vmware中勾选“将主机虚拟适配器连接到此网络”
2017-10-28
TA创建的收藏夹 TA关注的收藏夹
TA关注的人