自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 浅谈Netty中ServerBootstrap服务端源码(含bind全流程)

文章目录一、梳理Java中NIO代码二、Netty服务端代码1、new NioEventLoopGroup()2、group3、channel4、NioServerSocketChannel.class5、childHandler6、bind 一、梳理Java中NIO代码Java中的NIO其本质是网络层面定义中的多路复用IO模型(一定要和NIO模型区分开)。NIO代码主要分为下列几步:初始ServerSocketChannel初始化Selector,完成Selector和Channel的绑

2022-03-27 17:07:41 1799

原创 请不要再说NIO和多路复用IO是同一个东西了(内含BIO、NIO、多路复用、Netty、AIO案例测试代码)

文章目录一、写在最前面1、误区2、IO模型分类3、概念再梳理(重点)二、BIO(Blocking IO)1、客户端2、服务端3、效果展示4、总结三、NIO(NonBlocking IO)1、客户端2、服务端3、效果展示4、总结四、多路复用(Multiplexing)1、客户端2、服务端3、效果展示4、总结五、Netty(基于多路复用IO)1、客户端2、服务端3、效果展示4、总结六、AIO(Asynchronous IO)1、客户端2、服务端3、效果展示4、总结一、写在最前面1、误区在我阅读了网上很多关

2022-03-24 23:41:58 3103 10

原创 浅谈Tomcat的启动流程(源码级别)

文章目录一、启动入口1、startup.sh2、catalina.sh二、基础组件概念梳理1、整体架构2、LifecycleBase抽象类3、实现了LifecycleBase抽象类的子类三、tomcat初始化(init)1、tomcat自定义类加载器四、tomcat加载(load)1、createStartDigester(第2步)1)抽象指定的层级关系2)addObjectCreate3)addRuleSet4)addRule2、getServer().init(第5步)1)JMX2)globalNami

2022-01-23 15:37:29 5635 2

原创 工作常用Linux命令记录

工作常用Linux命令记录

2024-03-30 17:16:56 744

原创 浅谈Spring体系的理解

本文不涉及细节,主要回答两个问题: 1. Spring家族技术生态全景图有哪些 2. Spring Framework架构下每个模块有哪些东西,以及部分模块之间的关联关系

2024-03-30 10:26:35 441

原创 浅谈RPC体系的理解

我们可以明确,类比于其他RPC框架,它们面对的问题、以及要解决的问题都是相同的,只不过不同的框架相关的实现有差异,仅此而已。同时我们不难发现,不同RPC框架经常说的性能问题,其本质也就是①Message Protocol(消息管理层)、②Transfer/Network Protocol(传输管理层)、③描述后的URL(描述服务的协议方式)、④Registration Center(注册中心)之间的差异

2024-03-17 23:54:37 1060

原创 浅谈JUC体系的理解

当我们在谈一个技术的时候,不要过多的陷入技术本身,我们需要明白技术是服务业务的。今天的我们需要以一个更为广阔的视角去看待技术,多去看看、思考那些技术细节以外的东西。JUC同理。这部分涉及知识点相对较多,属于是八股文的重灾区。仔细想来,这已经是自己第三次学习JUC知识了,第一次学习如何使用,第二次学习相关八股知识点,那这一次自己要学什么?换句话说就是,这次学习自己能收获什么?常年行走在B端产品里,老实说,使用并发工具的频率并不高。

2024-03-10 17:40:11 766 1

原创 Leetcode 203 移除链表元素

Leetcode 203 移除链表元素

2024-01-29 23:44:26 432

原创 Leetcode 206 反转链表

LeetCode 206 反转链表

2024-01-29 21:59:24 434

原创 Leetcode 206 反转链表

LeetCode 206 反转链表

2024-01-28 22:00:25 492

原创 常见递归算法题目整理

内含阶乘、二分查找、反转字符串、斐波那契数列、汉诺塔、杨辉三角题目

2024-01-28 17:51:54 552

原创 技术方案——参考模板

开发中常见案例就是,开发任务进行到一半,发现之前技术方案中的做法有问题,于是推翻重来,这是我们都不愿意看到的。当然根据我在实际工作中的观察,如果需求影响面很大,基本都无法难盘点到每一个影响点,那问题就变成了如何尽可能多的盘点。本文亦在分享一个基础版的技术方案模板,让大家在编写技术方案时,能够在一个相对完整的方案流程中,根据自身团队及业务需求的特性,快速上手,提高编写技术方案效率,最终形成自己编写技术方案的方法论

2024-01-21 16:58:09 1687

原创 五种List集合的简单实现

本文是对不同形式List集合的增删改查实现,仅是对学习过程进行记录。

2024-01-21 15:35:31 461

原创 二分查找算法

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功

2024-01-14 22:51:07 478

原创 递归、非递归、宽度遍历二叉树

