- 博客(133)
- 资源 (5)
- 收藏
- 关注
原创 【Java】—JavaBean转换方法详解
在实际工程中对于一次请求可能涉及到多个对象转换过程,如果对于每一次转换都手动去维护一个转换方法工作量是非常大的,而且在后续业务拓展时,如果我们有增加字段的需求,对于每一层的转换方法都要去维护变更,这是一件很麻烦的事情,这篇文章推荐一些可以实现自动转换的方法
2024-10-19 23:08:48
931
原创 【Java】—一篇搞懂POJO和VO、BO、DTO、PO模型
POJO(Plain Old Java Object/Plain OrdinaryJava Object)是指普通的Java对象,它是一个简单的Java类,通常没有实现特定的接口或继承特定的类。POJO对象的设计原则是简单、普通、纯粹的Java对象,不依赖于特定的框架或技术。当然,如果有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
2024-10-19 23:00:06
1855
原创 【JVM】—深入理解ZGC回收器—背景概念&回收流程
ZGC初始化时会为堆分配内存,并将所有对象标记为“存活”状态。这个阶段主要识别哪些对象是不再使用的。ZGC使用了基于Card Table的追踪算法(G1中的CSet与RSet概念)来发现引用关系。标记过程是并发的,意味着它可以与应用程序的执行同时进行,以减少停顿时间。在这个过程中,ZGC会维护一个引用队列,用于跟踪新创建的对象或更新的引用。虽然ZGC的目标是最小化暂停时间,但仍然需要短暂的暂停来安全地重定位对象。
2024-10-18 22:58:40
1081
原创 【JVM】—G1 GC日志详解
G1 有两个阶段,它会在这两个阶段往返,分别是 Young-only,Space Reclamation.Young-only阶段包含一系列逐渐填满老年代Regin的 GC;Space Reclamation 阶段G1会递进地回收老年代Regin的空间,同时也处理新生代Region
2024-10-17 23:45:58
1859
1
原创 【JVM】—G1中的Young GC、Mixed GC、Full GC详解
G1提供了两种GC模式,Young GC和Mixed GC,两种都是完全Stop The World的。 Young GC:选定所有年轻代里的Region。通过控制年轻代的region个数,即年轻代内存大小,来控制young GC的时间开销。 Mixed GC:选定所有年轻代里的Region,外加根据Global concurrent marking统计得出收集收益高的若干老年代Region。在用户指定的开销目标范围内尽可能选择收益高的老年代Region。
2024-10-17 23:35:50
2251
原创 【JVM】—深入理解G1回收器—回收过程详解
G1收集可以分为两大部分:全局并发标记(global concurrent marking);拷贝存活对象(evacuation),或者叫迁移;G1有两种GC模式:Young GC和Mixed GC,Young GC和Mixed GC都是STW。
2024-10-16 23:01:20
1026
原创 【JVM】—深入理解G1回收器——概念详解
G1(Garbage-First),它是一款面向服务端应用的垃圾收集器,在多 CPU 和大内存的场景下有很好的性能。HotSpot 开发团队赋予它的使命是未来可以替换掉 CMS 收集器。
2024-10-16 22:48:56
1631
原创 【JVM】—JVM垃圾回收详解
垃圾回收(Garbage Collection, GC)是自动管理内存的一种机制,它负责自动释放不再被程序引用的对象所占用的内存,这种机制减少了内存泄漏和内存管理错误的可能性。垃圾回收可以通过多种方式触发
2024-10-15 23:24:59
1021
原创 【JVM】—Java内存区域详解
根据 JVM8 规范,JVM 运行时内存共分为虚拟机栈、堆、元空间、程序计数器、本地方法栈五个部分。还有一部分内存叫直接内存,属于操作系统的本地内存,也是可以直接操作的。
2024-10-15 23:18:25
909
原创 【gRPC】—gRPC底层详解&RPC系列
因为工作💼上使用RPC协议是gRPC,为了进一步深入理解gRPC协议,特意开了这个RPC系列的坑,这个系列详细介绍了gRPC底层的Protocol Buffer协议、Java对于gRPC的底层实现和工作中可能会遇到的异常类型和case分析,同时也介绍了RPC的大概生态,这里整理一个目录方便查阅,该系列也持续更新中~
2024-10-14 23:37:31
709
原创 【gRPC】4—gRPC与Netty
gRPC跟Netty的关系主要包括如下几方面的依赖:依赖Netty实现的HTTP/2协议的封装,通过Listener机制监听HTTP/2的数据报文事件,完成网络相关处理;Reactor IO模型的依赖,Nio/Epoll;依赖Netty的ByteBuf完成流数据在内部中的缓存与流转;
2024-10-10 23:11:16
1329
原创 【gRPC】3—gRPC API设计详解
gRPC整体设计思路依附于HTTP/2协议,而HTTP/2是一个双向流协议,因此gRPC在API设计上也采用了Stream的方式
2024-10-10 23:06:57
1037
原创 【gRPC】2—gRPC与PB&桩代码生成与扩展
PB即protobuf全名是ProtocolBuffers,是谷歌推出的二进制序列化协议,提供IDL文件来定义各种类型的数据。目前整体协议版本是proto3,protobuf提供了从proto文件编译生成各个语言文件的功能。与此同时protobuf提供了丰富的插件机制,用户可以扩展生成的对应语言的文件,俗称桩代码生成。gRPC正是通过插件式的扩展机制完成相关桩代码的生成。
2024-10-09 22:26:19
1340
原创 【gRPC】1—gRPC是什么
想要理解好gRPC必须了解HTTP/2协议,因为不论是日常看到的异常栈还是gRPC涉及的相关定义都跟HTTP/2存在强绑定的关系。关于HTTP/2详细介绍请参见:https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-CN。
2024-10-09 22:18:09
1130
原创 【中间件】—一篇说明白API网关&常用API网关推荐
计算机网络中,网关(Gateway)又称网间连接器、协议转化器。类比计算机网络中的网关来说,在微服务环境中,Api网关是所有服务的流量入口,网关在接收到请求后进行处理,再转发到对应的服务;服务处理请求并返回给网关数据后,网关再将数据返回给原始请求方。
2024-10-08 23:36:11
2564
原创 【微服务】—SpringBoot入门
SpringBoot是一个集成了Spring技术栈的一个大整合,是一个简化了Spring应用开发的框架,可以一站式解决J2EE的开发流程。Spring使用作为内部日志,但底层日志实现是开放的。可对接其他日志框架。spring5及以后 commons-logging被spring直接自己写了。支持jullog4j2logback。SpringBoot提供了默认的控制台输出配置,也可以配置输出为文件。logback是默认使用的。虽然日志框架很多,但是我们不用担心,使用 SpringBoot 的。
2024-10-08 23:28:51
1474
原创 【RPC】—RPC介绍一篇就够了&RPC的选择
RPC远程调用的概念最早可以追溯到20世纪80年代,当时Sun Microsystems公司提出了一种名为ONC RPC(Open Network Computing Remote Procedure Call)的协议,用于在NFS(Network File System)中进行远程过程调用。此后,RPC成为了分布式系统中的一种重要通信方式,被广泛应用于各种分布式系统和应用中
2024-10-07 19:31:52
3546
原创 【RPC】—Thrift协议 & VS Protobuf
Thrift是一套包含序列化功能和支持服务通信的RPC框架,主要包含三大部分:代码生成、序列化框架、RPC框架,大致相当于protoc + protobuffer + grpc,并且支持大量语言,保证常用功能在跨语言间功能一致,是一套全栈式的RPC解决方案。Thrift整体架构图如下:Thrift 本身是一个比较大的话题,本文不会涉及到全部内容,重点介绍其中的序列化协议。
2024-10-07 19:26:36
1452
原创 【Java多线程】8——CompletableFuture
在Future接口下,我们只能通过调用get()方法来获取任务计算结果,但是只要目标任务没有执行完,get()方法会被阻塞——阻塞方式又回到了同步调用,这就和异步操作的初衷相违背了。从实现类的版本情况能看出,
2024-03-30 19:19:46
511
原创 【Java多线程】7——阻塞队列&线程池
在《阿里巴巴Java开发手册》中指出了线程资源必须通过线程池提供,不允许在应用中自行显式的创建线程,这样一方面是线程的创建更加规范,可以合理控制开辟线程的数量;另一方面线程的细节管理交给线程池处理,优化了资源的开销。同时线程池不允许使用Executors去创建,而要通过方式,这一方面是由于JDK 中 Executor 框架虽然提供了如等创建线程池的方法,但都有其局限性,不够灵活;使用有助于大家明确线程池的运行规则,创建符合自己的业务场景需要的线程池,避免资源耗尽的风险。
2024-03-30 19:16:46
2088
原创 【Java多线程】5——Lock底层原理
根据类的名字抽象的队列式同步器。AQS 定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它。它维护了一个(代表共享资源)和一个 FIFO 线程等待队列(多线程争用资源被阻塞时会进入此队列)。这里 volatile 是核心关键词。getState()setState()Exclusive(独占,只有一个线程能执行)Share(共享,多个线程可同时执行)不同的自定义同步器争用共享资源的方式也不同。
2024-03-29 16:12:39
1101
原创 【Java多线程】4——特定场景解决办法
使用 Fork Join 框架能够帮助我们把一个大型任务,根据一定规律,拆分成小任务执行。如果拆分后的任务还不够小,可以以递归模式继续拆分,直到拆分到可以执行的程度。然后再把各个子任务执行的结果汇总到一起。Fork:拆分:把大任务拆分成小任务。Join:合并:把小任务执行的结果合并到一起。我们使用 Fork Join 框架只需要继承 RecursiveTask,然后重写 compute() 方法即可。任务拆分的逻辑任务拆分的操作:调用 fork() 方法。
2024-03-28 14:54:30
950
原创 【Java多线程】3——Lock API控制多线程
在实际场景中,读操作不会改变数据,所以应该允许多个线程同时读取共享资源;但是如果一个线程想去写这些共享资源,就不应该允许其他线程对该资源进行读和写的操作了。针对这种场景,Java 的并发包提供了读写锁,它表示两个锁,一个是读操作相关的锁,称为读锁,这是一种共享锁;一个是写相关的锁,称为写锁,这是一种排他锁,也叫独占锁、互斥锁。
2024-03-28 14:37:51
982
原创 【Java多线程】2——synchronized底层原理
为了减少获得锁和释放锁带来的性能消耗,引入了『偏向锁』和『轻量级锁』的概念。升级后锁一共有 4 种状态,级别从低到高依次是:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态。
2024-03-27 19:40:37
1222
原创 【Java多线程】1——多线程知识回顾
在一个进程中,需要同时处理多个不同任务,每一个任务由一个线程来执行。从这个意义上来说,可以把进程看做是线程的容器。
2024-03-27 19:31:55
889
原创 【消息队列】——Kafka入门一篇就够了!
Kafka 是一种分布式的,基于发布 / 订阅的消息系统。以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对 TB 级以上数据也能保证常数时间复杂度的访问性能;高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒 100K 条以上消息的传输;支持 Kafka Server 间的消息分区,及分布式消费,同时保证每个 Partition 内的消息顺序传输;同时支持离线数据处理和实时数据处理;Scale out:支持在线水平扩展;
2024-03-26 14:09:00
3831
原创 【分布式】——降级&熔断&限流
什么是熔断,什么是降级,熔断与降级是同一个意思吗?如上图所示,服务A接收客户端请求,服务B提供给内部服务调用,每个服务部署的节点数至少两个。在事发之前的近一周,服务B都一直运行正常,而事发的那晚请求量突增一倍,显然,此次事故与请求突增脱不了干系。因突增请求导致服务B高负荷运转,超出临界点的请求最后超出设定的接口超时时间,再由于服务B的一个隐藏性能问题导致内存消耗殆尽,进程开始频繁GC,但服务A还是不断地往服务B发送请求,导致服务B奔溃,服务B的奔溃又直接导致服务A。
2024-03-26 13:57:34
1154
原创 【分布式】——分布式事务
整个 2PC 的事务流程涉及到三个角色 AP、RM、TM。AP 指的是使用 2PC 分布式事务的应用程序;RM 指的是资源管理器,它控制着分支事务;TM 指的是事务管理器,它控制着整个全局事务。(1)在准备阶段RM 执行实际的业务操作,但不提交事务,资源锁定(2)在提交阶段TM 会接受 RM 在准备阶段的执行回复,只要有任一个RM执行失败,TM 会通知所有 RM 执行回滚操作,否则,TM 将会通知所有 RM 提交该事务。提交阶段结束资源锁释放。
2024-03-25 23:32:09
1369
1
原创 【分布式】——CAP&BASE理论
BASE 是Basically Available(基本可用)、**Soft state(软状态)**和 **Eventually consistent (最终一致性)**三个短语的缩写。BASE 理论是对 CAP 中 AP 的一个扩展,通过牺牲强一致性来获得可用性,当出现故障允许部分不可用但要保证核心功能可用,允许数据在一段时间内是不一致的,但最终达到一致状态。满足BASE理论的事务,我们称之为“柔性事务。
2024-03-25 23:24:06
1092
原创 【RPC】—Protobuf编码原理
Protobuf的编码是基于变种的Base128的,在学习Protobuf编码或者是Base128之前,先来了解下Base64编码。
2023-07-04 20:38:52
1436
原创 【RPC】—Protobuf入门
在IM应用中,优化数据流量消耗过多的基本方法就是使用高度压缩的通讯协议,而数据压缩后流量减小带来的自然结果也就是省电:因为大数据量的传输必然需要更久的网络操作、数据序列化及反序列化操作,这些都是电量消耗过快的根源。当前IM应用中最热门的通讯协议无疑就是Google的Protobuf了,基于它的优秀表现,微信和手机QQ这样的主流IM应用也早已在使用它。什么是 Google Protocol Buffer?
2023-07-04 20:35:31
1336
原创 缓存三击-缓存穿透、缓存雪崩、缓存击穿
Redis作为目前使用最广泛的缓存,但在实际开发中会面临缓存异常,分别是缓存雪崩、缓存击穿和缓存穿透,这三种异常会导致大量请求从缓存转移到数据库,如果请求的并发量很大就会导致数据库崩溃。
2023-06-30 17:50:36
1266
原创 缓存穿透-布隆过滤器
如果是网络恶意攻击(每次key不一样,且数据库不存在),缓存占用了更多的内存;缓存空对象要考虑到缓存时间的设置。这时候设置一个较短的过期时间(通常设定的缓存过期为60秒),就会自动剔除这些键。如果过期时间设置的过大,数据库在此期间正好添加了该数据,就会出现数据不一致场景;通过消息系统或者其它方式来清除缓存中的空对象。而另一种方式就是使用布隆缓存器!
2023-06-30 17:45:07
454
原创 Java新特性-Optional
从 Java 8 引入的一个很有趣的特性是Optional类。Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异常。本质上,这是一个包含有可选值的包装类,这意味着 Optional 类既可以含有对象也可以为空。Optional 是 Java 实现函数式编程的强劲一步,并且帮助在范式中实现。但是 Optional 的意义显然不止于此。Optional是 Java 语言的有益补充 —— 它旨在减少代码中的。
2023-06-30 17:41:32
497
原创 Java新特性-stream()
在JAVA中,涉及到对数组Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理。在JAVA7及之前/*** 【常规方式】* 从给定句子中返回单词长度大于5的单词列表,按长度倒序输出,最多返回3个* @param sentence 给定的句子,约定非空,且单词之间仅由一个空格分隔* @return 倒序输出符合条件的单词列表。
2023-06-30 17:40:15
272
原创 Java新特性-Functon接口
为了更好的将函数作为参数,Java遂引入了Function接口。super V ,?super R ,?} }有一个抽象方法,暗示可以使用λ\lambdaλ表达式;该接口会接收一个参数,且会产生结果;在使用这个接口前需要明确定义参数类型和返回的结果类型(Java的泛型就是这么回事);里面有一个apply方法将会对参数进行操作,并返回结果;因为是函数式接口(),可以通过lambda表达式实现该接口;总之,要分清当前function,也就是当前对象,判断执行顺序。
2023-06-30 17:38:49
258
python食物数据爬取及分析(源码、爬取数据、数据可视化图表、报告)
2022-01-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人