自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(264)
  • 收藏
  • 关注

原创 微服务那些事:开启现代架构之旅

这就是服务发现的问题了。另外,N个小服务的调用也是一个不小的网络开销。而异步消息的方式在分布式系统中有特别广泛的应用,他既能减低调用服务之间的耦合,又能成为调用之间的缓冲,确保消息积压不会冲垮被调用方,同时能 保证调用方的服务体验,继续干自己该干的活,不至于被后台性能拖慢。同时,对于开发同学,有这么多的中间件和强大的PE支持固然是好事,我们也需要深入去了解这些中间件背后的原理,知其然知其所以然,设想下,如果我们是一个小公司的CTO,离开的阿里的大环境,在有限的技术资源如何通过开源技术实施微服务?

2025-06-26 10:44:26 651

原创 Java中单例模式的正确实现方法

如果发生了 1-3-2 的情况,线程 1 首先执行新建实例的第一步,也就是分配单例对象的内存空间,然后线程 1 因为被重排序,所以去执行了新建实例的第三步,也就是把 singleton 指向之前的内存地址,在这之后对象不是 null,可是这时第 2 步并没有执行。这种写法的优点在于,只有在 getInstance 方法被调用的时候,才会去进行实例化,所以不会造成资源浪费,但是在创建的过程中,并没有考虑到线程安全问题,如果有两个线程同时执行 getInstance 方法,就可能会创建多个实例。

2025-06-26 10:36:21 737

原创 SpringBoot详解(一):快速入门

目前ssm框架还是比较常用的,其中的ss指的无非就是Spring 和 SpringMVC,我们可以简单的认为 "Spring Boot ≥ Spring + SpringMVC",没错,用了Spring Boot中涵盖了Spring和SpringMVC等大量常用开发配置,而且Spring Boot的配置极其简单,可以让你不用或者只需要很少的Spring配置就可以让你的项目快速运行起来。

2025-06-26 10:32:02 638

原创 Spring Boot:入门教程篇

咱们刚才说了,SpringBoot是使用maven(注:也可以使用Gradle)的方式对Spring应用开发进行进一步的封装和简化。所以咱们在学习SpringBoot前需要学习Maven,而在练习前咱们会创建多个练习demo,因此,在这里需要先进行Maven父子模块讲解(已经了解Maven父子模块可以忽略本章)咱们以后可能会遇到一个项目多个环境(开发,测试,上线等),为不同的环境会写一些不同的配置,那么就需要咱们做相应的环境之间的切换。咱们创建一个新的模块进行测试,下面为核心代码(基础代码此处省略)

2025-06-26 09:37:41 1151

原创 Java程序员快速掌握Spring Boot:16条实战精华必读指南

如果你正在使用新的WebFlux风格的Spring Boot应用程序,我已经解释了它在“Spring’s WebFlux/Reactor Parallelism and Backpressure”中是如何工作的。由于存在Spring Boot最佳实践,因此你应该考虑将Spring Cloud Contract用于你的消费者驱动契约,它将使你与其他服务的集成更容易使用。Spring Initializr提供了一个超级简单的方法来创建一个新的Spring Boot项目,并根据你的需要来加载可能使用到的依赖。

2025-06-25 10:58:49 540

原创 【无标题】

所以私聊接口在收到消息后需要查询到接收者所在的 cim-server 实例信息,后续的步骤就和群聊一致了。利用 userID 作为 key ,重复的登录就会写入失败。部署 cim-server,这是真正的 IM 服务器,为了满足性能需求所以支持水平扩展,只需要注册到同一个 Zookeeper 即可。这里使用的是 Guava 的 cache,它基于 ConcurrentHashMap,所以可以保证清除、新增缓存的原子性。所以所有的客户端会根据之前的轮询算法分配到不同的 cim-server 实例中。

2025-06-25 10:47:04 892

原创 有关Sharding-JDBC的一些研究!

