- 博客(128)
- 收藏
- 关注
原创 Java、K8s、Docker:三兄弟如何踏上自动化征程?
与 Kind、Minikube不同,kubeadm 用于在生产环境中部署多节点的 Kubernetes 集群,而不仅仅是单节点的本地开发环境。Docker 相信这个大家并陌生, Docker是一个开源的容器化平台,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中。Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。配置部署:包含应用名称、容器镒、pod数量、Service非常的方便,不想设置配置yaml的可以很方便的部署。
2024-11-21 13:50:54
1094
原创 Spring Cloud Consul实现选举机制
是 Spring Cloud 提供的对的支持。它是一种基于服务网格的工具,用于实现服务注册、发现、配置管理和健康检查。服务注册与发现:通过 Consul 的服务注册功能,Spring Cloud Consul 可以实现微服务的动态注册和发现,简化服务间通信。分布式配置管理:通过 Consul 的 Key/Value 存储机制,提供对分布式配置的管理。健康检查:支持服务实例的健康检查,确保只有健康的实例可供其他服务调用。选举与分布式锁:通过 Consul 的会话机制,支持分布式锁和领导选举。
2024-11-21 13:49:13
541
原创 Java性能测试利器:JMH入门与实践|得物技术
编写正确的Java微基准测试通常需要防止JVM和硬件在微基准测试执行期间应用的优化,而这些优化在实际生产系统中是无法应用的。这是因为String对象是不可变的,每次使用+操作符拼接字符串时都会创建新的String对象,而StringBuilder则是可变的,可以在不创建新对象的情况下进行字符串拼接。注意:这个特定示例是一个糟糕的基准测试实现,因为 JVM 检测到sum变量从未使用过,因此可能会消除这段总和计算的代码。请注意,这个例子是一个简单的基准测试,实际使用时可能需要更复杂的测试场景和更多的配置。
2024-11-21 13:48:37
811
原创 Spring Boot集成ShedLock实现分布式定时任务
ShedLock是一个 Java 库,通常用于分布式系统中,确保定时任务(Scheduled Tasks)在集群环境下只被某一个实例执行一次。它通过在共享资源(例如数据库或分布式缓存)中添加锁的方式,避免多个实例同时执行相同的任务。
2024-11-20 13:55:14
622
原创 【Java】还不懂策略模式?一文带你玩明白策略模式
写完代码的你,刷到一条励志鸡汤,然后你像是下定了某种决心,决定开始重构这个代码~ 你在网上查询大量资料后,发现有个设计模式可以很好的解决你这个问题~ 这个设计模式就是:策略模式 于是乎,你便开始使用策略模式进行重构你的Java代码 重构思路。很简单,就是我们的用户忘记密码了,要找回密码,可以让用户选择不同的方式,比如:手机验证码验证、密保问题验证,就先做这两个吧~这个策略工厂类的主要作用是提供一个统一的接口,用于根据不同的类型获取相应的策略实例,从而实现策略模式。
2024-11-20 13:53:08
551
原创 重学Java设计模式-观察者模式
观察者模式其中一个对象(称为“主题”或“主体”)维护一组依赖于它的对象(称为“观察者”),并在其状态发生变化时通知这些观察者观察者模式观察者模式是一种设计模式,其中一个对象(主题或被观察者)维护一组依赖于它的对象(观察者),并在其状态发生变化时自动通知这些观察者。发布-订阅模式发布-订阅模式是一种更松耦合的架构模式,其中发布者(发布事件的对象)与订阅者(接收事件的对象)之间没有直接的引用关系,而是通过一个中介(如消息代理或事件总线)进行通信。
2024-11-20 13:51:23
540
原创 登录校验全解析:从原理到实践,保障系统安全
● 全称: JSON Web Token (jwt.io/)(Token-令牌)● 定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。● 组成:◆ 第一部分:Header(头), 记录令牌类型、签名算法等。例如:的JSON数据格式那我们看到原始的数据格式是上面这样一个JSON格式的数据,它还要再进行一次编码(base64编码:是一种基于64个可打印的字符 来表示二进制数据的编码方式,注意不是加密!
2024-11-19 19:55:05
888
原创 java并发编程(6)-AQS原理剖析
刚开始head节点和tail节点都是空的,在第一次循环时,我们将先对head节点和tail节点初始化为空Node,在第二次循环时才将当前Node入队,通过将tail节点设置为当前节点的前驱节点,并且CAS操作使自己成为新的tail节点(因为第一次CAS入队时的tail节点和head节点指向的是同一个对象,所以第一次入队实际上是将head节点设置为当前节点的前驱节点)。上面的就是AQS的类图,从类图中可以比较明显的看出,AQS是一个双向队列,并且队列中的元素是Node对象。enq的方法很简单,逻辑也很清晰。
2024-11-19 19:51:50
993
原创 闹笑话了,差点以为Java三目运算符有BUG!!!
在 Java 中使用三目运算符时,要特别注意返回类型的推断是否会导致拆箱操作。若条件结果可能为null,而又涉及自动拆箱操作,则会引发空指针异常。因此,确保条件表达式返回值类型一致或明确避免null拆箱操作,是解决此问题的关键。
2024-11-19 19:50:35
597
原创 Java Stream 流:代码世界的魔法河流
Java Stream 流就像是代码世界里一条充满无限可能的魔法河流,它可以用各种神奇的操作,把乱糟糟的数据变得井井有条,把普通的数据变成令人惊叹的模样。无论是简单的排序、过滤,还是复杂的映射、组合以及并行处理,都像是这条魔法河流里泛起的绚丽浪花。只要我们掌握了 Stream 流的魔法咒语,就能在代码的世界里创造出属于自己的传奇,让数据处理变得轻松又有趣,就像一个伟大的魔法师在自己的魔法王国里肆意挥洒魔法一样!
2024-11-19 19:50:01
230
原创 闹笑话了,差点以为Java三目运算符有BUG!!!
在 Java 中使用三目运算符时,要特别注意返回类型的推断是否会导致拆箱操作。若条件结果可能为null,而又涉及自动拆箱操作,则会引发空指针异常。因此,确保条件表达式返回值类型一致或明确避免null拆箱操作,是解决此问题的关键。
2024-11-18 20:08:28
736
原创 探秘 Java 泛型:从类型参数到边界限制与类型擦除
你在上一个示例中看到的?被称为通配符。你可以使用它们来引用未知类型。。它也可以与下界一起使用,如。
2024-11-18 20:06:10
597
原创 入门Hadoop存储与计算:实现单词统计的分布式文件处理系统
MapReduce模型分为Map、Reduce两个阶段,其中Reduce又分为shuffle, sort and reduce运行流程文件上传到HDFS -> 输入 input <k1, v1> -> map -> <k2, v2> -> combine -> <k2, v2> -> reduce -> <k3, v3> output 输出 -> 存储到HDFS。
2024-11-18 20:05:05
853
原创 Spring Boot 和 Hadoop 3.3.6 的 MapReduce 实战:日志分析平台
是一个开源的分布式计算框架,主要用于处理大规模数据集。HDFS(Hadoop 分布式文件系统):一个分布式存储系统,能够高效地存储大数据。MapReduce:一种并行计算模型,用于处理和生成大规模数据集。:Hadoop 的资源管理系统,负责集群资源的管理和调度。Hadoop 的强大之处在于它的可扩展性和容错性,能够在普通硬件上运行,并能处理大量数据,适用于批处理和大规模数据分析场景。通过 MapReduce 实现对网站访问日志的处理和分析。
2024-11-16 23:09:28
1087
原创 基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
为了避免某个房间的书架损坏(节点故障)导致书籍丢失,图书馆会将重要的书籍(数据块)复制多份,并存储在不同的房间中。但在实际业务场景中,我们可能遇到更多形式的数据,因此,就需要我们在解析时能够支持多种数据格式,这里我们先以。每个房间的管理员可以同时统计各自房间书籍的数量,如果某个房间管理员今天请假了没来,馆长也会为这个房间指定一个临时管理员来接手任务。对于单词统计任务,可能一个文本里某些单词出现的频率远高于其他单词,这样就可能导致某些Reducer的负载过重,也就是我们说的。
2024-11-16 23:08:18
1008
原创 解锁SpringBoot高级技能:Redis多数据源配置全攻略
java代码解读复制代码} } /** * 获取主从配置 */ private RedisStaticMasterReplicaConfiguration getStaticMasterReplicaConfiguration() { if (redisPropertiesExtend.getMasterReplica() == null) { return null;深入理解 Spring Boot Redis 自动配置源码是实现灵活多数据源支持的关键。
2024-11-16 23:06:43
930
原创 浅析基于Hadoop的分布式文件处理系统设计
本文设计并实现了一个基于Hadoop的分布式文件处理系统,该系统能够高效地处理大规模数据文件,并将处理结果存储回HDFS。通过使用Java语言实现MapReduce任务,对CSV和JSON格式的数据进行解析和统计分析,并采用了一些性能调优和正确性验证的策略,确保了系统的高效性和正确性。在实际应用中,可以根据具体的需求和场景,对系统进行进一步的优化和扩展,以满足不同的业务需求。
2024-11-15 14:07:23
533
原创 Spring Cloud Gateway快速入门Demo
Spring Cloud Gateway 是一个基于 Spring Framework 和 Spring Boot 构建的 API 网关服务。它提供了一种简单而有效的方式来路由请求、提供跨领域的关注点(如安全、监控/指标和弹性)以及其他功能。Spring Cloud Gateway 旨在提供一种简单而有效的方式来路由 API 请求,并提供一些常见的网关功能,如路径重写、负载均衡、限流、熔断等。
2024-11-15 14:06:55
514
原创 为什么JDK钟爱ForkJoinPool?
ForkJoinPool是自java7开始,jvm提供的一个用于并行执行的任务框架。其主旨是将大任务分成若干小任务,之后再并行对这些小任务进行计算,最终汇总这些任务的结果。得到最终的结果。其广泛用在java8的stream中。这个描述实际上比较接近于单机版的map-reduce。都是采用了分治算法,将大的任务拆分到可执行的任务,之后并行执行,最终合并结果集。区别就在于ForkJoin机制可能只能在单个jvm上运行,而map-reduce则是在集群上执行。
2024-11-14 13:54:24
929
原创 别泄漏数据,密钥安全概述
在 MPC 下,没有参与方拥有完整的“密钥”,这极大地提升了密钥维护的安全性。KMS 具备完善的密钥管理、操作审计和密钥轮换(Rotation)能力,能确保较高的密钥安全基线。交换是密钥流出的关键,涉及密钥的生成以及如何将生成的密钥安全地传输至加解密双方。对称密钥安全传输的前提是建立安全信道,因为在不安全信道中传输的密钥可能被中间人拦截,进而解密后续信息。是最常见的一种手段。这样,在数据泄漏时,能最大限度减少泄漏的数据总量,提升加密安全。密钥使用是密钥生命周期的最后一环,同时也是最容易泄漏密钥的阶段。
2024-11-14 13:53:51
1040
原创 Hadoop的工作原理是什么?如何搭建一套分布式文件系统?
NameNode:NameNode(主节点是 HDFS 的中心控制节点,负责管理文件系统的元数据(比如文件和目录的树状结构,文件块的位置、用户权限等)。它不直接存储数据,而是记录数据存储在哪些DataNode上。DataNode:DataNode(数据节点)是实际存储数据的节点,它们接收数据块,并定期向 NameNode汇报自己存储的块信息和健康状态。此外,还有一个可选的组件,它用于辅助NameNode的元数据备份和日志合并,帮助维持文件系统的高可用性。
2024-11-14 13:52:43
1223
原创 【JAVA】【SPRING】自记:应用Context选择策略,殊途同归的if else
对应系统建设的场景,就是明确的区分出业务可以正常执行下去走完流程的,和明确阻塞性的异常。(1)context是在run时才创建的,ifnull时才做default switch创建逻辑,最终一致性无处不在。首先知识储备上要知晓Class.forName可能的异常情况,才能做到捕获指定异常,它真的是个异常,明确认定。值得学习的是这里,很多野蛮源码的异常层层抛,异常体系形同虚设。初一看就是普通的class.forName判断,内部集成了对于各类型的判断,或递归。这里的注释特别看下,说明了ifnull的判断。
2024-11-13 13:58:12
343
原创 Spring Boot 自动加载 Jackson 的原理及替换为 FastJSON
Jackson 是一个高性能的 JSON 处理库,广泛用于 Java 应用程序中。它提供了多种功能,包括 JSON 解析、生成、数据绑定等。Spring Boot 选择 Jackson 作为默认的 JSON 处理库,主要是因为其性能优越和功能丰富。FastJSON 是由阿里巴巴开发的一款高性能的 JSON 处理库,广泛应用于 Java 应用程序中。它不仅提供了 JSON 解析和生成的功能,还支持数据绑定和序列化/反序列化操作。FastJSON 的设计目标是提供高效、易用且功能丰富的 JSON 处理能力。
2024-11-13 13:56:40
733
原创 妙用MyBatisPlus,12个实战技巧解锁新知识
说起数据库ORM,我忽然想起了小时候外婆做的那锅鲜美的羊肉汤。平常人家做的羊肉汤无非是几块肉、几片姜,味道寡淡得很,喝了和喝白开水差不多。但外婆的汤,那是另一回事儿 —— 一锅汤,香气四溢,肉质软烂,汤头浓郁得能让人连碗都想舔干净。写代码何尝不是如此?以前写Mybatis,就像是在煮一锅没有灵魂的羊肉汤:原料都在,但就是不够鲜美。代码繁琐,每写一个查询都像是在不断调味,却怎么也调不出那种令人惊艳的味道。
2024-11-13 13:55:30
789
原创 聊聊我们那些年用过的表达式引擎组件
之前如果我们需要使用构造器注入,则需要手动书写构造器,而是对于后续更多Bean的注入,我们又需要重新在构造器中添加需要注入的Bean参数,略显繁琐,但是如今通过这种方法就可以省去了这个步骤,并且是Spring官方推荐的Bean注入方式。是不是很多@Resource,造成不仅是代码的整洁度,还是代码观感,其实都不是很好,我们常常说尽量消除冗余代码,增强复用,那么这里的注解我们是不是可以消除掉呢?前提引入Lombok依赖,这个依赖出现很多纷争,有些人推荐用,有些人不推荐用,可根据各公司实际情况使用。
2024-11-12 15:24:42
423
原创 聊聊我们那些年用过的表达式引擎组件
本文介绍了市面比较常用的表达式引擎组件,而这些引擎基本上都可以用hutool提供的表达式门面实现,hutool确实在工具类这方面做得很好,基本上我们日常会用到的工具,它大部分都涵盖到。最后文末demo链接,也提供了跟spring整合的表达引擎聚合实现,大家感兴趣也可以看看。
2024-11-12 15:24:01
405
原创 JDK21 VirtualThread 初识原理入门
虚拟线程是轻量级线程(类似于 Go 中的 “协程(Goroutine)”),可以减少编写、维护和调度高吞吐量并发应用程序的工作量。线程是可供调度的最小处理单元,它与其他类似的处理单元并发运行,并且在很大程度上是独立运行的。线程(java.lang.Thread)有两种,平台线程和虚拟线程。
2024-11-11 13:30:00
943
原创 实习过程中碰到的使用SSE(Server Sent Events)实现AI的流式输出
上次迭代已经结束了,这次的迭代(是关于AI答疑的)也开始了,前几天开了一个技术评审,由于我们这个项目是处于重构阶段(拆分那些并发量很高的微服务), 这次的需求没有太多,这次的话分给我的就是AI答疑满意度功能和一个AI答疑对话流式输出的接口(这种的接口很少做,一些api都不是很熟悉),leader说有个类似的接口,叫我模仿一下尝试尝试新的东西。于是我就去全面的学习了一下服务器推送技术,和大家分享分享。
2024-11-11 13:29:30
782
原创 惊爆!Java定制属于自己的AI,是怎样一种体验?
这个简易的聊天机器人使用了Spring Boot、Spring AI、RESTful API,并包含一个简单的聊天网页。后续还需要进一步扩展和优化这个聊天机器人,如集成Ollama模型、支持多轮对话、页面 UI 等。
2024-11-11 13:28:48
889
原创 重写和重载傻傻分不清?看完这篇秒懂!
方法重载指的是在同一个类中定义多个方法,这些方法名称相同,但它们的参数列表不同(包括参数的个数或类型不同)。这样在调用时,Java编译器会根据传递的参数来选择对应的方法。1.1 方法重载的特征相同的名称:重载的方法名必须相同。不同的参数列表:重载方法的参数数量或者类型必须不同。与返回类型无关:重载方法的返回类型可以相同,也可以不同,但仅靠返回类型不同不能实现重载。编译期决定:重载是在编译期间由编译器决定的,即在代码编译阶段就能知道应该调用哪个方法。
2024-11-10 16:23:00
1072
原创 6种常见的缓存策略,请享用!
本文,我们分析了 5种常见的缓存策略,也是在我们日常开发中经常使用的策略,关于缓存策略的选择应根据具体的应用需求、系统架构以及性能目标进行评估和优化。Read Through:在缓存缺失时从主存取数据并更新缓存,适合读多写少场景。Cache Aside:由应用程序自己管理缓存,提供灵活性,适合复杂业务逻辑。Write Through:实时在缓存和主存同步写数据,保证一致性但写入稍慢。Write Around:写操作跳过缓存,减少写入负担,适合写频繁但读取少的情况。
2024-11-10 16:21:29
715
原创 【JAVA】【Spring】小记一下ApplicationListenerDetector
(1)中进行add的原因,是因为各类开源组件都应按合理的方式加入spring工厂启动时预埋的各种点/口子,那么自然可能有实现了ApplicationListener的情况,自然要在prepare工厂时就加好这个ListenerDetector来监听,以尽早让其进入工厂开始探测。否则可能出现:实现了BeanFactoryPostProcessor的类,早于这个实现了BeanPostProcessor的ApplicationListenerDetector进入工厂,没有被探测到加入工厂的listener队列。
2024-11-09 15:22:03
704
原创 45-best-time-to-buy-and-sell-stock-with-cooldown 力扣 714. 买卖股票的最佳时机包含手续费
在此处买入 prices[0] = 1 在此处卖出 prices[3] = 8 在此处买入 prices[4] = 4 在此处卖出 prices[5] = 9 总利润: ((8 - 1) - 2) + ((9 - 4) - 2) = 8。注意:这里的一笔交易指买入持有并卖出股票的整个过程,每笔交易你只需要为支付一次手续费。输入:prices = [1,3,7,5,10,3], fee = 3 输出:6。i 代表第 i 次的操作,可以是买入,也可以是卖出,或者什么都不做。sell[i] 是否卖出后的状态。
2024-11-09 15:20:27
355
原创 6种常见的缓存策略,请享用!
本文,我们分析了 5种常见的缓存策略,也是在我们日常开发中经常使用的策略,关于缓存策略的选择应根据具体的应用需求、系统架构以及性能目标进行评估和优化。Read Through:在缓存缺失时从主存取数据并更新缓存,适合读多写少场景。Cache Aside:由应用程序自己管理缓存,提供灵活性,适合复杂业务逻辑。Write Through:实时在缓存和主存同步写数据,保证一致性但写入稍慢。Write Around:写操作跳过缓存,减少写入负担,适合写频繁但读取少的情况。
2024-11-09 15:19:56
883
原创 Java容器框架——Set接口及其实现类HashSet
实际上我们在使用Set集合来进行编写的时候,一定要有一个“上帝视角”,一旦放入Set,那么我们就一定能够通过全局来知晓 某个东西究竟在不在集合中。就是只要我加一个元素进来,不管这个元素是加在数组上,还是链在链表上,还是挂在红黑树上。都算是所谓的容量增加。如果table数组使用到了临界值12,就会扩容到16*2=32,新的临界值就是 32x0.75 = 24。,第一次添加时,table数组扩容到16,临界值(threshold) 是16*加载因子(方法比较,如果相同,就放弃添加,如果不相同,就添加到最后。
2024-11-08 13:23:54
880
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人