![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java 相关
文章平均质量分 68
houxian1103
这个作者很懒,什么都没留下…
展开
-
SpringBoot 如何进行全局异常处理
在下面的例子中,我们继承了ResponseEntityExceptionHandler并使用@RestControllerAdvice注解了这个类,接着结合@ExceptionHandler针对不同的异常类型,来定义不同的异常处理方法。这里可以看到我处理的异常是自定义异常,后续我会展开介绍。ResponseEntityExceptionHandler中包装了各种SpringMVC在处理请求时可能抛出的异常的处理,处理结果都是封装成一个ResponseEntity对象。原创 2023-12-17 11:04:52 · 2043 阅读 · 0 评论 -
Spring Boot 优雅地处理重复请求
上面的问题其实已经是一个很不错的解决方案了,但是实际投入使用的时候可能发现有些问题:某些请求用户短时间内重复的点击了(例如1000毫秒发送了三次请求),但绕过了上面的去重判断(不同的KEY值)。原因是这些请求参数的字段里面,是带时间字段的,这个字段标记用户请求的时间,服务端可以借此丢弃掉一些老的请求(例如5秒前)。对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。原创 2023-12-09 17:31:54 · 3885 阅读 · 1 评论 -
高并发场景下的httpClient使用优化技巧
关于keep-alive,本文不展开说明,只提一点,是否使用keep-alive要根据业务情况来定,它并不是灵丹妙药。还有一点,keep-alive和time_wait/close_wait之间也有不少故事。在本业务场景里,我们相当于有少数固定客户端,长时间极高频次的访问服务器,启用keep-alive非常合适再多提一嘴,http的keep-alive 和tcp的KEEPALIVE不是一个东西。//如果没有约定,则默认定义时长为60s。原创 2023-12-08 23:01:06 · 1602 阅读 · 0 评论 -
如何合理估算 Java 线程池大小
这是根据大量的案例总结的Java线程池大小确定的公式,但在实操中所考虑的侧重点可能有不同,那么需要根据实际场景来微调,本文提供一种确定最优的思路,希望对你开发中确定线程池大小有所帮助!对于 CPU 密集型任务,我们希望最大限度地提高 CPU 利用率,但又不会因为过多的线程而压垮系统,否则会导致过多的上下文切换。我们的目标是确定有效处理这些请求的最佳线程池大小。IO密集型任务是那些与存储设备交互的设备(例如,读/写文件)、网络套接字(例如,进行 API 调用),或用户输入(例如,图形用户界面中的用户交互)。原创 2023-11-17 22:13:40 · 951 阅读 · 0 评论 -
优雅的写Controller 层代码这样写才可以
但是你要是这样返回给前端,前端妹妹就提刀过来了,当年约定好的状态码,你个负心人说忘就忘?为了跟前端妹妹打好关系,我们通常需要对后端返回的数据进行包装一下,增加一下状态码,状态信息,这样前端妹妹接收到数据就可以根据不同的状态码,判断响应数据状态,是否成功是否异常进行不同的显示。每个系统都会有自己的业务异常,比如库存不能小于0子类的,这种异常并非程序异常,而是业务操作引发的异常,我们也需要进行规范的编排业务异常状态码,并且写一个专门处理的异常类,最后通过刚刚学习过的异常拦截统一进行处理,以及打日志。原创 2023-10-02 10:47:23 · 179 阅读 · 0 评论 -
Redis BitMap+SpringBoot 实现签到与统计功能
在各个项目中,我们都可能需要用到签到和 统计功能。签到后会给用户一些礼品以此来吸引用户持续在该平台进行活跃。签到功能,使用 Redis 中的 BitMap 功能来实现,就是一个非常不错的选择。原创 2023-10-01 21:23:37 · 382 阅读 · 0 评论 -
SpringBoot 实现 PDF 添加水印方案
PDF(Portable Document Format,便携式文档格式)是一种流行的文件格式,它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下,我们需要对 PDF 文件添加水印,以使其更具有辨识度或者保护其版权。本文将介绍如何使用 Spring Boot 来实现 PDF 添加水印的方式。原创 2023-07-05 09:21:45 · 4988 阅读 · 0 评论 -
JWT 实现登录认证 + Token 自动续期方案
过去这段时间主要负责了项目中的用户管理模块,用户管理模块会涉及到加密及认证流程。今天就来讲讲认证功能的技术选型及实现。技术上没啥难度当然也没啥挑战,但是对一个原先没写过认证功能的菜鸡来说也是一种锻炼吧。原创 2023-04-18 23:49:51 · 8908 阅读 · 0 评论 -
Quartz与SpringBoot 搞定任务调度
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。Quartz的最新版本为Quartz 2.3.2JobJob是一个任务接口,开发者定义自己的任务须实现该接口,并重写execute(JobExecutionContext context)方法.原创 2023-02-19 00:31:08 · 14234 阅读 · 0 评论 -
Spring Security 从入门到精通
Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。一般Web应用的需要进行认证和授权。我们先要搭建一个简单的SpringBoot工程① 设置父工程 添加依赖② 创建启动类③ 创建Controller1.2 引入Spring原创 2023-02-11 23:59:50 · 21513 阅读 · 1 评论 -
Java 实现几种 异步的实现方式
异步执行对于开发者来说并不陌生,在实际的开发过程中,很多场景多会使用到异步,相比同步执行,异步可以大大缩短请求链路耗时时间,比如:发送短信、邮件、异步更新等,这些都是典型的可以通过异步实现的场景。首先我们先看一个常见的用户下单的场景:在同步操作中,我们执行到 发送短信 的时候,我们必须等待这个方法彻底执行完才能执行 赠送积分 这个操作,如果 赠送积分 这个动作执行时间较长,发送短信需要等待,这就是典型的同步场景。原创 2023-01-20 08:18:56 · 1897 阅读 · 0 评论 -
工具类库 Hutool介绍与使用(请记得收藏)
Hutool是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以“甜甜的”。Hutool中的工具方法来自于每个用户的精雕细琢,它涵盖了Java开发底层代码中的方方面面,它既是大型项目开发中解决小问题的利器,也是小型项目中的效率担当;Hutool是项目中“util”包友好的替代,它节省了开发人员对项目中公用类和公用工具方法的封装时间,使开发专注于业务,同时可以最大限度的避免封装不完善带来的bug。原创 2023-01-17 22:15:52 · 12114 阅读 · 1 评论 -
feign 远程调用异常处理
通过重写Decoder接口或者ErrorDecoder接口,可以做全局异常处理,避免在程序中,写入大量的异常处理。原创 2022-12-30 17:50:51 · 20321 阅读 · 0 评论 -
spring-retry优雅实现接口重试
value:抛出指定异常才会重试 include:和value一样,默认为空,当exclude也为空时,默认所有异常 exclude:指定不处理的异常 maxAttempts:最大重试次数,默认3次 backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000(单位毫秒),我们设置为2000;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。原创 2022-12-30 11:55:02 · 17925 阅读 · 0 评论 -
极简的Http请求client推荐-OkHttp
在Java的世界中,Http客户端之前一直是Apache家的HttpClient占据主导,但是由于此包较为庞大,API又比较难用,因此并不使用很多场景。而新兴的OkHttp、Jodd-http固然好用,但是面对一些场景时,学习成本还是有一些的。很多时候,我们想追求轻量级的Http客户端,并且追求简单易用。而OKHttp是一套处理 HTTP 网络请求的依赖库,由 Square 公司设计研发并开源,目前可以在 Java 和 Kotlin 中使用。对于 Android App来说,OkHttp 现在几乎已经占原创 2022-12-04 22:48:26 · 16941 阅读 · 0 评论 -
Redis 各种用法总结,你知道几种?
Redis绝不部分使用场景就是用来做缓存;但是,由于Redis 支持比较丰富的数据结构,因此他能实现的功能并不仅限于缓存,而是可以运用到各种业务场景中,开发出既简洁、又高效的系统;原创 2022-11-25 00:22:30 · 17277 阅读 · 0 评论 -
使用Nginx来实现限流
在之前的篇章中,我们谈到了限流的解决方案之一,使用网关进行限流的解决方案,而在众多的网关中,Nginx作为一款高性能、轻量级的组件,也提供了强大的可以配置的限流功能。本篇主要介绍了如何使用Nginx配置应用的限流,主要介绍了常用的3种限流方式,在实际应用中可以基于其中的一种或者几种配合起来进行使用。原创 2022-11-05 00:27:16 · 21401 阅读 · 4 评论 -
Gateway 代理日志记录 Filter
我们在使用网关的时候,有时候客户端会有莫名其妙的问题需要服务端辅助定位,这时候有一份完全的请求的信息的日志会非常有帮助,这里提供一种基于过滤器的实现方式。我的实现方式是作为一个工程来实现的,方便后续的引用pom.xml依赖原创 2022-10-22 00:15:40 · 17050 阅读 · 0 评论 -
gateway动态路由实现 mysql+redis 实现
大家都知道咱们在通常是使用配置文件来实现配置,但是这样就有一个弊端,就是每次修改的时候都要去重启来实现,并且管理起来非常麻烦,所有就有了这种实现方式。现在的实现方式:新的动态实现方式pom.xml依赖数据库脚本实现核心配置类的实现核心配置类,项目初始化加载数据库的路由配置,主要实现数据载入,以及数据的初始化,为了提高效率是被数据中数据同步到redis 中。数据库管理类Table 管理类Map 操作类service 层的实现 service层,增、删、改、查数据库路由配置信息自定义con原创 2022-10-21 23:49:23 · 17550 阅读 · 0 评论 -
怎样来实现数据接口的加密?
特别是在做一下政府项目时,有时候需要对所有接口数据进行加密。请求头header:body体// 原始请求体 {"page" : 1 , "size" : 10 } // 加密后的请求体 {"data" : "1ZBecdnDuMocxAiW9UtBrJzlvVbueP9K0MsIxQccmU3OPG92oRinVm0GxBwdlXXJ" } // 加密响应体: {原创 2022-10-12 14:41:45 · 1600 阅读 · 0 评论 -
SpringBoot 设置动态定时任务
SpringBoot项目中简单使用定时任务,不过由于要借助cron表达式且都提前定义好放在配置文件里,不能在项目运行中动态修改任务执行时间,不是太灵活,改文章是主要是实现在固定的基础上进行的一小步的改进,如果更复杂的这种定时任务调度的实现请可以借助xxl-job 实现分布式任务调度。虽然这种方式看看起来比较笨,但他有时确实可以解决问题,这里是介绍个思路,其实他可以实现一些通过数据库存储来实现任务调度的灵活性,但是如果是要实现分布式任务的话,可能就无法满足要求,但你可以试一下xxl-job。原创 2022-10-04 17:50:30 · 16715 阅读 · 0 评论 -
工作中使用基本类型的数据好还是包装类好
咱们举个例子,一个计算盈利的系统,其盈利比例有正有负,若使用了基本类型bouble定义了数据,当RPC调用时,若出现了问题,本来应该返回错误的,但是由于使用了基本类型,返回了0.0,系统会认为没有任何问题,今年收支平衡,而不会发现其实是出现了错误。若使用了包装数据类型Double,当RPC调用失败时,会返回null,这样直接就能看到出现问题了,而不会因为默认值的问题影响判断。因此,这里建议大家POJO中使用包装数据类型,局部变量使用基本数据类型。...原创 2022-08-31 14:25:00 · 185 阅读 · 0 评论 -
排查线上环境 OOM 问题
概述有时Java服务端上线后,运行一段时间后就会出现OOM 问题,这样问题是非常严重的。那要怎样排查?怎样解决?工具安装:为什么会要安装工具?这是因为我们现在按照的open jdk 是默认没有安装jmap,jstatck,需要自行安装。以 Centos7 为例 介绍安装过程先使用 java -version 版本 号OpenJDK Runtime Environment (build 1.8.0_322-b06)查询 Jmap 与java 当前版本匹配的版本 yum whatpro原创 2022-05-27 16:36:37 · 390 阅读 · 0 评论 -
SpringBoot整合MongoDB(MongoRepository+MongoTemplate)
说 明:SpringBoot 对mongodb操作存在两种操作方式,一种是MongoRepository,一种是MongoTemplate。准备 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifa原创 2022-05-25 23:50:11 · 753 阅读 · 0 评论 -
在Java中编码base64并在C#中解码
问题概述:java和c#之间遇到base64问题,我从java urlconnection将编码字符串发送到asp.net处理程序,我比较两个字符串,一个在java中从字节数组生成的字符串和一个在asp.net第一次解码中接收的字符串,两者都有是相同的,但在解码 c# 中的字节数组后与 java 中的字节数组不相等。问题原因:我正在使用新的 sun.misc.BASE64Encoder().encode(javabytearray);在 java 和 System.Convert.FromBase原创 2022-04-11 17:23:42 · 2167 阅读 · 3 评论 -
SpringCloud Gateway
1.1 SpringCloud Gateway 简介SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul原创 2021-08-29 22:13:30 · 292 阅读 · 1 评论 -
Async整合线程池
为什么在使用Async 要使用多线程在spring boot 中使用 @Async 是为了使用多线程,但是在使用过程中你会发现在使用中每一个使用@Async 注解的时候都会产生一个独立线程,这样线程的创建、销毁 就非常销毁cpu。于是就考虑使用线程池方式实现。@Async 线程使用如下定义线程池在这里插入代码片```@Configuration@EnableAsyncpublic class AsyncPoolConfig { @Bean(name = "ThreadPool原创 2021-08-12 23:41:41 · 342 阅读 · 0 评论 -
通用订单号生成规则
直接上代码方式一:/** * 生成指定长度的随机数 * * @param length * @return */public static int genRandomNum(int length) { int num = 1; double random = Math.random(); if (random < 0.1) { random = random + 0.1; } for (int i = 0; i < len原创 2021-05-07 14:37:34 · 1087 阅读 · 0 评论 -
两个float和double 怎么比较大小
1.比较大小float 和double类型不能直接比较相等或不等,但可以比较>,<,>=,<=2.比较是否相等用==从语法上说没错,但是本来应该相等的两个浮点数由于计算机内部表示的原因可能略有微小的误差,这时用==就会认为它们不等。应该使用两个浮点数之间的差异的绝对值小于某个可以接受的值来判断判断它们是否相等,比如用。if(fabs(price-p)<0.000001)来代替 if(price==p)定义一个精度,用差的绝对值比...原创 2021-03-04 21:03:04 · 3235 阅读 · 1 评论 -
MySQL 给已存在的数据表 增加字段和注释
问题描述在开发一个系统的过程中,经常会遇到随着系统服务功能的扩展,或者服务之间的关联,需要适当的修改原有的表结构,比如,增加一些必要的字段。示例:在已存在的设备表device中,增加设备IP,设备名称,设备类型三个字段。使用MySQL命令,在MySQL客户端工具或者命令行中,执行以下命令:ALTER TABLE device ADD COLUMN `device_ip` VARCHAR(32) DEFAULT NULL COMMENT '设备IP';ALTER TABLE device原创 2021-02-25 15:59:51 · 1087 阅读 · 0 评论 -
Mysql 保存float数组的一种方式
最近做人脸识别,想把提取的特征向量,float型的512维数组,保存到Mysql数据库。借助gson 来实现数据的转换来实现: Gson gson = new Gson(); String str = "[0.046976,-0.035901,-0.023184,0.014815,0.035589,-0.024258,-0.117624,-0.020918,0.041997,-0.019475,-0.035084,0.049479,-0.053332,0.030442原创 2021-02-25 15:55:02 · 1685 阅读 · 0 评论 -
DailyRollingFileAppender 支持设置最大日志数量
Log4j现在已经被大家熟知了,所有细节都可以在网上查到,Log4j支持Appender,其中DailyRollingFileAppender是被经常用到的Appender之一。最常用的Appender——RollingFileAppender下面是RollingFileAppender的一个Log4j配置样例(配置1):根据文件大小进行进行回滚。log4j.appender.R=org.apache.log4j.RollingFileAppender log4j.appender.R原创 2020-12-28 15:35:42 · 2613 阅读 · 3 评论 -
云服务AppId或AppKey和AppSecret生成与使用
App key和App SecretApp key简称API接口验证序号,是用于验证API接入合法性的。接入哪个网站的API接口,就需要这个网站允许才能够接入,如果简单比喻的话:可以理解成是登陆网站的用户名。App Secret简称API接口密钥,是跟App Key配套使用的,可以简单理解成是密码。App Key 和 App Secret 配合在一起,通过其他网站的协议要求,就可以接入API接口调用或使用API提供的各种功能和数据。比如淘宝联盟的API接口,就是淘宝客网站开发的必要接入,淘.原创 2020-12-25 10:29:55 · 3319 阅读 · 0 评论 -
Spring的@Qualifier注解使用说明
@Qualifier注解了,qualifier的意思是合格者,通过这个标示,表明了哪个实现类才是我们所需要的,我们修改调用代码,添加@Qualifier注解,需要注意的是@Qualifier的参数名称必须为我们之前定义@Service注解的名称之一。@Service("employeeserver")public class EmployeeServiceImpl implements EmployeeService { public EmployeeDto getEmployeeById(原创 2020-11-29 02:17:35 · 871 阅读 · 0 评论 -
SpringBoot中对@Async的使用和总结
1. @Async 的使用Spring中启用@Async// Spring boot启用:@EnableAsync@EnableTransactionManagementpublic class AsyncApplication { public static void main(String[] args) { SpringApplication.run(AsyncApplication .class, args); }}@Async应用默认线程池原创 2020-11-29 02:04:56 · 27108 阅读 · 4 评论 -
2020年大厂面试题
无意中搜索到的大厂面试题,推荐给大家,内容丰富。https://github.com/0voice/interview_internal_reference原创 2020-11-24 10:19:30 · 278 阅读 · 0 评论 -
java.security.NoSuchAlgorithmException:Cannot find any provider supporting AES/CBC/PKCS7Padding问题解决
由于小程序开发的需求,需要在后台对微信接口返回的敏感信息加密数据进行解密,以便开发使用,但是,在解密时出现以下异常:java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/CBC/PKCS7Padding解决方式: 在 jdk安装目录中(%JAVA_HOME%\jre\lib\ext)添加 jar 包bcprov-jdk15on-1.58.jar。(我添加的是这个,下载的最新的,jar.原创 2020-11-13 17:19:02 · 2192 阅读 · 0 评论 -
使用Nginx实现页面缓存
1、缓存指令Nginx的缓存配置比较直观简单,具体有下面几个指令需要知道:A、proxy_cache_path格式:proxy_cache_path path [levels=numbers] keys_zone=zone_name:zone_size[inactive=time] [max_size=size]说明:path -缓存文件存放的位置levels -缓存目录结构,可以是1、2、3位数字作为目录,最多是3位数字如:1,1:2keys_zone -指定缓存池名字及大小,原创 2020-11-09 12:42:40 · 1220 阅读 · 0 评论 -
自定义 DailyRollingFileAppender-实现设置文件大小和备份天数
1、重写FileAppender :package com.bankht.cis.tps.apps.tps.util;import org.apache.log4j.FileAppender;import org.apache.log4j.Layout;import org.apache.log4j.helpers.OptionConverter;import org.apache.log4j.spi.LoggingEvent;import java.io.*;import java.原创 2020-11-07 22:43:59 · 2020 阅读 · 0 评论 -
DailyRollingFileAppender的基本使用
DailyRollingFileAppender是日志记录软件包Log4J中的一个Appender,它能够按一定的频度滚动日志记录文件。我们可以按下面的方式配置DailyRollingFileAppender:log4j.rootCategory=INFO,filelog4j.appender.file=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.file.DatePattern='.'yyyy-MM-ddlog4j.appe原创 2020-11-07 21:55:59 · 4463 阅读 · 0 评论