如上图分别是三个数据库中的user表,其中master-user为database0数据库中的user表,salve-user1为database1中的user表,salve-user2为database2中的user表。主键冲突了,其实这是由于插入的时候使用的database0,但是查询使用的是database1和database2,但是我在从库内并没有ID是100的数据,所以JPA判定我为插入,但是数据库内缺有这样的数据。主库进行增删改操作,从库进行查询操作,如下图为本文数据库的三个表。

2025-06-25 10:39:17 841

原创 SpringBoot整合Sharding-JDBC实现读写分离实战指南

本文还是基于当当网Sharding-Jdbc的依赖这里需要特殊介绍的是,使用Sharding-JDBC进行读写分离的时候,只允许设置一个主库,从库的话可以设置多个,访问策略的话从源码上看只有两种轮询(ROUND_ROBIN)和随机(RANDOM)。

2025-06-25 10:28:48 1010

原创 面试必看!程序员简历编写详尽指南

即使不是你做的功能模块或者解决的问题,你只要搞懂吃透了就能拿来自己用,适当润色即可!像性能优化方向上的亮点面试之前也比较容易准备,但也不要都是性能优化相关的,这种也算是一个极端。

2025-06-25 10:18:35 786

原创 Docker入门指南:基础介绍与安装教程

Docker 是一个开源的容器引擎,可将应用程序和基础设施隔离,并能将基础设施当做程序一样进行管理,使用 Docker 可以更快的打包、测试以及部署应用程序,甚至可以再 Docker 中运行一个 Linux 系统镜像,它就像一个仿真操作系统Docker 适用场景:测试:Docker 很适用于测试发布,将 Docker 封装后可以直接给测试人员运行,不在需要测试人员与运维、开发进行配合部署开发:开发人员共用一个 Docker 镜像,同时修改的源代码都被挂载到本地磁盘,不再因为环境的不同而伤脑筋。

2025-06-25 10:11:53 914

原创 Docker:Docker file常用指令详解

docker run 命令在创建容器时,会检查本地是否存在指定镜像,如果不存在则从 Docker Hub 下载并启动。

2025-06-25 10:05:17 535

原创 Dockerfile常用指令:容器构建的核心指南

Dockerfile。

2025-06-25 10:03:13 939

原创 Docker镜像构建:容器化应用的基石

【代码】Docker镜像构建:容器化应用的基石。

2025-06-25 10:00:51 235

原创 Docker 专题:使用 Maven 插件构建 Docker 镜像

在云原生时代,Docker 已成为应用容器化的核心工具,而镜像构建则是部署流程的关键环节。传统构建方式常需手动操作 Dockerfile 和命令行,既繁琐又易出错——尤其当 Java 项目频繁迭代时,开发者不得不在 Maven 构建与容器化步骤间反复切换。

2025-06-25 09:59:04 321

原创 Docker Compose 详解:容器编排的利器

前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具。

2025-06-25 09:56:07 710

原创 Docker镜像仓库:公有DockerHub与私有Registry的深度解析

【代码】Docker镜像仓库:公有DockerHub与私有Registry的深度解析。

2025-06-25 09:49:30 368

原创 数据结构(十二):快速排序的基本概念

【代码】数据结构(十二):快速排序的基本概念。

2025-06-24 14:14:14 250

原创 数据结构(11):归并排序的基本概念!

【代码】数据结构(11):归并排序的基本概念!

2025-06-24 14:11:07 207

原创 数据结构第十讲:直接插入排序

链接:https://www.jianshu.com/p/d62acb671366。商业转载请联系作者获得授权,非商业转载请注明出处。

2025-06-24 14:07:48 118

原创 数据结构第九讲:选择排序(基础版)

第二趟排序:比较 { 2 8 4 9 5 },2 最小,已在最后一位,位置不变。第三趟排序:比较 { 8 4 9 5 },4 最小,4 和 8 互换位置。

2025-06-24 14:05:49 106

原创 数据结构(八):冒泡排序是什么?

【代码】数据结构(八):冒泡排序是什么?

