- 博客(113)
- 资源 (3)
- 收藏
- 关注
原创 在Java中,为什么在lambda表达式中访问局部变量时,必须将其声明为final或等效的原因是?
如果在lambda表达式中访问非final的局部变量,并且该变量在执行过程中发生了改变,那么lambda表达式可能会使用已经失效的值。Lambda表达式的生命周期:Lambda表达式的生命周期可以超过包含它的方法的生命周期。如果在lambda表达式之外修改了一个非final的局部变量,那么在lambda表达式内部就无法获取到正确的值。需要注意的是,在Java 8之后,对于非final的局部变量,编译器会隐式地将其视为final(即具有隐式的final语义),以便在lambda表达式中使用。
2023-12-13 15:24:36 823
原创 记录一次nacos无法注册服务报错的问题
nacos注册报错显示java.lang.IllegalArgumentException: protocol = http host = null。否则就会报java.lang.IllegalArgumentException: protocol = http host = null。
2023-11-30 10:19:38 780
原创 【前端】使用json-server报错
当我们使用json-server模仿后端接口时需要运行json-server --watch index.json这个命令生成增删改查接口但是可能会报这个错误,如图。这时我们运行 npm i json-server -g命令即可,然后再重新运行json-server --watch index.json就行了。
2023-11-15 21:08:35 1214 1
原创 解决跨域的三种方案
因为跨域问题指的是浏览器和服务端的问题,服务端和服务端之间不存在跨域问题,可以让前端访问同源的nginx,然后nginx访问服务端,nginx再将结果返回给浏览器,这样也不会发生跨域问题了。服务端在响应头添加 Access-Control-Allow-Origin:*,表示服务端允许所有程序跨域访问服务,也可以把 * 改成允许的地址。前端直接使用script标签的src属性访问后端接口就不会产生跨域问题。由于服务端之间没有跨域,浏览器通过nginx去访问跨域地址。
2023-11-15 16:57:52 267
原创 private static final long serialVersionUID = 1L的作用是什么?
当一个类被序列化后,存储在文件或通过网络传输时,这些序列化数据会包含该类的结构信息。当反序列化操作发生时,Java虚拟机会根据序列化数据中的结构信息来还原对象。但是,如果在序列化之后,对类的结构进行了修改,例如添加或删除了字段、修改了继承关系等,那么旧版本的序列化数据可能无法正确地还原为新版本的类对象。这样就会导致反序列化失败,抛出异常。为了解决这个问题,Java提供了serialVersionUID这个变量。它是一个唯一标识符,用于标识一个类的版本。
2023-10-01 22:33:22 586
原创 分布式事务-TCC异常-空回滚
A服务调用服务C的try时服务出现异常服务B因为网络或其他原因还没执行try方法,TCC因为C的try出现异常让所有的服务执行cancel方法,比如B的try是扣减积分 cancel是增加积分,还没扣减就增加显然是有问题的。
2023-09-30 14:04:59 124
原创 分布式事务-TCC案例分析流程图
防止cancel方法在最后执行出现问题,用户收到提示已经退款成功但是由于cancel过慢或者出现问题(虽然最后会重试成功但是用户体验很差),可以做以下的业务sql模型优化(增加一个冻结金额)。
2023-09-29 22:16:19 1511
原创 记录一次关于嵌套事务传播机制的bug
这段代码是A嵌套B,B嵌套C,遇到的bug是C代码发生异常进行事务标记(因为使用的传播行为是默认的REQUIRED所以要等A事务进行rollback,C加入了A事务只能暂时进行标记),但是由于B代码进行了异常捕获返回给了A信息并没有抛出异常,导致A代码并没有进行rollback。
2023-09-24 17:01:36 61
原创 logback日志是怎么保证多线程输出日志线程安全的
logback日志框架使用了单例设计模式来进行日志输出。在logback中,Logger类是一个关键的组件,它负责记录和输出日志消息。Logger类使用了单例设计模式,确保在一个应用程序中只存在一个Logger实例。这样做的好处是可以确保所有的日志消息都被集中到同一个日志输出器中,避免了多个日志实例之间的冲突和混乱。通过单例模式,可以方便地访问Logger实例,并使用其方法来记录日志消息。例如,可以使用logger.info(“Log message”)来记录一条信息级别的日志消息。
2023-09-21 11:08:44 852 2
原创 打印日志遇到的问题,logback与zookeeper冲突
在做项目时需要打印日志引入了logback打印日志,但是一直无法打印,于是一路查找原因。发现zookeeper中默认带的有个logback和我自己引入的logback版本冲突了,这样直接使用exclusions标签将zookeeper中自带的日志框架全部排除即可。按理说到这一步应该就没问题了,这次代码直接报错了,原来是最新版本的lockback与jdk8版本不匹配,于是我将logback版本进行降低就可以正常运行啦。
2023-09-13 22:36:52 413
原创 记录一次远程仓库删除.idea文件,Git提交冲突问题
刚开始传代码忘了写.gitignore文件了,然后给.idea文件也传到远程仓库里了,后来我给远程仓库的.idea文件手动删除,然后本地代码再提交就一直冲突。我寻思我给本地加的加上.gitignore文件,然后强制覆盖远程仓库,但是强制提交之后.idea还是被提交上了,.gitignore没生效。
2023-09-12 15:51:24 665
原创 springAop使用的动态代理是jdk还是cglib
需要注意的是,对于final类和方法,无法使用CGLIB动态代理,只能使用JDK动态代理。因此,当目标对象是final的或者目标方法是final的、static的、private的时候,Spring AOP会强制使用JDK动态代理。如果需要明确指定使用哪种代理方式,可以通过配置进行设置。CGLIB动态代理通过继承目标对象创建代理类,并重写目标对象的方法来实现代理功能。Spring AOP使用的动态代理可以是JDK动态代理或CGLIB动态代理,具体选择哪种代理方式取决于被代理的目标对象的类型和配置。
2023-09-10 09:02:36 727
原创 Zookeeper集群写操作的具体流程和数据同步
1.写操作和数据同步的流程写操作:zk中向leader进行一个节点的写操作时,leader会向所有的Follower发送这个写操作,当Follower的写操作超过半数成功时会将成功的结果返回给leader。数据同步:当写操作完成之后,zk集群会进行数据同步,leader将写操作完成的结果通知给所有的Follower节点,所有的Follwer节点会将leader节点的数据进行复制,确保自己的数据和leader上的数据保持一致。2.为什么Follower节点进行了写操作还要进行数据同步?因为并不是
2023-09-07 17:27:34 590
原创 什么是DMA操作?
在DMA操作中,有一个专门的DMA控制器,它负责管理数据传输的整个过程。DMA操作是一种计算机系统中的技术,用于实现设备之间的数据传输,而无需CPU的介入。通常情况下,数据传输需要通过CPU来进行中转,但是使用DMA可以绕过CPU,直接在设备和内存之间进行数据传输。需要注意的是,DMA操作需要特定的硬件支持,包括DMA控制器和相应的设备接口。此外,为了确保数据的安全性,DMA操作通常会设置权限和访问控制,以防止未经授权的设备访问内存。通过使用DMA操作,可以提高数据传输的效率,减少CPU的负载。
2023-09-02 23:35:58 366
原创 natApp内网穿透工作原理
如图所示,用户启动内网穿透工具会将token传入natapp服务器与我们自己的主机建立一个类似于websocket的长链接,当从外网访问我们主机的接口时,会进行一个本地接口地址的截取,然后进行拼接成我们主机应用的真实地址。然后将数据返回到natapp服务器,natapp服务器返回到浏览器。
2023-08-30 20:19:58 392
原创 支付宝支付流程分析--非对称加密
支付宝采用的是私钥加密,公钥解密。因为公钥是公众可知的如果使用公钥加密,那么黑客获取到公钥依然可以进行篡改信息。一般非对称加密两种方式 “公钥加密 私钥解密”,“私钥加密,公钥解密”图片有点小可以在新标签页打开查看或者保存到本地。支付宝支付为了防止信息被篡改采用的是非对称加密。
2023-08-29 22:51:33 171 3
原创 java中为什么自动装箱会有风险
为了避免自动装箱带来的风险,建议在需要频繁进行数值操作的情况下,尽量使用基本数据类型而不是包装类对象。另外,在进行自动装箱后,应该进行空值检查,并使用equals()方法来进行数值比较。每当进行自动装箱时,都会创建一个新的包装类对象,这会增加内存的使用量。如果多次进行频繁的自动装箱操作,可能会导致内存占用过高,从而影响程序的性能和运行效率。由于自动装箱对象是通过值传递的方式进行的,相同数值的包装类对象可能不是同一个实例。自动装箱将基本数据类型转换为对应的包装类对象,而包装类对象可以为null。
2023-08-23 13:18:33 104
原创 sql中判断日期是否是同一天
to_days(now())这样的方式进行比较,原因是由于日期数据类型在数据库中可能包含时间信息。如果直接比较两个日期,而不考虑时间部分,可能导致不准确的结果。使用to_days(start_date) = to_days(now())的方式是一种常见的方法,特别是在需要以天为单位进行日期比较时。
2023-08-09 22:10:31 2481
原创 RocketMQ集成Springboot --Chapter5
生产者,由于springboot没有专门对mq进行tag标记的方法,只是在topic:后面加上,所以只需 rocketMQTemplate.sendOneWay(“tagFilterBoot:TagA”,msg1);标记即可生产者代码如下消费者在注解处添加selectorExpression = "TagA || TagC"表达式选项即可。消费者代码如下。
2023-07-21 22:52:53 431
原创 RocketMQ集成Springboot --Chapter3
实际开发中如果没有顺序消费的必要需求,不建议使用顺序消费,顺序消费是单线程的效率比较低。
2023-07-21 19:32:38 451
原创 RocketMQ集成Springboot --Chapter1
实现一个监听器对象,重写其中的消费消息的方法。使用注解@RocketMQMessageListener(consumerGroup = “htpConsumerGroup”,topic = “helloTopicBoot”)consumerGroup组必须是唯一的,helloTopicBoot表示要监听的主题。最后生产者启动测试类发送消息,消费者运行主程序一直运行即可.
2023-07-21 12:21:58 352
原创 RocketMQ消息过滤Tag标签
生产者在封装Message消息时可以传入tag参数,消费者在进行消费时可以进行订阅主题时可以进行tag过滤,代码示例如下.
2023-07-20 16:01:39 268
原创 org.apache.rocketmq.remoting.exception.RemotingConnectException: connection to ip : 10911 failed
broker使用的IP一般是本机IP地址,默认系统自动识别,但是某些多网卡机器会存在识别错误的情况,导致无法识别到正确的本地IP地址,从而导致broker启动是使用了内网IP。虽然启动时已经配置了本地IP地址,但是并为通过配置文件启动broker,导致配置文件没有生效。
2023-07-20 12:39:06 6980
原创 RocketMQ实现延时消息
现在RocketMq并不支持任意时间的延时,需要设置几个固定的延时等级,从1s到2h分别对应着等级1到18。RocketMQ延时消息可以实现订单超时自动取消等类似功能。
2023-07-19 23:24:49 1084
原创 RocketMQ如何实现顺序消费
默认MQ没有实现顺序消费,因为RocketMQ1个topic中有四个队列,且消费是多线程进行消费的。即使队列能够保证先进先出,但是由于多线程CPU执行的随机性,我们无法保证消费的顺序,从而导致了消费的乱序。
2023-07-19 23:06:47 1302
原创 TCP三次握手
当两台设备建立TCP连接时,它们之间需要进行三次握手。可以将这个过程类比为人们互相打招呼来确认彼此的身份和愿意交流的一种方式。一次握手 ------首先,发送方(假设是你)向接收方(假设是我)发出一个问候,表示你想与我建立连接。这个问候带有一个特殊的标记,就像在招呼中说“嗨”。同时,你还会告诉我一个起始号码,就好像是你自己的手机号码。二次握手 ------当我收到了你的问候后,我知道你想与我建立连接。所以我回复你一个问候,用一个特殊的标记表示“嗨”,并告诉你我的手机号码。
2023-06-28 20:45:19 369
原创 redis缓存是如何回收、淘汰的
一、什么是Redis缓存回收和Redis缓存淘汰?1、什么是Redis缓存回收?Redis内存回收:Redis通过定期删除和惰性删除两种方式来清除过期的键,以保证数据的时效性和减少内存占用2、什么是Redis缓存淘汰?Redis内存淘汰:当Redis的内存使用超过配置的限制时,根据一定的策略删除一些键,以释放内存空间。
2023-06-27 12:21:48 968
原创 代码无锁化
在传统的并发编程中,为了保证数据的一致性和避免竞态条件,常常需要使用锁机制(如互斥锁、读写锁等)来对共享资源进行保护。但是,在高并发场景下,频繁地加锁和解锁操作会导致线程的等待和切换开销增加,降低程序的性能。这样可以减少线程的竞争和等待,并发性更好。总的来说,无锁化的编程方式可以在一定程度上提高程序的并发性能,但也存在一些挑战,如处理数据一致性、确保线程安全等问题,需要谨慎使用和设计。无锁化是指在多线程/并发编程中,通过使用一些技术手段来避免或减少对共享资源的加锁操作,从而提高程序的并发性和性能。
2023-06-26 21:47:59 82
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人