java web
文章平均质量分 76
Coder-文小白
95后Java后端程序员,新晋菜鸟奶爸,开始尝试探索副业的小白。微信公众号:Coder-文小白
展开
-
如何基于Spring Boot项目从零开始打造一个基于数据库号段模式去中心化的分布式ID生成方案
在当前系统开发过程中,单体架构的应用正在走向消亡,越来越多的应用开始分布式架构,在分布式架构设计过程中,有一个问题往往避免不了,就是分布式ID生成问题。在常见解决方案中,有使用雪花算法或者自建统一ID生成服务雪花算法是一个很好的分布式ID生成方案,不过雪花算法的递增规律可能看起来不太明显,自建统一ID生成服务面对中小型系统来说又太过于复杂了,那除了这些方法之外还有什么好的解决方法没有呢?这次我们介绍一个解决方案,基于数据库号段的解决方案。原创 2024-04-27 10:34:59 · 865 阅读 · 1 评论 -
Java应用开发必备:使用 easy-captcha 组件生成验证码的详细介绍
最近系统开发在优化验证码的相关功能,第一反应就是有没有开源的第三方组件可以使用呢。在一番寻觅以后,还真发现一个好用的第三方验证码组件。是一个开源的Java库,用于生成和验证验证码,它的API上手难度低,可以生成包含数字字母中文和数字运算验证码,还有会动的GIF格式验证码哦,此外还允许开发者针对长度字符集字体颜色样式等方面进行自定义,可以满足大部分复杂场景。// 指定宽度为200,高度为100,验证码字符为5个。原创 2024-04-27 10:33:44 · 3274 阅读 · 3 评论 -
记一次中间件宕机以后持续请求导致应用OOM的排查思路(server.max-http-header-size属性配置不当的严重后果)
最近有一次在系统并发比较高的时候,数据库突然发生了故障,导致大量请求失败,在数据库宕机不久,通过应用日志可以看到系统发生了。通过内部排查得知,原来是应用提供的某个接口是GET请求方式,在请求URL中拼接的参数过大的时候会报。初次看到这个现象的时候,我还是有点懵逼的,数据库宕机以后为什么会导致应用发生OOM呢?还在继续接受请求,由于请求响应阻塞,同时此时会有大量请求进行堆积,但是每次请求都会创建。最后,将该GET请求方式接口修改成了POST方式请求,参数传递也通过请求体进行,原创 2024-04-19 19:46:47 · 1390 阅读 · 0 评论 -
什么?我一行日志代码竟然让接口响应延迟了1s
代码逻辑很简单,参数type如果是old,日志级别是debug的话,需要打印一下debug日志,debug日志中需要调用一个方法。在某次开发过程中,对于一个接口,我只是加了一行代码竟然让接口响应延迟大大增加,感觉是很小一个错误,在此记录一下。可以看到此时响应时间增长到1000多毫秒了,两者只是一行日志的区别。了,通过应用日志也可以发现test()方法不再执行。可以看到此时响应时间在几十毫秒的样子。可以看到此时,方法耗时。原创 2024-04-19 19:42:49 · 259 阅读 · 0 评论 -
Spring Boot应用集成Actuator端点自定义Filter解决未授权访问的漏洞
我们知道想要实时监控我们的应用程序的运行状态,比如实时显示一些指标数据,观察每时每刻访问的流量,或者是我们数据库的访问状态等等,需要使用到Actuator组件,但是Actuator有一个访问未授权问题,简单说就是其他人可以通过Actuator组件暴露的URL进行端点信息访问,甚至shutdown应用。那么我们有没有什么解决方法呢?endpoints:web:exposure:whiteUrl: # 白名单,配置白名单的URL请求时不需要验证,多个可以用英文逗号分隔。原创 2024-02-19 22:51:50 · 2168 阅读 · 0 评论 -
关于Spring Boot应用系统避免因为日切(日期切换)导致请求结果变更的一种解决方案
在系统开发过程中,有些业务功能面临日切(日期切换)问题,比如结息跑批问题,在当前工作日临近24点的时候触发结息,实际交易时间我们预期的是当前时间,但是由于业务执行耗时,可能进行了日切,业务跑到下一个工作日了,这样业务如果采用下一个工作日的时间进行业务计算,可能会导致业务结果与预期不一致,有没有什么解决方案呢?本文只是提供一种业务日切处理的大概思路,实际开发过程中,请以业务逻辑为根本,完善日切面临的问题解决方案,避免无脑照搬导致的业务异常。原创 2024-02-18 22:47:57 · 904 阅读 · 0 评论 -
Spring Boot项目内置Tomcat容器如何配置使用https协议访问(data isn‘t an object ID (tag = 48)问题解决方案)
将上面生成的pkcs12类型证书文件拷贝到Spring Boot项目的。,不过Spring Boot项目不能直接使用crt证书,https生成私钥和crt证书文件,可以参考之前的博客。此时需要升级JDK版本,resource目录。原创 2024-02-08 09:15:00 · 834 阅读 · 1 评论 -
使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密)
在业务系统开发过程中,我们必不可少的会使用数据库,在应用开发过程中,数据库连接信息往往都是以明文的方式配置到yaml配置文件中的,这样有密码泄露的风险,那么有没有什么方式可以避免呢?方案当然是有的,就是对数据库密码配置的时候进行加密,然后读取的时候再进行解密,这样就可以避免敏感信息泄露了。针对加密的数据库配置信息,需要自定义解密,所以需要自定义一个DataSource对象// 对用户名进行解密 return SM4Utils . decryptStr(super . getUsername());原创 2024-02-07 17:11:52 · 3978 阅读 · 1 评论 -
nacos安装手册
在nacos的解压目录nacos的/config目录下,有配置文件cluster.conf,请每行配置成ip:port。(需要每个节点都配置。初始化MySQL数据库,sql可以在nacos config目录下面获取。修改application.properties配置。登录任意一个节点 账号: nacos / nacos。默认账号: nacos / nacos。集群搭建以3个节点为例进行步骤说明。依次在服务节点关闭nacos服务。依次在服务节点启动nacos服务。原创 2024-02-07 19:30:00 · 1093 阅读 · 0 评论 -
使用Nginx搭建旁路服务器获取客户端真实IP
在实际业务开发过程中,很多时候有记录客户端真实IP的需求,但是从客户端发送的请求往往会经过很多代理服务器,导致后端服务获取的IP为代理以后的IP,不具有业务含义。为了解决这个问题,可以搭建一个旁路服务器,前端在发起请求的时候需要先请求旁路服务器,获取该客户端的真实IP(可对该IP地址进行缓存,不必每次发送请求前都先请求旁路服务器),在真正向后端发送请求时,将获取的IP地址放入请求头中,将真实的客户端IP地址进行传递。原创 2024-02-06 18:43:22 · 1650 阅读 · 0 评论 -
Spring Boot集成百度UidGenerator雪花算法使用以及自定义starter封装UidGenerator支持原生DB、Redis、自定义方式获取workID介绍
当下系统开发过程中,普遍会采用分布式微服务架构,在此技术背景下,分布式ID的生成和获取就成为一个不得不考虑的问题。常见的分布式ID生成策略有基于数据库号段模式UUID基于Redis基于zookeeper雪花算法(snowflake)等方案,这其中雪花算法由于其简单、独立、易用的特性,被众多技术选型推荐。雪花算法 (SnowFlake),是 Twitter 开源的分布式 id 生成算法,可以不用依赖任何第三方工具进行自动增长的数字类型的ID生成;雪花算法的核心逻辑是使用一个64 bit 的 long 型。原创 2024-02-05 21:19:33 · 3599 阅读 · 2 评论 -
记一次生产系统每隔10小时(36000000毫秒)固定进行一次Full GC排查思路
某个应用在生产环境通过系统监控发现,应用每隔10小时就会触发一次Full GC,该系统当时承接的业务量并不大,而且固定10小时就会进行Full GC,通过监控时间轴发现Full GC频率很规律,直觉告诉我这不是JVM自身触发的Full GC操作,应该是某个定时任务中进行了垃圾回收操作,但是什么业务场景会存在这种情况呢?方法调用进行了搜索,甚至为了防止是通过反射方式调用的,还检索了所有业务代码,但是均未发现有业务代码进行该方法的调用。,如果没有设置,默认为false,此时会通过反射调用。原创 2024-02-04 20:20:06 · 470 阅读 · 0 评论 -
SpringBoot框架自定义解析配置项占位符(${})获取配置
在最近项目开发中,有一个需求,针对自定义注解中字符串属性值的设置需要支持使用”${xx}“占位符获取在SpringBoot框架配置文件中配置项对应的属性值,而且支持多个”${xx}“标识的配置任意拼接。原创 2024-01-17 22:07:41 · 912 阅读 · 1 评论 -
基于Google guava工具实现一致性Hash算法的应用实践
在分布式架构系统中,要将数据存储到具体的节点上,如果采用普通的key%N取模Hash算法,将数据映射到具体的节点上,就有可能大部分数据集中在某一个节点,形成“热点”数据,造成数据分布失衡,二是如果有一个机器加入或退出这个集群,则大部分的数据映射都无效了,数据需要重新进行排列。基于上面普通Hash算法的问题,1997年由麻省理工学院提出一致性Hash算法,引入了“虚拟节点”的概念:即想象在这个环上有很多“虚拟节点”,数据的存储是沿着环的顺时针方向找一个虚拟节点,每个虚拟节点都会关联到一个真实节点;原创 2024-01-18 08:00:00 · 873 阅读 · 0 评论 -
Spring Boot框架中Controller层API接口如何支持使用多个@RequestBody注解接受请求体参数
众所周知,在Spring Boot框架中,Controller层API接口编码获取请求体参数时,在参数上会使用@RequestBody注解;如果一次请求中,请求体参数携带的内容需要用多个参数接收时,能不能多次使用@RequestBody注解呢?原创 2024-01-16 22:24:36 · 2315 阅读 · 4 评论 -
layering-cache扩展——多级缓存有效时间增加随机浮动时间,防止缓存雪崩
一、背景最近在项目中有使用layering-cache(https://gitee.com/xiaolyuh/layering-cache?_from=gitee_search)进行多级缓存,有开发人员说想在缓存的时候增加一定时间的随机浮动,已到达防止缓存雪崩的目的,由于layering-cache是开源的,想增加此功能也十分简单,在此记录一下。缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。二、编码实现本次改造只针对二级缓存,也就是redis缓存层面原创 2022-04-11 22:24:03 · 996 阅读 · 0 评论 -
MyBatis的Mapper.xml文件中关于字符串的判断写法
在mybatis的Mapper.xml文件中,如果需要在<if>标签中判断字符串是否相等,是不能使用:<if test="str == '0'"></if>这种方式的。解决方式有两种:使用toString()方法:<if test="str == '0'.toString() "></if>使用单引号嵌套双引号的方法:<if test='str == "0" '></if>...原创 2021-01-26 10:37:48 · 4678 阅读 · 1 评论 -
使用C#实现一个可以预览图片,并且可以对图片进行自由裁剪预览的照相客户端
一、前言最近系统需要优化照相客户端,最开始的拍照客户端是使用浏览器插件实现的,不过兼容性不太好,然后使用java写了一款客户端,感觉还是有点臃肿,最近优化系统,决定重新使用C#实现了一个拍照客户端。二、功能演示:启动拍照客户端:客户端启动以后,会默认选择第一个照相设备打开,你可以自由选择照相设备,如果是后插入照相设备,点击【刷新】按钮即可。拍照:点击【拍照】按钮,会进入刚刚拍摄的照片的预览界面,左侧是原图,右侧默认是原图按照一寸照片的缩放。如果你想裁剪图片,可以拖动红色的矩形框,然后原创 2021-01-22 08:49:58 · 950 阅读 · 0 评论 -
Java web项目中使用C#配合开发,实现双屏显示功能
一、前言最近系统开发中,新增了一个需求,要求客户登记以后,需要有一个对外的屏幕显示客户登记信息,方便客户确认个人信息及相关信息是否有误。在了解相关需求以后,我打算使用C#来配合实现双屏显示功能。作为一名java程序员,在使用C#开发过程中,感觉也挺有意思的,特此,简单记录一下实现思路。二、代码实现java服务端创建一个spring boot项目,项目结构如下:导入maven依赖: <dependency> <groupId>or原创 2021-01-20 17:47:19 · 1358 阅读 · 0 评论 -
谷歌浏览器安装JSON格式化插件简单教程
在平时的开发中,老是会测试使用浏览器访问URL返回json格式数据的情况,由于原生的浏览器显示的json格式数据结构不清晰,不便于查看,因此可以使用第三方插件,格式化显示的json数据,方便查看。下载JsonView扩展程序压缩包:github下载地址直接下载Zip压缩包就好:解压JSONView-for-Chrome-master.zip压缩包:在谷歌浏览器的扩展程序界面添加JsonView扩展程序:浏览器地址栏输入:chrome://extensions/查看开发者模式是否原创 2020-12-16 14:37:32 · 1229 阅读 · 1 评论 -
spring boot 2.x整合websocket——服务器端和客户端开发
一、前言WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。最近做的系统中,也涉及到websocket的使用,打算在这里记录一下原创 2020-12-07 15:21:05 · 726 阅读 · 0 评论 -
spring boot 2.x 使用mybatis拦截器实现系统日志记录(将完整参数的SQL语句记录到数据库中)
一、前言最近要求做系统的全局日志记录功能,要求把执行的完整SQL语句保存到数据库中,在实际开发中最终放弃了使用AOP的方法,改由使用mybatis的拦截器实现,这里简单记录一下实现过程。系统数据库主要环境:数据库:MySQL数据源:DruidDataSource二、创建数据库用表这里只是简单演示一下实现过程,只用两张表模拟一下:用户表(user)CREATE TABLE `user` ( `id` bigint(20) NOT NULL, `age` int(11) NUL原创 2020-12-04 16:37:40 · 2439 阅读 · 2 评论 -
RequestContextHolder跨线程获取不到request对象,解决方法
一、前言最近在做一个系统的全局日志拦截记录功能,有一个需要记录的IP地址的信息,我是从HttpServletRequest对象中获取的,但是我发现如果使用线程池以后,记录日志信息会报错,主要是获取不到HttpServletRequest对象。下面使用代码简单演示一下问题和解决方法:二、代码演示创建一个spring boot项目,项目结构如下:2. 导入maven依赖: <dependency> <groupId>org.spri原创 2020-12-03 11:38:41 · 7337 阅读 · 6 评论 -
使用localStorage实现页面之间通信,一个页面发生变化,另一个页面也同时发生变化
不知道大家在平时开发过程中有没有遇到这种需求,浏览器打开两个窗口,一个发生变化,另一个也要同时发生变化。这种需求怎么实现呢,可以参考使用localStorage实现。简单介绍一下localStorage:在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的,解决了cookie存储空间不足的问题(cookie中每条cookie的存储空间为4k),localStorage中一般浏览器支持的是5M大小,这个在不同的浏览器中localStorage会有所不同。loca原创 2020-10-24 21:42:23 · 5174 阅读 · 0 评论