2025-06-24 13:59:51 158

原创 数据结构(七):二叉树的核心概念

二叉树是 n (n >= 0)个节点的有限集合,该集合或者为空集(称为空二叉树)或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树的二叉树组成图1折半规律很适合作为二叉树建模图2二叉树特点每个节点最多有两棵子树左子树和右子树是有顺序的,次序不能任意颠倒即使树中某节点只有一棵子树也要区分它是左子树还是右子树特殊二叉树斜树:所有的节点都只有左子树的二叉树叫做左斜树,反之右斜树满二叉树:所有分支节点都存在左子树和右子树,并且所有叶子都在同一层上满二叉树完全二叉树。

2025-06-24 13:57:00 944

原创 数据结构(六):树 的基本概念

1. 树的定义树是 n ( n >= 0 ) 个结点的有限集,n = 0 时称为空树任意一棵非空树中,有且仅有一个根结点当 n > 1 时,其余结点分为 m(m > 0)个互不相交的有限集P6Z2d.png2. 结点概念结点:树的结点包含一个数据元素及若干个指向子树的分支结点的度:结点拥有的子树叶子结点:度为 0 的结点分支结点:度不为 0 的结点内部结点:除根结点以外,分支结点也称为内部结点树的度:树内各结点的度的最大值树的深度:树中结点最大层次称为树的深度。

2025-06-24 13:43:19 586

原创 数据结构(五):字符串

y4ABu.pngPtj9X.pngPtGOl.png

2025-06-24 13:39:44 908

原创 数据结构(四):队列的循环实现与链式实现

为了解决假溢出,可以把队列头尾相接,rear 可以指向下标为 0 的位置(当下标超过数组最大长度时,指向下标 0)但可能会出现rear与front指针重合情况,无法判断队列是空还是满yjBk2.png解决办法:设置一个flag,flag = 0 时队列为空,flag = 1 时队列满保留一个元素空间,当队列满时,还有一个空闲单元yjTsz.png。

2025-06-24 13:35:06 826

原创 栈:数据结构第三讲

最先进栈的不一定最后出栈,如有3个整形数字元素1、2、3依次进栈,会有以下几个出栈顺序:第一种:1、2、3 进,再 3、2、1 出,出栈顺序为 321第二种:1进,1出,2进,2出,3进,3出,出栈顺序为 123第三种:1进、2进,2出,1出,3进,3出,出栈顺序为 213第四种:1进,1出,2进,3进,3出,2出,出栈顺序为 132第五种:1进、2进、2出、3进、3出,1出,出栈顺序为 231。

2025-06-24 11:20:03 402

原创 算法基础:数据结构(二):线性表、循环链表和双向链表

用一段地址连续的存储单元依次存储线性表的数据元素,构成顺序存储需要三个属性:地址计算方法: yFykN.png yFaBu.pngyFCqO.md.pngyFLdq.md.pngyY60A.pngyQHBd.md.pngyQBke.md.pn

2025-06-24 10:52:06 1037

原创 数据结构(一):结构概念、算法概念与时间复杂度分析

【代码】数据结构(一):结构概念、算法概念与时间复杂度分析。

2025-06-24 10:46:12 673

原创 Java多线程系列第十讲:DelayQueue、PriorityBlockingQueue与SynchronousQueue解析

在多线程编程领域,高效的任务调度与线程协作是实现高性能系统的核心。基于优先级堆实现的无界队列,元素只有在其指定的延迟时间耗尽后才能被取出。这种特性使其成为定时任务调度、会话管理等场景的理想选择,完美解决了"何时执行"的时间控制问题。支持优先级排序的无界阻塞队列,通过Comparable接口或自定义比较器实现元素的动态排序。当资源分配需要按紧急程度处理时(如VIP用户请求优先),其自动重排序机制展现出强大优势。一种不存储元素的特殊队列,每个插入操作必须等待对应的移除操作。

2025-06-22 16:47:00 303