本文只要记录使用三种不同的二叉树遍历形式。递归遍历、非递归遍历对二叉树分别进行前序遍历、中序遍历、后序遍历,以及利用队列完成对二叉树逐层的宽度遍历

2024-01-07 17:45:53 418

原创 献给自己技术成长的第四年

回顾过去的一年,突然意识到这一年在技术上并没有太多的突破,那些让自己有感触的成长都集中在了思考工作、汇报工作上。不知道是加班太多,还是危机感不足,自己这一年的状态极其不稳定,最终导致技术的成长十分缓慢。但好歹也是一年时间,相比于一年前,自己还是有很多变化,只是变化没有前些年那么大罢了不断学习方法论。

2024-01-02 00:10:11 844

原创 浅谈Dubbo核心概念及架构流程

Dubbo源码主体流程可以总结为:服务提供者将编写的业务Service服务,按照某种协议序列化到注册中心,标记当前服务的网络资源所在的位置;服务消费者根据指定的key(version+interfaceName+group)去注册中心中找到对应的序列化数据,再将数据反序列化为服务消费者能够识别的格式,最终对目标资源发起调用。以此达到我们调用远程服务变成跟调用本地服务一样。整体功能完成的基础上,Dubbo在设计上对扩展开放,一些比较重点的节点都能够进行扩展。

2023-12-24 17:58:46 1429

原创 消息中心常见解决方案分享

看了大部分的消息中心解决方案,发现大家的中心思想都大差不差,区别基本都是在符合自身业务场景的做了一些定制化处理。本文为我对消息中心基本骨架的知识梳理,亦在帮助大家对消息中心设计有一个基本的理解。

2023-11-13 00:24:15 340

原创 软件架构的可维护性指标——代码圈复杂度

软件架构是软件开发和维护过程中的一个重要制品,是软件需求和设计、实现之间的桥梁。软件架构的开发和维护是基于架构软件软件生命周期中的重要环节,与之相关的步骤包括导出架构需求、架构开发、架构文档化、架构分析、架构实现和架构维护。软件架构的维护与演化密不可分,维护需要对软件架构的演化过程进行追踪和控制,以保障软件架构的演化过程能够满足需求(亦有说法将架构维护作为架构演化的一个部分)那么如何衡量软件架构的可维护性呢?官方给出了六个指标。

2023-11-12 17:48:14 388

原创 系统架构设计师考试——论文模板参考(900字)

本文以我参与的某公司xx项目为例,论述了xx(论文题目要求)。该项目的目标是xx(产品能力),实现xx(主要功能),包括xx(辅助功能)。在此项目中,我作为系统分析师及主要管理人员,主导了该项目的系统分 析和设计等工作。在项目系统的xx(点题),采用xx(题目技术点说明),实现了xx(技术点带来的价值),保证了业主方对于项目各项功能和质量指标的实现,项目最终取得了成功。

2023-09-03 18:48:02 1152

原创 《系统架构设计师教程》重点章节思维导图

内容来自《系统架构设计师教程》,筛选系统架构设计师考试中分值重点分布的章节,根据章节的内容整理出相关思维导图。

2023-08-12 18:27:47 1101

原创 《微服务架构设计模式》第十三章 微服务架构的重构策略

在迁移到微服务架构之前,确保你的软件交付问题是由于业务需求超出单体架构承载能力而导致的。在架构重构之前,你可以通过改进软件开发过程来加速交付。通过逐步开发一个绞杀者应用程序来迁移到微服务非常重要。绞杀者应用程序是一个新的应用程序,由围绕现有单体应用构建的微服务组成。你应该尽早并经常证明自己的价值,以确保业务团队支持迁移工作。将微服务引入架构的一个好方法是将新功能作为服务实现。这样做可以使你使用现代技术和开发过程快速轻松地开发功能。这是快速展示迁移到微服务价值的好方法。

2023-07-16 16:38:21 1306 2

原创 《微服务架构设计模式》第十二章 部署微服务应用

要在计算机上部署Restaurant Service,首先要安装必要的运行时环境,在本例中为JDK。如果它是WAR文件,则还需要安装Web容器,例如Apache Tomcat。配置完计算机后,将程序发布包复制到计算机并启动该服务。每个服务实例都作为JVM进程运行。理想情况下,你已经设置好部署流水线,它会自动将服务部署到生产环境。部署流水线构建可执行的JAR文件或WAR文件。然后,它调用生产环境的服务管理接口来部署新版本。

2023-07-16 15:17:53 491

原创 《微服务架构设计模式》第十一章 开发面向生产环境的微服务应用

