JAVA
文章平均质量分 51
”PANDA
努力是最不值得被炫耀的东西
展开
-
自定义Mybatis-Plus分布式ID生成器(解决ID长度超过JavaScript整数安全范围问题)
MyBatis-Plus 默认生成的是 64bit 长整型,而 JS 的 Number 类型精度最高只有 53bit,如果以 Long 类型 ID 和前端 JS 进行交互,会出现精度丢失(最后两位数字变成 00) 而导致最终系统报错。一种方案是在响应前端时,将 ID 转换成 String 类型返回,但这个方法治标不治本,因此最终通过采用截短 ID 长度,以避免 ID 超过 JS 整数安全范围。SpringBoot 项目中如何引用?原创 2024-08-05 19:46:05 · 577 阅读 · 0 评论 -
Neo4j实现表字段级血缘关系
/ 唯一键// 添加图节点以及与上游节点之间的关系// 寻找上游节点// 寻找下游节点。原创 2023-08-22 14:18:14 · 1185 阅读 · 0 评论 -
SpringBoot添加启动事件监听
【代码】SpringBoot添加启动事件监听。原创 2023-08-22 14:12:15 · 441 阅读 · 0 评论 -
SQLite实现分页排序
1")原创 2023-08-22 14:08:36 · 442 阅读 · 0 评论 -
MDC 实现全局 traceId(完整版)
MDC 是 Java 中的一种日志记录工具,底层实现是对 ThreadLocal 的封装,以实现线程级别的调用链路追踪,kv 形式存储。生成规则:服务器 IP + ID 产生的时间 + 自增序列 + 当前进程号。原创 2023-04-23 16:42:32 · 1461 阅读 · 1 评论 -
解决gradle下载jar包超时问题
另外 gradle-wrapper.properties 配置要使用国内地址代替官方地址去下载 gradle,否则也会超时。原创 2023-04-23 15:53:34 · 1812 阅读 · 0 评论 -
你被裁了需要知道的一些细节
就在上周,得知自己要被裁了,理由是公司在疫情下的经济性裁员,在这里总结一下关于裁员过程中需要注意的一些细节。原创 2022-11-17 20:15:01 · 1743 阅读 · 1 评论 -
java实现word模板文件填充
使用该包实现 word 文件填充,同时支持 pdf、excel 格式。word模板文件存放在项目 resource 文件夹下。原创 2022-11-11 15:49:01 · 2925 阅读 · 4 评论 -
“10X 程序员是如何思考的” 阅读总结
对我来说看完最大的收获,就是不要把自己设限于是一个开发人员,格局要打开!原创 2022-08-08 22:19:41 · 1413 阅读 · 1 评论 -
Mybatis-Plus json 格式数据查询
因为 List 格式转换成 json 存储到数据库的格式与 List 是不一样的,数据多了一对引号,所以在查询时,我们需要将引号拼上去原创 2022-06-18 18:09:41 · 3578 阅读 · 0 评论 -
Mac IDEA 最常用快捷键(详解版)
公司同事让我提供一个简单的 rpc 接口,然后他坐在我旁边看着我写,写的过程中他不断打断我,比如我在代码换行时,如果光标不在下一行行首或者这行的行尾,我就会先移动光标到行尾,再点击回车进行换行,他这时候就会说,为什么你不用快捷键直接换行,最后变成了他手把手教我如何更高效的用快捷键编程,之前虽然自己知道快捷键的重要性,平时也有用到部分的快捷键,但这次打脸真的让我深刻体会到效率上的差异,日积月累,十年八年,这个效率差异无疑将是巨大的,所以这次下定决心好好学习使用快捷键!我列出的都是一些绝对会经常用到的快捷键,原创 2022-06-18 17:12:57 · 6776 阅读 · 0 评论 -
解决:对象映射时 Integer 类型字段转换枚举处理麻烦
使用场景当我们返回给前端所需的对象数据时,大多数情况可以直接使用 StructMap 映射实现自动转换,但碰到对象中的某些字段需要从 Integer 类型转换成对应枚举的时候,在 StructMap 中就需要单独对这些字段添加转换注解,实现较为麻烦,故整合出了一个通用转换工具类。ConverUtils 工具类实现public class ConvertUtils { // 普通对象转换 public static <T> T toObject(Object o, Clas原创 2022-04-20 19:50:36 · 907 阅读 · 0 评论 -
BigDecimal 设置小数位数、小数比例转换整数
设置保留两位小数 result = 0.20DecimalFormat decimalFormat = new DecimalFormat("0.00");BigDecimal result = decimalFormat.format(new BigDecimal(0.200000));小数点右移两位 20.0000new BigDecimal(0.200000).movePointRight(2);原创 2022-04-19 19:26:19 · 2221 阅读 · 0 评论 -
Mybatis-Plus 实现乐观锁
定义是指在读取一行数据时,记下它的版本号、最近修改的时间戳或校验和。然后,你可以在修改记录之前检查版本有没有发生变化。适用场景适用于读多写少的场景,乐观锁相信事务之间的数据竞争概率较小,因此尽可能地直接做下去,直到提交的时候才去锁定。实现方式取出记录时,获取当前 version执行更新时,带上这个 version,如 update table_name set version = 2 where id = 1 and version = 1;如果 version 不对,则更新失败Myba原创 2022-04-18 20:22:49 · 2890 阅读 · 0 评论 -
COLA 架构使用规范化
基础架构图Adapter 适配层:对前端展示的路由和适配。VO:返回给前端的对象assembler:将 responseDTO 转换为 VOweb:处理页面请求的 Controllerwap:处理手机端请求的 ControllerApplication 应用层:负责获取输入,组装上下文,调用领域层做业务流程编排,如果需要的话,发送消息通知等。若只是简单操作,应用层还可直接绕过领域层,访问基础层。避免在 Application 层做入参校验,可以通过 JSR303/380 和 Spring V原创 2022-04-02 17:50:03 · 2854 阅读 · 2 评论 -
Redis 串行生成顺序编码(应对分布式高并发场景)
应用场景:针对于分布式高并发环境,易出现编码生成重复问题方案特点:多线程串行操作可避免阻塞加锁,处理效率更高具体解决方案:private final static String ENTERPRISE_CODE = "enterpriseCode";@Resourceprivate RedisTemplate redisTemplate;private String generateCode() { String code; if (!redisTemplate.hasKey原创 2022-04-02 17:21:05 · 1731 阅读 · 2 评论 -
Java 架构师电商项目(220h): 1-1 整体架构概述
2022 Flag:学完这门 220h Java架构师电商项目视频课,学习笔记将持续更新……原创 2021-12-30 10:17:11 · 558 阅读 · 0 评论 -
MyBatis-Plus 实现数据库字段更新为 NULL
feeMapper.update(Wrappers.<FeePO>lambdaUpdate() .eq(FeePO::getId, feeDO.getId()) .set(ObjectUtils.isNotEmpty(feeDO.getMoney()), FeePO::getMoney, feeDO.getMoney()) .set(ObjectUtils.isEmpty(feeDO.getMoney()), FeePO::getMoney, null));原创 2021-12-20 15:37:28 · 446 阅读 · 1 评论 -
中文技术文档写作规范(汇总整理版)
前言:规范文档的好处,其一增加文档易读性,其二体现个人专业性只使用一二三级标题,三级标题下面的并列性内容使用列表展示二级标题前使用行分隔符表示分隔段落之间使用一个空行隔开一句话或者以逗号分隔的句子,长度尽量保持在 20 个字以内,20~29 个字的句子,可以接受禁止文字口语化尽量使用肯定句表达,不使用否定句表达(例如:没有、不能、不可以)不使用“被”技术名词拼写正确,比如正确的拼写:Java、JavaScript、MySQL第一次出现英文词汇时,在括号中给出中文标注【例如:IOC(Int原创 2021-12-17 16:50:36 · 3618 阅读 · 0 评论 -
Macbook pro2020配置maven、IDEA配置maven
安装maven的前提是已经安装好了jdk,同时注意maven对应jdk版本要求!1.下载maven官网地址(自行选择,所有迭代版本都有,选择bin.tar.gz)https://archive.apache.org/dist/maven/maven-3/2.解压文件包,配置环境变量下载之后,将文件包解压出来,本文放置的文件目录为 /Library/Maven接着打开终端,配置环境变量:# 打开环境变量vi ~/.bash_profile# 然后输入字母i就可以进入编辑模原创 2021-07-04 23:22:31 · 1098 阅读 · 0 评论 -
手把手实现RPC框架--简易版Dubbo构造(十四)服务端自动注册服务
本节commit地址: ec8defe到目前为止,客户端已经差不多了,但是在服务端,我们却还需要手动创建服务对象,并且手动进行注册,如果服务端提供了很多服务,这个操作就会变得很繁琐。本节就会介绍如何基于注解进行服务的自动注册。定义注解首先定义Service注解,用来标识一个服务提供类,注解放在Impl类上://表示注解的作用目标为接口、类、枚举类型@Target(ElementType.TYPE)//表示在运行时可以动态获取注解信息@Retention(RetentionPolicy原创 2021-03-16 15:54:07 · 2273 阅读 · 1 评论 -
手把手实现RPC框架--简易版Dubbo构造(十三)Netty心跳机制、实现服务负载均衡
本节依然分成三次提交。Netty心跳机制什么是心跳机制:https://blog.csdn.net/u013967175/article/details/78591810Netty对心跳机制有两个层面实现,第一个是TCP层面,之前给通道初始化设置的值.option(ChannelOption.SO_KEEPALIVE, true) 就是TCP的心跳机制,第二个层面是通过通道中的处理IdleStateHandler来实现,可以自定义心跳检测间隔时长,以及具体检测的逻辑实现。首先是客户端的心跳.原创 2021-03-15 19:35:58 · 2456 阅读 · 13 评论 -
手把手实现RPC框架--简易版Dubbo构造(十二)实现注销服务的钩子、优化线程池
本节分成三次提交。将服务注册与服务实现分开commit地址:5128986在上一节中我们实现了Nacos服务注册中心,为了让逻辑更清晰,现在将Nacos相关操作都放在NacosUtil工具类: public class NacosUtil { 21 22 private static final Logger logger = LoggerFactory.getLogger(NacosUtil.class); 23 24 private static fin原创 2021-03-14 21:44:46 · 1656 阅读 · 0 评论 -
手把手实现RPC框架--简易版Dubbo构造(十一)服务注册中心Nacos
本节commit地址: 8136649(由于引入Nacos,项目结构和代码调整较大,头莫被搞昏了,但理解起来简单)为什么需要Nacos?我们现在的RPC框架其实只有一个服务提供者,客户端也是通过固定的一个服务端地址进行访问的,这会存在极大的隐患,如果这个服务提供者挂了或者换了地址,那客户端就没法访问了。在分布式架构中,有一个重要的组件,就是服务注册中心,它用于保存多个服务提供者的信息,每个服务提供者在启动时都需要向注册中心注册自己所拥有的服务。这样客户端在发起远程调用的时候,就可以直接向注册中心请原创 2021-03-13 21:38:47 · 2316 阅读 · 4 评论 -
手把手实现RPC框架--简易版Dubbo构造(十)Netty连接失败重试机制、Protostuff序列化器
为了让结构更清晰一点,本节将分成几次内容提交。统一Socket与Netty传输协议,同时让Socket使用序列化器commit地址:bdb7dc4还记得在之前的Socket传输中,我们并未引入传输协议,只是单纯传输了一个RpcRequest对象给服务端,直接使用Java原生的readObject、writeObject就可以完成传输,不需要单独的序列化器,现在我们希望让Socket与Netty使用的传输协议保持一致,这意味着Socket也要用到序列化器,通过对代码的重构,实现了在TestServe原创 2021-03-12 19:57:50 · 2029 阅读 · 0 评论 -
给Protostuff序列化的每行代码打上注释你就懂了
/** * @author [PANDA] 1843047930@qq.com * @date [2021-03-11 18:42] * @description Protostuff序列化器 */public class ProtostuffSerializer{ /** * 避免每次序列化都重新申请Buffer空间,用来暂时存放对象序列化之后的数据 * 如果你设置的空间不足,会自动扩展的,但这个大小还是要设置一个合适的值,设置大了浪费空间,设置小了会自动扩展浪费.原创 2021-03-12 14:08:04 · 1295 阅读 · 0 评论 -
手把手实现RPC框架--简易版Dubbo构造(九)Hessian序列化、线程池工具
本节commit地址:1ed2159上一节我们实现了Kryo序列化,抱着学习的心态,本节基于Hessian协议来实现序列化,实现步骤和之前的Kryo类似,关于Hessian和Kryo的区别可以参考另一篇:https://blog.csdn.net/qq_38685503/article/details/114633168?spm=1001.2014.3001.5501本节还会把线程池封装成一个通用Util,要用到guava中的ThreadFactoryBuilder(),自定义线程名,方便出错定位问题原创 2021-03-10 19:13:23 · 1425 阅读 · 0 评论 -
Hessian、Kryo、Protostuff序列化使用区别
Kryo序列化后的数据相比Hessian小很多。 Hessian使用固定长度存储int和long,而kryo使用变长的int和long保证这种基本数据类型序列化后尽量小,实际应用中,很大的数据不会经常出现。 Kryo进行序列化的时候,需要传入完整类名或者利用 register() 提前将类注册到Kryo上,其类与一个int型的ID相关联,序列中只存放这个ID,因此序列体积就更小,而Hessian则是将所有类字段信息都放入序列化字节数组中,直接利用字节数组进行反序列化,不需要其他参与,因为存的东西多处理速原创 2021-03-10 16:30:54 · 2425 阅读 · 0 评论 -
手把手实现RPC框架--简易版Dubbo构造(八)Kryo序列化
本节commit地址:f16b1f2 上一节中,主要实现了Netty传输,以及基于Jackson的序列化器,但通过使用也发现存在一个问题,Json进行反序列化时,如果某个类的属性声明是Object类型,就会造成反序列化出错,通常会把Object属性直接反序列化成String类型,此时就需要其他参数辅助反序列化。同时,JSON序列化器是基于字符串(JSON串)的,占用空间较大且速度较慢。 因此本节利用Kryo来实现序列化,Kryo是一个快速高效的Java对象序列化框架,主要特点是...原创 2021-03-09 22:31:21 · 1422 阅读 · 1 评论 -
ThreadLocal基本理解
ThreadLocal定义:就是以空间换时间的方式解决多线程并发问题。当使用ThreadLocal维护变量的时候,会为每一个使用该变量的线程创建一个独立的变量副本,这样就能让各线程相互隔离,保证线程安全。四个主要方法:get()、set()、remove()、initialValue();在进行get之前,必须先set,否则会报空指针异常,如果想在get之前不需要调用set就能正常访问的话,必须重写initialValue()方法。底层原理:每个线程中会利用ThreadLocalMap类创建一个th原创 2021-03-09 21:39:25 · 464 阅读 · 0 评论 -
手把手实现RPC框架--简易版Dubbo构造(七)netty传输与通用序列化接口实现
本节commit源码地址:0e68adb本篇内容较多,本人花了较多时间在Netty学习上面,所以更新时间间隔拉的长了点,对Netty运行的全过程进行了总结,同时对Netty部分的代码逐行进行了注释,学习本节前建议可以先看下:netty全过程图解接下来进入正题Netty服务端public class NettyServer implements RpcServer { private static final Logger logger = LoggerFactory.getLogg.原创 2021-03-02 19:42:23 · 2753 阅读 · 9 评论 -
netty全过程图解(最详细清晰版)
前言:为了让大家对Netty有个整体认知,本文首先会对Netty的整个运作过程捋一遍,先不管什么异步、Reactor模式、NIO、零拷贝这些,细节的东西后面再说,直接淦图:结合图示进行全过程讲解:ServerBootStrap作为Netty的服务端入口,会对BossGroup和WorkGroup进行相关初始化操作,在BossGroup中,主要是对客户端的新连接请求进行处理(即OP_ACCEPT事件,但其实OP_ACCEPT事件的具体处理也会涉及到读写事件,因为数据不是读就是写),在WorkGro原创 2021-03-01 22:18:59 · 11956 阅读 · 4 评论 -
手把手实现RPC框架--简易版Dubbo构造(六)项目结构调整 为引入Netty做准备
本节commit地址:b3d9814我们之前一直使用的BIO方式传输,接下来将会转为效率更高的NIO方式,但不会使用 Java 原生的 NIO,而是采用更为简单的 Netty。因此在引入Netty前需要对项目结构和源码进行重新调整,以区分开之前的Socket,实现多种方式传输。为了保证通用性,我们可以把 Server 和 Client 抽象成两个接口,分别是 RpcServer 和 RpcClient:public interface RpcServer { void start(in原创 2021-02-18 21:53:23 · 1590 阅读 · 0 评论 -
手把手实现RPC框架--简易版Dubbo构造(五)让服务器提供多个服务
首先对上一阶段的源码进行了重构优化,增加了自定义异常处理,commit地址:f8a3acc在前面的小节中我们设计的是服务器默认只提供一个服务,本节就来探讨如何让服务器提供多个服务本节commit地址:8b71c6d服务注册表我们需要一个容器,用来保存服务端提供的所有服务,方便查询使用,即通过服务名字就能返回这个服务的具体信息(利用接口名字获取到具体接口实现类对象)。创建一个 ServiceRegistry 接口:public interface ServiceRegistry {原创 2021-02-18 16:41:03 · 1714 阅读 · 2 评论 -
java向上转型后方法变量详细使用规则(父类引用创建子类对象实例)
向上转型:就是把子类对象赋值给父类类型的变量。接下来用一个简单的例子来进行使用介绍:创建父类public class Person { public String name = "this is a people"; public String sing(Person person){ return "people"; } public String rap(){ return "rap"; }}创建子类pu原创 2021-02-07 14:47:24 · 1385 阅读 · 0 评论 -
Java重写和重载(覆盖)的区别(超详细面试版)
重 写 重 载 子类方法对父类方法的覆盖 同一个类中同名方法的重载(同一类包括从父类继承的方法) 方法名相同且参数个数类型顺序相同 参数个数或类型顺序至少满足一点不同 只允许访问权限更宽松 访问权限任意 返回值类型若是基本类型则不允许不同;若是复合类型则在子类与父类间必须至少存在继承关系 返回值类型任意 ...原创 2021-02-07 13:16:40 · 446 阅读 · 3 评论 -
手把手实现RPC框架--简易版Dubbo构造(四)服务端线程池处理请求 反射调用
本节commit源码地址:11e4aca服务端实现--反射调用从服务端接如果收到请求就创建一个线程来处理调用,利用线程池创建线程,对多线程情况进行处理(Java线程池学习请戳:https://blog.csdn.net/suifeng3051/article/details/49443835)public class RpcServer { private final ExecutorService threadPool; private static final Logge原创 2021-02-06 18:18:34 · 2128 阅读 · 10 评论 -
手把手实现RPC框架--简易版Dubbo构造(三)客户端动态代理
本节commit源码地址:416bb92客户端实现(动态代理)由于在客户端这边我们并没有接口的具体实现类,就没有办法直接生成实例对象。这时,我们可以通过JDK动态代理的方式生成实例。(关于动态代理不太熟的小伙伴可以戳:动态代理详解)public class RpcClientProxy implements InvocationHandler { private String host; private int port; //传递host和port来指明服原创 2021-02-04 23:12:56 · 2403 阅读 · 9 评论 -
一篇文章就彻底弄懂建造者模式(Builder Pattern)
写的很清楚,能理解https://www.jianshu.com/p/3d1c9ffb0a28转载 2021-02-03 21:31:20 · 511 阅读 · 0 评论 -
手把手实现RPC框架--简易版Dubbo构造(二)从一个简单实现开始
本节commit源码地址:ca82236盗一张Guide哥的图哈我们首先要思考,RPC框架的原理:原理其实很简单,客户端和服务端都可以访问到通用的接口,但是只有服务端有这个接口的实现类,客户端调用这个接口的方式,是通过网络传输,告诉服务端我要调用这个接口,服务端收到之后找到这个接口的实现类,并且执行,将执行的结果返回给客户端,客户端拿到返回的结果,结束。我们先进行最基本的实现,然后一步一步完善,假设我们现在知道服务端的地址,尝试来实现一下这个过程。API通用接口定义接口public i原创 2021-02-03 21:27:28 · 2642 阅读 · 0 评论