原创 Java 多线程(九):ArrayBlockingQueue与LinkedBlockingQueue对比解析

阻塞队列与我们平常接触到的普通队列(ArrayList)的最大不同点在于阻塞队列的添加和删除方法都是阻塞的阻塞添加:当阻塞队列元素已满时,队列会阻塞加入元素的线程,直到队列元素不满时才重新唤醒线程执行元素加入操作阻塞删除:当队列元素为空时,删除队列元素的线程将被阻塞,直到队列不为空再执行删除操作。

2025-06-22 16:44:23 961

原创 Java并发编程(八):深入解析Atomic包

Atomic 包是 JDK5 之后提供的,这个包提供了一系列原子类,这些类允许在多线程环境下,无锁的进行原子操作(当某个线程在执行 Atomic 方法时不会被其它线程打断,其它线程会一直等到该方法执行完成)Atomic 底层是借助 CPU 的 CAS 指令来实现的。

2025-06-22 16:38:03 635

原创 Java 多线程(七):Executor 线程池框架深度解析

【代码】Java 多线程(七):Executor 线程池框架深度解析。

2025-06-22 16:10:29 601

原创 Java多线程系列(六):深入解析ReentrantLock与Condition

2025-06-22 16:05:44 226

原创 Java 多线程(五):ThreadLocal 专题深度解析讲解

【代码】Java 多线程(五):ThreadLocal 专题深度解析讲解。

2025-06-22 16:02:58 453

原创 Java 多线程(三):Callable、Future、FutureTask

在并发编程中,创建异步任务通常使用Runnable且。这种设计使得复杂任务的执行结果获取变得繁琐,开发者不得不通过共享变量或回调机制间接处理结果,既降低了效率又增加了代码复杂度。为突破这一限制,Java 5 引入了RunnableFuture这三者共同构建了:从任务定义(Callable)→ 任务提交(FutureTask)→ 结果追踪(Future)。通过将与解耦,开发者能以同步编码风格实现异步操作,大幅提升多线程程序的健壮性与可维护性。

2025-06-22 16:00:06 631

原创 Java多线程(二):内存架构与同步机制详解(Synchronized、Volatile、ReentrantLock)

在现代软件开发中,多线程技术是提升程序性能的核心手段。然而,当多个线程共享数据时,我们面临着和三大挑战。为解决这些问题,Java 定义了——一套规范多线程环境下变量访问规则的抽象框架。JMM 的核心思想是通过 happens-beforevolatile。

2025-06-22 15:57:00 877

原创 多线程基础详解(一)

多线程是指一个进程(执行中的程序)同时运行多个线程(进程中负责程序执行的执行单元),多线程可以协作完成进程工作,其目的是更好的利用 CPU 资源。

2025-06-22 15:51:13 838

原创 Java 多线程(三):Synchronized机制深度解析

实现对临界区的互斥访问,确保同一时刻仅有一个线程能执行受保护的代码块或方法。正是Java为解决此类问题提供的核心同步机制。

2025-06-22 15:46:36 185

原创 SpringBoot单元测试及Mockito应用实践

如果不需要对静态方法,私有方法等特殊进行验证测试,则仅仅使用 Spring boot 自带的 Mockito 即可完成相关的测试数据 Mock。而在单元测试 AIR 原则中,单元测试应该是可以重复执行的,不应受到外界环境的影响的。:执行一个 RequestBuilder 请求,返回一个 ResultActions 实例对象,可对请求结果进行期望与其它操作。Mock 不是真实的对象,它只是创建了一个虚拟对象,并可以设置对象行为。,结合 Hamcrest 提供的匹配符,就可以表达全部的测试思想。

2025-06-22 15:34:18 816

原创 数据结构(五):串的基本概念!

串(String)是由零个或多个字符组成的有限序列,又名字符串,一般记为 s = "a1a2...an"串中任意个数的连续字符组成的子序列称之为该串的子串,例如 "over" 是 "lover" 的子串。

2025-06-20 14:05:56 677

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除