身份验证:验证尝试访问应用程序的应用程序或人员(安全的术语叫主体)的身份。例如,应用程序通常会验证访问主体的凭据,例如用户的ID和密码,或应用程序的API密钥。访问授权:验证是否允许访问主体对指定数据完成请求的操作。应用程序通常使用基于角色的安全性和访问控制列表(ACL)的组合。基于角色的安全性为每个用户分配一个或多个角色,授予他们调用特定操作的权限。ACL授予用户或角色对特定业务对象或聚合执行操作的权限。审计:跟踪用户在应用中执行的所有操作,以便检测安全问题,帮助客户实现并强制执行合规性。

2023-07-16 12:11:39 421

原创 《微服务架构设计模式》第八章 外部API模式

其实就是抽一层,将前端的组合逻辑抽到统一的一层,这一层就是API Gateway层API Gateway负责请求路由、API组合和协议转换。来自外部客户端的所有API请求首先转到APl Gateway,后者将一些请求路由到相应的服务。API Gateway使用API组合模式处理其他请求,调用多个服务并聚合结果。它还可以在客户端友好的协议(如HTTP和WebSockets)与客户端不友好的协议之间进行转换。API组合:API Gateway通常不仅仅是简单地扮演反向代理的角色。

2023-07-16 10:55:34 412

原创 TaskExecutor和ExecutorService的简单整合

自己负责的项目想通过引入一个中间件,达到在业务场景维度的全链路日志监控。当接入相关中间件后,发现如果在业务中开启了多线程,链路日志就会缺失。当然,该中间件官方给出了解决办法,那就是使用中间件提供的工具类对线程池包装一下(TrackTraceHelper.wrappedExecutorService(executorService))就可以解决。当然这个问题确实解决了,但我们还存在以下几个问题:问题一:项目原本使用的线程池是Spring的ThreadPoolTaskExecutor,在其setTaskDe

2023-07-15 23:57:05 1034

原创 《微服务架构设计模式》第七章 在微服务架构中实现查询

这是最简单的方法,应尽可能使用。它的工作原理是让拥有数据的服务的客户端负责调用服务,并组合服务返回的查询结果,实现从多个服务检索数据的查询。它将持久化数据模型和使用数据的模块分为两部分:命令端和查询端。命令端模块和数据模型实现创建、更新和删除操作(缩写为CUD,例如:HTTP POST、PUT和DELETE)。查询端模块和数据模型实现查询(例如HTTP GET)。查询端通过订阅命令端发布的事件,使其数据模型与命令端数据模型保持同步。实现从多个服务检索数据的查询具有挑战性,因为每个服务的数据都是私有的。

2023-07-11 23:49:42 397 1

原创 《微服务架构设计模式》第六章 使用事件溯源开发业务逻辑

事件溯源是一种以事件为中心的技术,用于实现业务逻辑和聚合的持久化。聚合作为一系列事件存储在数据库中。每个事件代表聚合的状态变化。聚合的业务逻辑围绕生成和使用这些事件的要求而构建。1、事件溯源通过事件来持久化聚合将聚合的字段映射到数据库表的列,将聚合的实例映射到数据库表的行。事件溯源采用基于领域事件的概念来实现聚合的持久化,这是一种非同寻常的方法。它将每个聚合持久化为数据库中的一系列事件,我们称之为事件存储。2、事件代表状态的改变使用事件溯源时,事件不再是可有可无的。

2023-07-11 23:13:18 359

原创 《微服务架构设计模式》第五章 微服务架构中的业务逻辑设计

在领域驱动设计的上下文中,领域事件是聚合发生的事情。它由领域模型中的一个类表示。事件通常代表状态的变化。即,聚合在被创建时,或发生其他重大更改时发布领域事件。在命名领域事件时,我们往往选择动词的过去分词。这样的命名能够明确表达事件的一些属性。领域事件的每个属性都是原始值或值对象。例如,Ordercreated事件类具有orderId属性。即事件包含的数据是事件的简化内容,如id。还是接受方需要的事件内容信息虽然事件增强简化了接收方,但缺点是它可能会使领域事件的稳定性降低。

2023-07-09 23:56:16 357

原创 《微服务架构设计模式》第四章 使用Saga管理事务

某些系统操作需要更新分散在多个服务中的数据。传统的基于XA/2PC的分布式事务不适合现代应用。更好的方法是使用Saga模式。Saga是使用消息机制协调的一组本地事务序列。每个本地事务都在单个服务中更新数据。由于每个本地事务都会提交更改,因此如果由于违反业务规则而导致Saga必须回滚,则必须执行补偿事务以显式撤销更改。可以使用协同或编排来协调Saga的步骤。在基于协同的Saga 中,本地事务发布触发其他参与方执行本地事务的事件**。

2023-07-02 23:39:57 455 1

原创 《微服务架构设计模式》第三章 微服务架构中的进程间通信

