代码技巧
文章平均质量分 79
一些小技巧/写法让代码更加优雅
七海健人
打工战士,闲暇之余把自己的学习和总结记录下,也希望写的东西能帮助到你
展开
-
编码技巧——Springboot工程加密yml配置/Maven引入本地二方包
基于Springboot的工程项目,通常很多信息都是在application.yml中直接明文配置的,比如数据库链接信息,redis链接信息等;为了安全考虑,公司打算将yml配置文件中的数据库连接信息的账号,密码进行加密!公司有开发相关的安全规定,要求对源代码工程中所有的敏感信息进行加密,包括代码和配置文件,防止密码泄露;原创 2024-02-28 13:16:00 · 1557 阅读 · 0 评论 -
编码技巧——在项目中使用Alibaba Cloud Toolkit远程部署
在新公司项目开发,当前项目为自建项目,意思是从开发到运维都需要自己负责,远程的服务器也是自己搭建的win操作系统;之前在大厂工作时,一般提交代码之后,CICD流水线会自动的执行最新代码的拉取、构建打包、启动;搜了下发现阿里提供了IDEA下的插件,可用于轻量级的远程服务部署,准备自己搭建配置下试试;由于没有运维经验,也没搞过cmd脚本,过程比较曲折,最终也算是顺利完成配置和使用,这里记录下完整的过程;原创 2024-02-07 17:52:03 · 1349 阅读 · 0 评论 -
编码技巧——基于Socket通信的接口调用
在新公司项目开发,发现内部服务之间竟然有基于Socket通信的"上古"接口,它甚至都不是Http,难找到一些类似Apache的工具包提供好用的操作api,所以需要自己实现;以下是代码示例;原创 2024-02-07 16:41:25 · 633 阅读 · 0 评论 -
编码技巧——基于RedisTemplate的RedisClient实现、操作Lua脚本
在新公司的脚手架中开发,需要用到redis,发现没有封装好一套能集成各种常用命令、包括Lua脚本的方便使用的RedisTemplateClient,于是自己来实现下;springboot整合redis之后,提供了操作redis的简便方式,可以通过通用对象RedisTemplate方式操作String,Hash,List,Set SortSet五大数据类型;本次的实现就是基于Spring的RedisTemplate做的二次封装;原创 2024-02-07 16:18:46 · 1184 阅读 · 0 评论 -
编码技巧——批量删除数据
今天遇到个业务场景需要批量根据索引删除数据,ORM框架为mybatis,跟以往遇到的根据MySQL主键批量删除不同,本次使用的数据库时PgSQL,使用的联合主键索引;搜索相关资料网上大部分帖子都是使用类似whereidin (...)的写法,直到找到花了点时间才找到合适的写法,现在总结下;原创 2024-02-07 15:49:35 · 443 阅读 · 0 评论 -
编码技巧——Sentinel的blockHandler与fallback
本文介绍Sentinel的blockHandler与fallback的区别,背景是:发生限流时,配置的sentinel的blockhandler没有生效而fallback生效了;排查原因,从而给出Sentinel配置异常降级和限流降级的代码写法;原创 2023-08-08 14:55:43 · 1284 阅读 · 0 评论 -
编码技巧——Redis Pipeline
本文介绍Redis pipeline相关的知识点及代码示例,包括pipeline与client执行多命令的区别、Redis客户端-服务端的一次完整的网络请求、pipeline与redis"事务"、pipeline的使用代码示例;原创 2023-03-09 16:39:34 · 793 阅读 · 0 评论 -
编码技巧——JDK版本切换/JDK7和JDK6下的文件输入输入
最近有使用低版本JDK实现文件输入输出的需求,主要是妹子计算机专业考研复试上级算法题,输入输入依赖文件而非纯算法代码,并且IDE一般使用JDK8以下的SDK,导致一些JDK8的API不适用;较早版本的JDK API代码是操作一大堆的缓冲区Buffer和输入输出流InputStream/OutputStream,代码较为复杂,不利于上机演示,因此帮整理下JDK7/JDK6下较为简洁的文件输入输出代码;原创 2023-01-31 20:22:58 · 494 阅读 · 0 评论 -
编码技巧——使用Easypoi导出Excel、多sheet、模板导出
本文主要介绍easypoi导出Excel的代码示例;自己之前手动实现过导出工具类《编码技巧——导出工具类》,基于实体和注解,通过反射来映射实体字段和exce列的关系;在部分工程里面看到了easypoi的二方包,于是准备试用下,记录下如何引入并使用Easypoi的过程;原创 2022-11-29 20:29:05 · 12808 阅读 · 8 评论 -
编码技巧——Mybatis分页插件PageHelper使用、遍历表数据
本篇介绍Mybatis分页插件PageHelper的使用,本质上是Mybatis拦截器起作用,在执行目标SQL之前添加count语句及拼接limit到目标SQL后面,这里不再赘述,可参考,本篇仅简单介绍如何让一个使用Mybatis+springboot的项目快速接入PageHelper;原创 2022-11-28 16:47:16 · 1364 阅读 · 0 评论 -
代码技巧——Apache集合类&字符串工具包中实用的API
本篇结合代码示例介绍Apache集合类&字符串工具包中实用的API,很多sonar中的NPE问题都可以用Apache工具包来解决,代码的可读性也会得到提升;原创 2022-11-01 16:35:33 · 1160 阅读 · 0 评论 -
代码技巧——如何关闭订单?延迟任务的实现方案【建议收藏】
本篇介绍交易系统下,延迟关闭订单的几种实现方式,包括:定时任务、JDK实现、Redis过期时间/ZSet、Redisson RdelayQueue、RabbitMQ死信队列、时间轮算法,分别介绍其原理及代码示例,比较其优劣;原创 2022-10-05 20:53:50 · 2183 阅读 · 0 评论 -
代码技巧——dubbo泛化调用
「泛化调用」方式调用dubbo接口,即Dubbo的调用方,在不引入服务接口类的情况下,远程调用其他Dubbo服务;下面给出代码示例;原创 2022-08-28 15:30:11 · 1820 阅读 · 0 评论 -
代码技巧——dubbo编程式调用
现在有一种新的场景,A提供接口规范(方法及出入参),由B、C、D等多个业务方来实现这个接口,并将各自的服务以dubbo的形式注册到zk(以group区分);A在业务处理逻辑中,通过业务参数找到对应的group,然后在代码中调用对应group的dubbo接口;因为业务方的数量是不确定的,也就是说A不知道当前有哪些接入方,因此不能提前在代码中使用@DubboReference注解配置各个provider的bean,仅知道自己定义的接口定义和group;这时,就需要A在代码中能「编程式动态」调用dubbo;..原创 2022-08-25 17:42:47 · 1380 阅读 · 1 评论 -
编码踩坑——多线程可能带来意想不到的OOM
多线程技术数据Java基础中比较重要的知识点;实际使用时,我们往往会用线程池来管理我们的异步线程,本篇介绍一个由于使用ExecutorCompletionService多线程可能导致的OOM问题,开发时要千万小心,即使用一套JDK API时一定要熟悉其原理和可能踩的坑,不要只看到其好处拿来就用,搞不好就要出线上事故;.........原创 2022-08-14 17:28:06 · 1559 阅读 · 0 评论 -
编码技巧——@KafkaListener的使用
最近在接手某个项目代码时,发现关于Kafka的consumer相关的代码写的很乱,consumer中写了大量的配置的代码,并且手动的拉取消息,并开启线程消费,不够优雅;理想的做法是单独维护kafka的consumer配置,在定义consumer的bean时,指定topic和group,仅实现消费逻辑;从kafka-clients的2.2.4版本开始,可以直接使用@KafkaListener注解来标记消费者,注解的属性将覆盖在消费者者工厂中配置的具有相同名称的所有属性,下面介绍使用方法;.........原创 2022-08-08 17:49:50 · 13237 阅读 · 2 评论 -
学习笔记——异地多活
站在业务开发的角度,平时写代码时,代码的可靠性是需要我们考虑的东西,例如对于一个简单的业务场景,我们或许会使用幂等的Retry操作来尽量保证在一些些突发情况如MySQL抖动时能尽量处理成功当前业务;对于存储层来说,我们或许会使用本地缓存、Redis、MySQL三层存储结构保证系统读性能的可靠性,或是配置MySQL的读写分离来保证MySQL的读写性能;站在架构设计的角度,本篇从宏观的角度来介绍保证系统可用性的架构方案——异地多活,内容包括:异地多活到底是什么?它到底解决了什么问题?究竟是怎么解决的?原创 2022-08-24 17:56:58 · 1012 阅读 · 1 评论 -
编码技巧——MongoDB的过期时间
较适合一些记录【消息数据/事件数据】这种具备时效性数据的业务场景;原理上,MongoDB通过一个TTL索引来实现这种机制:MongoDB通过一个后台线程去不断的读取集合中某个日期类型的索引,并且移除掉满足过期条件的文档documents;下面介绍下如何使用;......原创 2022-07-04 15:23:41 · 6895 阅读 · 2 评论 -
编码技巧——Dubbo文件上传/传输服务
本篇介绍如何设计一个文件上传/传输功能的dubbo接口及遇到的问题;原创 2022-06-21 16:04:10 · 4498 阅读 · 0 评论 -
代码技巧——Controller参数注解@RequestParam
本篇介绍下Controller参数注解@RequestParam的使用方法,使用时的注意事项,以及与HttpServletRequest#getParameter方法的区别;原创 2022-05-27 17:32:40 · 5227 阅读 · 0 评论 -
Mybatis——类型处理器TypeHandler
在日常开发中使用mybatis时,实体的每个属性与数据库表的列一一对应,这些类型往往都是基本类型的包装类或时间类型Date;你可能会思考一个问题:当我们在自定义了某个枚举类型来对应数据库中的某个列(如int、tinyint类型)时,能否让mybatis知道如何做枚举与数据库类型的映射关系,从而不需要我们在代码中手动的做二者属性值的转换?MyBatis还是为我们提供了入口——TypeHandler类型处理器;原创 2022-05-17 13:46:47 · 3737 阅读 · 0 评论 -
编码技巧——权益发放(策略模式+抽象模板)
日常开发中,遇到这样一个场景:做一个用户会员权益发放模块,权益的类型可能有:平台积分、礼包、优惠券、支付卷、红包、兑换码、爱奇艺会员兑换码等;当然可以为每种不同的权益单独设计对应的模块提供服务,但是更合适的做法是:抽象出权益模型,使用权益类型区分,这样权益可以统一存储,打包权益的发放可以由DN事务天然的支持,并且可通过用户表示UID对用户权益分表;面给一个使用策略模式(抽象模板)代码示例。原创 2022-05-09 21:15:39 · 908 阅读 · 2 评论 -
Mybatis——拦截器Interceptor
本篇介绍Mybatis拦截器/插件相关知识,包括相关的类及作用、拦截器有哪几种、拦截器可以在Mybatis的执行过程中的哪些节点起作用、拦截器如何使用、相关的API,最后附上代码示例。原创 2022-05-08 18:34:03 · 36947 阅读 · 5 评论 -
编码技巧——数据加密(二)Mybatis拦截器
上一篇《数据加密(一)ShardingSphere》介绍了基于ShardingSphere的数据加密方案,本篇介绍基于Mybatis的加解密插件的原理及实现,以及遇到的困难;原创 2022-05-06 09:12:00 · 3895 阅读 · 0 评论 -
编码技巧——Mybatis输出SQL日志
在开发环境调试代码,往往需要打印执行的SQL语句来判断mybatis的SQL语句是否符合预期,尤其是我们的SQL语句使用了较多的标签时,只有真正的执行到了mybatis的标签解析器后,才能生成最终的SQL语句;当遇到SQL语句看似解析正常但是执行的时候却报错,在这个时候如果mybatis本身的SQL日志没有打印,将会是非常头疼的。本篇介绍几种获取最终执行的SQL语句的方法;原创 2022-04-25 16:06:30 · 11559 阅读 · 1 评论 -
编码技巧——灰度工具
日常开发中,对于一些重要的业务版本,如某用户产品的全新功能上线、功能全新升级,一般来说需要逐步发布,防止一些隐藏问题直接投向线上的全量用户,后果不堪设想,只能跑路;不仅限于业务版本,一些技术优化版本,如大表拆分数据迁移、数据脱敏加解密、DUBBO接口升级等,涉及重要的业务如订单、用户资产时,也不能一下梭哈上线,因为如果有前期未考虑到的漏洞时,发生异常带来的业务损失将是致命的;因此,灰度策略是必要的!原创 2022-04-24 21:22:41 · 1216 阅读 · 1 评论 -
编码技巧——Java Void 和 void 的区别
在开发过程中,使用JDK的一些自带API时,遇到一个问题:需要传入一个方法A和一个降级方法B,降级方法B的方法签名是有返回参数的,而且返回参数类型需要跟方法A保持一致,编译器会作检查;例如:使用CompletableFuture的exceptionally(),异步方法返参为void类型,这里的传参怎么传?当方法A被定义成void类型的无返回参数的方法,方法B应该如何定义呢?——编译器提示我们定义一个返回值为Void类型的方法;本篇介绍下Void和void的区别;原创 2022-04-25 09:15:36 · 1189 阅读 · 0 评论 -
编码技巧——事务提交后执行
日常开发中,一些诸如"先读后写"、"先写A再写B"、"先写A再执行B"的场景,一般都会用到事务;这里的事务指的是本地事务,如果涉及RPC,一般我们通过异步补偿来保证最终一致性;本篇例举2个使用事务"先写A再执行B"的场景;原创 2022-05-13 22:56:32 · 2010 阅读 · 3 评论 -
编码技巧——校验器(职责链+抽象模版)
日常开发中可能遇到这样的业务场景:请求从入口进来,需要经过层层的校验,通过校验后才会执行业务操作(写操作、RPC、异步消息...);这里前置的多层校验流程中,从类型上看,部分是基本参数校验,部分是包含业务逻辑的校验,并且部分校验是可以并行,部分是有依赖关系的;此外,从代码的通用性来说,对于流程相对固定的业务逻辑,完全可以提前定义好多个校验器,通过配置,可动态的拔插这些预制的校验器以及其顺序;本篇介绍用户下单前业务订单多层校验场景的代码示例;原创 2022-05-09 20:20:37 · 1007 阅读 · 2 评论 -
Spring——事务注解@Transactional【建议收藏】
在某些业务场景下,如果一个请求中,需要同时写入多张表的数据或者执行多条sql,为了保证操作的原子性(要么同时成功,要么同时失败),避免数据不一致的情况,我们一般都会用到事务;Spring框架下,我们经常会使用@Transactional注解来管理事务;本篇介绍Spring的事务注解@Transactional相关的知识,包括事务简介、事务隔离级别、Spring声明式事务实现原理、事务的传播行为、@Transactional的用法及注意事项等,属于Spring的常用注解之一,需要掌握相关知识点;...原创 2022-07-18 16:05:40 · 34623 阅读 · 3 评论 -
代码技巧——数据迁移方案【建议收藏】
开发工作中,可能会遇到如"大表拆分"、"跨库数据迁移"等场景,本文介绍互联网常见架构下的数据迁移方案及实现,包括:有损迁移、平滑迁移、增量迁移;原创 2022-08-11 16:05:21 · 6551 阅读 · 1 评论 -
编码技巧——数据加密(一)ShardingSphere
接到公司合规部门的指示,应工信部整改文件,限制各大互联网公司对用户隐私数据的收集;对服务端的影响就是,以前存储的用户隐私信息如用户安卓设备ID、用户姓名、手机号、联系方式、邮箱等信息,需要加密存储和传输;因此——我们需要对线上和历史的DB中的涉及用户敏感信息的数据进行存储加密,读取时进行解密;个人是执行此次任务的服务端Leader,本篇介绍几种方案选型及各自优劣;原创 2022-04-26 09:34:25 · 5539 阅读 · 4 评论 -
编码技巧——本地消息表保证可靠性
这里的消息事务理解为广义的消息事务,而非仅限于消息中间件RocketMQ、Kafka之类的消息事务机制,而是一种设计思路;本篇基于上述的2个示例,给出相关的表设计、关键代码;原创 2022-04-21 20:15:28 · 3462 阅读 · 0 评论 -
编码技巧——重试模板RetryTemplate
本篇介绍Spring RetryTemplate的原理及使用的代码示例;日常开发中,经常会遇到这样的场景:执行一次接口调用,如RPC调用,偶现失败,原因可能是dubbo超时、连接数耗尽、http网络抖动等,出现异常时我们并不能立即知道原因并作出反应,可能只是一个普通的RpcException或RuntimeException,对于这种小概率的异常,往往需要尝试再次调用(前提是接口是幂等的),因为由于网络问题、下游服务暂时的不稳定导致的异常,段时间后理论上是可以自恢复的;原创 2022-04-20 16:05:44 · 4762 阅读 · 0 评论 -
编码技巧——导出工具类
在开发过程中,对于一些B端的业务,使用者是内部的运营管理同事或CP,基本的功能就是一些表单的查询、查看、结果导出、配置、审核等;对于查询和导出功能,经常需要对一些数据导出到Excel文件,或将一个Excel文件的数据读取到数据库;在java操作Excel可以使用POI组件;本篇给出相关的代码示例,支持多类型的结果集导、输入流转Excel并读取Excel文件;原创 2022-04-17 15:03:07 · 377 阅读 · 0 评论 -
编码技巧——HTTP接口安全之CORS
日常开发中,对于一些新项目的api工程,会有专门的安全工程师对齐进行安全漏洞扫描,扫描出来的漏洞会被要求限期修复;本篇讲解CORS漏洞的基本概念、原理、示例,以及修复漏洞的代码示例;......原创 2022-04-17 18:53:26 · 3064 阅读 · 0 评论 -
编码技巧——HTTP接口安全防范CSRF攻击
上一篇《编码技巧——HTTP接口安全防范CORS攻击》介绍了同源策略、跨域、CORS,本篇介绍下CRSF漏洞及常用服务端解决方案;思考一个问题:如果你说 同源策略SOP 就是“禁止跨域请求”,这也不完全准确,因为本质上 SOP 并不是禁止跨域请求,而是在请求后拦截了请求的回应。因此——这就会引起CSRF漏洞,即被恶意网站模拟的、带上了cookies(虽然由于SOP策略读不到cookies信息)的、非用户预期的请求,已经打到了服务端的接口上!原创 2022-04-19 09:00:51 · 3497 阅读 · 1 评论 -
编码技巧——客户端HTTP请求封装&登录态校验
对于做C端的服务单开发来说,除了要定义好和前端/客户端的HTTP接口出入参,接口协议还包含header/cookies的参数,如请求类型、支持的类型、cookies中的K/V、origin等;而其中cookies中的参数往往会放一些token、签名等;本篇介绍下开发中使用到的封装前端/客户端HTTPRequest的工具类,以及其中的1种简单应用——用户登录态校验;原创 2022-04-16 17:49:03 · 864 阅读 · 0 评论 -
编码技巧——全局日志开关
开发过程中,业务日志是非常重要且有必要的,往往能帮我们排查问题,如异常原因、入参出参、是否有脏数据、执行到了哪一步等;但是日志也不是越多越好,对于大流量接口,打日志需要慎重,大量的日志会导致频繁的IO、影响机器负载;" 根据经验,4核8G的机器,1个小时日志量不要超过20W "——经历过暴涨日志导致机器负载达到80的某模块SE给出的经验此外,在中间件出异常时,如ZK连接不上、MQ链接异常等情况发生时,重启机器时也会产生疯长的日志量,可能导致服务依旧无法重启成功;这时候,如果有个全局的日志开关,能..原创 2022-04-16 12:38:24 · 771 阅读 · 0 评论 -
编码技巧——HTTPClient工具类
开发中,系统之间调用方式,存在部分老接口(RPC框架如DUBBO出现之前),如HTTP接口;因此我们需要自己写HTTP客户端来调用接口,传入url、请求方式、参数,获取HTTPResponse;下面给2个HTTPclient的示例,分别是以前在不同项目写过的,便于开发时便捷实用;原创 2022-04-15 11:46:21 · 656 阅读 · 0 评论