![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
服务器相关
文章平均质量分 73
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 评论 -
订单 延后自动关闭,五种方案优雅搞定!
这样可以看出定时轮由个3个重要的属性参数,ticksPerWheel(一轮的tick数),tickDuration(一个tick的持续时间)以及 timeUnit(时间单位),例如当ticksPerWheel=60,tickDuration=1,timeUnit=秒,这就和现实中的始终的秒针走动完全类似了。该方案是利用JDK自带的DelayQueue来实现,这是一个无界阻塞队列,该队列只有在延迟期满的时候才能从中获取元素,放入DelayQueue中的对象,是必须实现Delayed接口的。原创 2023-10-22 00:23:21 · 1057 阅读 · 0 评论 -
优雅的写Controller 层代码这样写才可以
但是你要是这样返回给前端,前端妹妹就提刀过来了,当年约定好的状态码,你个负心人说忘就忘?为了跟前端妹妹打好关系,我们通常需要对后端返回的数据进行包装一下,增加一下状态码,状态信息,这样前端妹妹接收到数据就可以根据不同的状态码,判断响应数据状态,是否成功是否异常进行不同的显示。每个系统都会有自己的业务异常,比如库存不能小于0子类的,这种异常并非程序异常,而是业务操作引发的异常,我们也需要进行规范的编排业务异常状态码,并且写一个专门处理的异常类,最后通过刚刚学习过的异常拦截统一进行处理,以及打日志。原创 2023-10-02 10:47:23 · 179 阅读 · 0 评论 -
Redis BitMap+SpringBoot 实现签到与统计功能
在各个项目中,我们都可能需要用到签到和 统计功能。签到后会给用户一些礼品以此来吸引用户持续在该平台进行活跃。签到功能,使用 Redis 中的 BitMap 功能来实现,就是一个非常不错的选择。原创 2023-10-01 21:23:37 · 382 阅读 · 0 评论 -
基于 Nginx 实现一个灰度上线系统
软件开发一般不会上来就是最终版本,而是会一个版本一个版本的迭代。新版本上线前都会经过测试,但就算这样,也不能保证上线了不出问题。所以,在公司里上线新版本代码一般都是通过灰度系统。灰度系统可以把流量划分成多份,一份走新版本代码,一份走老版本代码。而且灰度系统支持设置流量的比例,比如可以把走新版本代码的流量设置为 5%,没啥问题再放到 10%,50%,最后放到 100% 全量。这样可以把出现问题的影响降到最低。不然一上来就全量,万一出了线上问题,那就是大事故。原创 2023-08-25 23:35:59 · 235 阅读 · 0 评论 -
使用 EasyExcel 实现 百万级数据导入导出
在项目开发中往往需要使用到数据的导入和导出,导入就是从Excel中导入到DB中,而导出就是从DB中查询数据然后使用POI写到Excel上。大数据的导入和导出,相信大家在日常的开发、面试中都会遇到。很多问题只要这一次解决了,总给复盘记录,后期遇到同样的问题就好解决了。好啦,废话不多说开始正文!1.如此大批量数据的导出和导入操作,会占用大量的内存实际开发中还应限制操作人数。2.在做大批量的数据导入时,可以使用jdbc手动开启事务,批量提交。原创 2023-08-19 16:06:59 · 1949 阅读 · 0 评论 -
JWT 实现登录认证 + Token 自动续期方案
过去这段时间主要负责了项目中的用户管理模块,用户管理模块会涉及到加密及认证流程。今天就来讲讲认证功能的技术选型及实现。技术上没啥难度当然也没啥挑战,但是对一个原先没写过认证功能的菜鸡来说也是一种锻炼吧。原创 2023-04-18 23:49:51 · 8908 阅读 · 0 评论 -
细说二维码扫码登录的原理
在日常生活中,二维码出现在很多场景,比如超市支付、系统登录、应用下载等等。了解二维码的原理,可以为技术人员在技术选型时提供新的思路。对于非技术人员呢,除了解惑,还可以引导他更好地辨别生活中遇到的各种二维码,防止上当受骗。二维码,大家再熟悉不过了购物扫个码,吃饭扫个码,坐公交也扫个码在扫码的过程中,大家可能会有疑问:这二维码安全吗?会不会泄漏我的个人信息?更深度的用户还会考虑:我的系统是不是也可以搞一个二维码来推广呢?这时候就需要了解一下二维码背后的技术和逻辑了!二维码最常用的场景之一就是通过手机原创 2023-04-05 22:22:01 · 28091 阅读 · 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 评论 -
Ngnix 实现访问黑名单功能
有时候在配置的时候我们会禁用到一些IP,使用nginx 禁用到ip但是需要重启nginx,这样当我们要是实现动态的这种就比较麻烦,当然你可以使用网关来实现相对于nginx实现的这种方式要好很多,但是今天咱们说到这里,那就看看我们使用nginx 怎样实现黑名单的动态添加。好了,上述的就可以简单实现了nginx的动态黑名单的添加。原创 2023-01-06 23:34:03 · 19023 阅读 · 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 评论 -
分布式文件存储-FastDFS环境搭建
FastDFS是什么?我们这里可以看一下度娘的解释。FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。我这里使用服务器环境是 Centos7.FastDFS只能上传500MB的小文件tracker:跟踪者,负责调度存储服务。storage:用于文件存储。client:调用tracker。原创 2022-12-12 17:09:36 · 17319 阅读 · 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 评论 -
Sentinel网关限流 与Spring Cloud Gateway 整合
从上面的演示中可以看到默认的异常返回信息是:“Block…”,这种肯定是客户端不能接受的,因此需要定制自己的异常返回信息。下面介绍两种不同的方式定制异常返回信息,开发中自己选择其中一种。文章介绍了Spring Cloud Gateway整合Sentinel对网关层进行限流,以及关于限流的一些思考。原创 2022-10-30 23:52:50 · 51592 阅读 · 0 评论 -
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 评论 -
怎样构建符合HIPAA的服务?
1996年的《健康保险携带与责任法案》(HIPAA)是一项法律,为处理患者数据和受保护的健康信息(PHI)提供了标准。HIPAA规则分为几个规则,例如-隐私,安全,交易和代码,标识符,执行,违约通知,综合最终规则。HIPAA安全规则提供了指导,以保护系统以电子形式创建,接收,维护或传输的个人可识别健康信息。此信息称为“电子保护健康信息”(e-PHI)。安全规则不适用于以口头或书面形式传送的PHI。处理个人医疗数据的任何服务都必须符合HIPAA。...原创 2022-08-13 10:43:53 · 320 阅读 · 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 评论 -
EnableScheduling 使用与启用启用多线程
背景在java 开发环境中,我们经常会需要用到定时任务来帮助我们完成一些特殊的任务,比如晚上12点清理脏数据等等,凌晨三点清理计算报表等。如果我们使用SpringBoot来开发,那么定时任务将会变得非常简单。SpringBoot默认已经帮我们封装好了相关定时任务的组件和配置,我们只需要在相应的地方加上@EnableScheduling注解就可以实现定时任务。定时任务的使用SpringBoot项目只需要在启动类上加上@EnableScheduling即可开启定时任务@SpringBootApplic原创 2022-05-14 23:42:27 · 1007 阅读 · 1 评论 -
WebSocket+SpringBoot消息主动推送
概 述通常在web前端通知客户的时候,一种方式是通过Http/Https轮询来实现,另外一种方式是通过WebSocket 这种轻量Tcp连接来实现,我们这边介绍的就是消息推送。Http+WebSocket 原理解析方案的实现前端实现webSocket 的方式如下两种方式仅供参考:第一种一种是使用sockjs。第二种是使用h5的标准。使用Html5标准自然更方便简单,所以记录的是配合h5的使用方法。前端代码index.html<!DOCTYPE html><html原创 2022-05-14 16:17:40 · 1518 阅读 · 0 评论 -
nginx反向代理实现websocket负载均衡
背景:由于业务服务器在后台,没有公网来对外提供webSocket服务,所以就需要nginx 来实现反向代理。解决方案:解决的方法也是在nginx配置一个upstream,里面可以若干个节点信息,也可以是引入一个文件,这个文件包含的节点信息,这样可能更方便维护节点信息。 然后就是server进行请求转发到upstream。本地配置一个虚拟域名www.xxx.com,然后修改nginx配置,想要wss的话,就给域名配置证书就行了,其他不变。upstream websocket { #ip_ha原创 2022-05-08 00:55:36 · 1422 阅读 · 0 评论 -
nginx只允许域名访问,禁止ip访问
背景:北京市通信管理局通知不允许使用ip访问,国家的规定不能打马虎眼了,安排上。解决方法:这里介绍修改配置文件nginx.conf两种方法:1)在server段里插入如下正则:```listen 80;server_name www.xxx.net;if ($host != 'www.xxx.net'){ return 403;}2)添加一个新的server新加的server(注意是新增,并不是在原有的server基础上修改)server { listen 8原创 2021-08-31 21:03:32 · 1987 阅读 · 0 评论 -
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 评论 -
Spring boot 注解@Async不生效
失效原因1.@SpringBootApplication启动类当中没有添加@EnableAsync注解。2.异步方法使用注解@Async的返回值只能为void或者Future。3.没有走Spring的代理类。因为@Transactional和@Async注解的实现都是基于Spring的AOP,而AOP的实现是基于动态代理模式实现的。那么注解失效的原因就很明显了,有可能因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器管理。解决方法:这里具体说一下第三种情况的解决方法。1.注解的原创 2021-08-12 23:56:03 · 676 阅读 · 0 评论 -
Async整合线程池
为什么在使用Async 要使用多线程在spring boot 中使用 @Async 是为了使用多线程,但是在使用过程中你会发现在使用中每一个使用@Async 注解的时候都会产生一个独立线程,这样线程的创建、销毁 就非常销毁cpu。于是就考虑使用线程池方式实现。@Async 线程使用如下定义线程池在这里插入代码片```@Configuration@EnableAsyncpublic class AsyncPoolConfig { @Bean(name = "ThreadPool原创 2021-08-12 23:41:41 · 342 阅读 · 0 评论 -
Mybatis控制台打印SQL语句的两种方式
问题描述: 在使用mybatis进行开发的时候,由于可以动态拼接sql,这样大大方便了我们。但是也有一定的问题,当我们动态sql拼接的块很多的时候,我们要想从*mapper.xml中直接找出完整的sql就会非常的难,这个时候经常会需要把组合之后的完整sql调试出来比较好。下面来看两种调试出sql的两种方式解决方案:方案 一1. 首先将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句2:添加如下语句:###显示SQL语句部分l...原创 2021-06-11 14:23:06 · 9016 阅读 · 0 评论 -
常用的正则工具类
验证只包含中英文和数字的字符串/** * 验证只包含中英文和数字的字符串 * * @param keyword * @return */public static Boolean validKeyword(String keyword) { String regex = "^[a-zA-Z0-9\u4E00-\u9FA5]+$"; Pattern pattern = Pattern.compile(regex); Matcher match = pattern.ma原创 2021-05-07 09:57:54 · 461 阅读 · 0 评论 -
实现http访问自动跳转到https 的nginx 配置
在输入http://baidu.com 的时候,自动会跳转到https://baidu.com ,自己的域名其实有时也需要这样的配置。nginx 配置如下:server { listen 80; server_name www.baidu.com; rewrite ^(.*)$ https://${server_name}$1 permanent; }server { listen 443; server_name www.baidu.com;原创 2021-04-02 16:16:31 · 696 阅读 · 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 评论 -
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 评论