有很多进程间通信技术可供开发者选择。服务可以使用基于同步请求/响应的通信机制,例如HTTP REST或gRPC。另外,也可以使用异步的基于消息的通信机制,比如AMQP或STOMP。消息的格式也不尽相同。服务可以使用具备可读性的格式,比如基于文本的JSON或XML。也可以使用更加高效的、基于二进制的Avro或Protocol Buffers 格式。客户端和服务端的交互方式可以分为两个不同的维度维度一:一对一、一对多维度二:同步模式、异步模式一对一一对多同步模式请求/响应无异步模式。

2023-06-17 17:59:22 1326 2

原创 《微服务架构设计模式》第二章 服务的拆分策略

我们需要拿到领域专家或者现有应用的需求文档。跟所有的软件开发一样,定义架构也是一项艺术而非技术。定义应用程序架构的三步式流程。但我们也需要名单,世界上没有一个机械化的流程可以遵循,然后指望这个流程输出一个合理的架构。我们只能介绍一个大概的方法,现实世界中,这是一个不断迭代和持续创新的过程。应用程序是用来处理客户端请求的,因此定义其架构的第一步是将应用程序的需求提炼为各种关键请求。但是,不是根据特定的进程间通信技术(如REST或消息)来描述这些请求,而是使用更抽象的系统操作这个概念。

2023-06-17 12:36:47 1258

原创 《微服务架构设计模式》第一章 逃离单体地狱

microservice用来指代微服务这类架构设计风格,而构成微服务架构的是每一个具体的实例,是service(服务)。所以我们应该说,“这个系统采用了微服务架构设计,由若干个服务构成”。这里借助了Martin Abbott和Michael Fisher的名著《The Art of Scalability》 的启发,该书中描述了一个三维可扩展模型:“扩展立方体”,这个模型描述了一个应用程序的三个维度X轴扩展:在多个实例之间实现请求的负载均衡。

2023-06-03 22:30:53 627 4

原创 String、Date、LocalDate之间的转换,这一篇就够了!!!

工作最近用到了大量的日期转换,特做此总结

2023-05-31 23:50:05 5282

原创 Kubernetes

Kubernetes学习内容大纲。

2023-05-21 11:36:13 75

原创 Docker

Docker学习涉及内容,大纲参考尚硅谷

2023-05-04 15:17:10 485

原创 浅谈全局视角下的设计模式

我在前期学习设计模式的过程中,总都会陷入代码的设计细节,总想理性的区别出不同设计模式在方法、类和接口上的继承、组合和实现等关联关系,最终发现很多设计模式在代码风格上极为相似。当然,今天的我也并非否定曾经的自己,我认为学习一个东西,从0到1总会经历一个过程,在不断深入研究学习的基础上,不同阶段对同一个事物总会有新的认识,没有曾经那些不妥当的认识和理解,学习又怎会让我们感受到成长的快乐?

2023-04-09 18:48:57 426 3

原创 《代码整洁之道》读书笔记

我们总说书上写的是死的,但人是活的,不要死读书。但在我看来,灵活使用的前提是你的知识储备已经具备了灵活掌握的程度,断然不是遇到别人引用书中的话语,并且这是一个我们没见过,且与我们认知有些违背,我们就说别人是死读书。这句话像极了对别人掌握知识的蔑视,我们都应该清楚的认识到,事物发展都需要过程。这一切的一切得结合时代、结合双方的认知程度等众多因素才能做出结论,不过当下我认为最好的状态,还是只对过程进行阐述,不下结论,《代码整洁之道》书中的观点亦是如此。

2023-04-01 18:08:21 432

原创 《重构:改善既有代码的设计》读书笔记

我们总是说自己的项目历史代码太多,是个屎山。自己也深度思考过这个问题,什么样的代码才能定义为屎山(不能怪业务太复杂吧)?到底是自己理解能力不行还是确实代码写的烂(肯定不愿意都是自己的问题)?或者说自己写的代码其实也是屎山,不理解只是因为一坨屎不认识另一坨屎罢了,这很正常(亲生经历过这种场景)。“我本可以忍受黑暗,如果我未曾见过光明”,看到好代码,内心是愉悦的(特别是写好代码的人天天和自己一起吃饭,只能感慨——牛哇牛哇)说不出具体好的逻辑,但内心就觉得这个是好东西(应该是编码的细节)。

2023-03-25 19:06:42 726

原创 浅谈Spring中事务管理器

由于事务部分代码在设计上整体比较简单,我自己觉得它在设计上没有什么特别让我眼前一亮的东西,所以下文更多的是侧重执行流程,能理解事务管理器等一众概念以及相关的变量含义,真正遇到Bug会调试,知道在什么地方打断点就行。后文更多的是代码+注释的形式呈现(注意,而且根据Spring的不同版本,代码实现上也略有差异),请配合自己项目源码慢慢食用。

2023-02-19 21:35:34 917

空空如也

空空如也

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

TA关注的人

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