自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(2302)
  • 资源 (1)
  • 收藏
  • 关注

转载 服务端高并发分布式架构演进之路

1. 概述本文以淘宝作为例子,介绍从一百个到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则。特别说明:本文以淘宝为例仅仅是为了便于说明演进过程可能遇到的问题,并非是淘宝真正的技术演进路径2. 基本概念在介绍架构之前,为了避免部分读者对架构设计中的一些概念不了解,下面对几个最基础的概念进行介绍:分布式 系统中的多个模块在不同服务器上部署,即可称为分布式系统,如Tomcat和数据库分别部署

2021-05-25 17:47:54 444

转载 警惕软件复杂度困局

简介:对于大型的软件系统如互联网分布式应用或企业级软件,为何我们常常会陷入复杂度陷阱?如何识别复杂度增长的因素?在代码开发以及演进的过程中需要遵循哪些原则?本文将分享阿里研究员谷朴关于软件复杂度的思考:什么是复杂度、复杂度是如何产生的以及解决的思路。较长,同学们可收藏后再看。写在前面软件设计和实现的本质是工程师相互通过“写作”来交流一些包含丰富细节的抽象概念并且不断迭代过程。另外,如果你的代码生存期一般不超过6个月,本文用处不大。一 软件架构的核心挑战是快速增长的复杂性越是...

2021-05-19 18:17:58 632

转载 常见代码重构技巧,非常实用

关于重构为什么要重构项目在不断演进过程中,代码不停地在堆砌。如果没有人为代码的质量负责,代码总是会往越来越混乱的方向演进。当混乱到一定程度之后,量变引起质变,项目的维护成本已经高过重新开发一套新代码的成本,想要再去重构,已经没有人能做到了。造成这样的原因往往有以下几点:编码之前缺乏有效的设计 成本上的考虑,在原功能堆砌式编程 缺乏有效代码质量监督机制对于此类问题,业界已有有很好的解决思路:通过持续不断的重构将代码中的“坏味道”清除掉。什么是重构重构一书的作者Martin..

2021-05-13 10:01:52 869

转载 JAVA线上故障排查全套路

线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top 三连,然后依次jstack、jmap伺候,具体问题具体分析即可。一、CPU一般来讲我们首先会排查cpu方面的问题。cpu异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的,可以使用js

2020-09-22 17:45:24 453

转载 图解+代码|常见限流算法以及限流在单机分布式场景下的思考

大家好,我是 yes。今天来说说限流的相关内容,包括常见的限流算法、单机限流场景、分布式限流场景以及一些常见限流组件。当然在介绍限流算法和具体场景之前我们先得明确什么是限流,为什么要限流?。任何技术都要搞清它的来源,技术的产生来自痛点,明确痛点我们才能抓住关键对症下药。限流是什么?首先来解释下什么是限流?在日常生活中限流很常见,例如去有些景区玩,每天售卖的门票数是有限的,例如 2000 张,即每天最多只有 2000 个人能进去游玩。题外话:我之前看到个新闻,最不想卖门票的景区“

2020-09-22 13:06:08 558

转载 springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理

本文都是springboot的常用和实用功能,话不多说开始吧定时任务1.启动类开启注解@EnableScheduling //开启基于注解的定时任务@MapperScan("com.pdzx.dao")@SpringBootApplicationpublic class VideoApplication { public static void main(String[] args) { SpringApplication.run(VideoApplicatio

2020-08-26 20:22:41 1863

原创 聊聊微服务架构及分布式事务解决方案

分布式事务场景如何设计系统架构及解决数据一致性问题,个人理解最终方案把握以下原则就可以了,那就是:大事务=小事务(原子事务)+异步(消息通知),解决分布式事务的最好办法其实就是不考虑分布式事务,将一个大的业务进行拆分,整个大的业务流程,转化成若干个小的业务流程,然后通过设计补偿流程从而考虑最终一致性。什么是事务事务(Transaction)及其ACID属性事务是由一组SQL语句组成的逻...

2020-04-21 22:34:45 627

转载 Java线程池实现原理及其在美团业务中的实践

随着计算机行业的飞速发展,摩尔定律逐渐失效,多核CPU成为主流。使用多线程并行计算逐渐成为开发人员提升服务器性能的基本武器。J.U.C提供的线程池ThreadPoolExecutor类,帮助开发人员管理线程并方便地执行并行任务。了解并合理使用线程池,是一个开发人员必修的基本功。本文开篇简述线程池概念和用途,接着结合线程池的源码,帮助读者领略线程池的设计思路,最后回归实践,通过案例讲述使用线程...

2020-04-03 14:58:43 682

转载 Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析

一、深入JVM锁机制:synchronizedsynrhronized关键字简洁、清晰、语义明确,因此即使有了Lock接口,使用的还是非常广泛。其应用层的语义是可以把任何一个非null对象作为"锁",当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁...

2020-04-01 16:00:25 569

转载 一文带你理解Java中Lock的实现原理

当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题。java提供了两种方式来加锁,一种是关键字:synchronized,一种是concurrent包下的lock锁。synchronized是java底层支持的,而concurrent包则是jdk实现。关于synchronized的原理可以阅读再有人问你synchronized是什么,就把这篇文章发给他。在这里...

2020-04-01 15:04:40 918

转载 业务复杂=if else?刚来的大神竟然用策略 工厂彻底干掉了他们!

对于业务开发来说,业务逻辑的复杂是必然的,随着业务发展,需求只会越来越复杂,为了考虑到各种各样的情况,代码中不可避免的会出现很多if-else。一旦代码中if-else过多,就会大大的影响其可读性和可维护性。首先可读性,不言而喻,过多的if-else代码和嵌套,会使阅读代码的人很难理解到底是什么意思。尤其是那些没有注释的代码。其次是可维护性,因为if-else特别多,想要新加一个分...

2019-10-24 13:41:06 876

转载 延迟双删如此好用,为何大厂从来不用

本文并非对延迟双删的全盘否定,而是强调在特殊场景下,延迟双删策略的弊端会被放大,进而完全盖过其优势。对于那些业务体量大伴随着流量大的应用系统,必应要从中权衡取舍。每一种策略都仅适配应用系统生命周期的一段。只不过部分企业随着业务发展逐步壮大,其研发基础设施的能力也更完善。从而为系统设计带来诸多便捷,从而使得技术决策变得与中小研发团队截然不同。所以当我们在学习他人经验的过程中,到了落地执行环节一定要结合实际团队背景、业务需求、开发周期与资金预算进行灵活适配。

2025-03-12 23:49:56 89

转载 进阶玩法:策略+责任链+组合实现合同签章

/请求@Data@Builder//响应@Data@Builder定义流程中的请求及响应类,方便处理每个责任链的请求、返回信息。

2025-03-12 23:43:44 17

转载 MyBatis-Plus优化秘籍:15招让你的代码飞起来

代码如烹小鲜,讲究的是精细和用心。MyBatisPlus的这15个优化技巧,何尝不是程序员对代码的一种尊重和雕琢?掌握这些技巧后,你的代码将不再是简单的指令堆砌,而是一首优雅的诗,一曲悦耳的交响乐。它们将像外婆的羊肉汤一样,散发着独特的魅力,让人回味无穷。愿每一位开发者,都能用MyBatisPlus,煮出属于自己的“秘制汤羹”!

2025-03-12 23:41:03 24

转载 管理者带团队,主要就是管人和管事

管理人和事

2025-03-12 23:39:28 13

原创 时间轮在 Netty , Kafka 中的设计与实现

本文我们主要讨论了定时任务调度相关的主题,笔者一开始介绍了 JDK 的三种调度组件:Timer,DelayQueue,ScheduledThreadPoolExecutor。但他们的共同特点都是采用了小根堆这种数据结构来组织管理定时任务,然而在面对海量定时任务的添加与取消时,这种设计的时间复杂度会比较高 ——O(logn)。随后笔者介绍了 Netty 的单层时间轮 HashedWheelTimer,它将海量定时任务的添加与取消操作的时间复杂度降低到了O(1)

2025-03-12 23:33:07 579

转载 企业架构与DDD

TOGAF(The Open Group Architecture Framework)是一个广泛采用的企业架构(Enterprise Architecture, EA)框架,由开放组(The Open Group)开发和维护。它为组织设计、规划、实施和治理企业信息架构提供了系统化的方法和工具。TOGAF旨在帮助企业通过高效的架构管理,实现业务目标、优化资源利用和增强灵活性。

2025-03-12 23:19:55 168

转载 架构实战——订单系统

外部系统和服务的交互有两种方式,包括同步的服务接口调用和异步的消息通知。(1)同步的服务接口调用为了方便外部调用方,在服务接口命名时,一定要规范和统一,接口名字要能够望文生 义,方便调用者快速找到所需要的接口。并且还要提供接口具体的请求和响应样例帮 助说明。这里说下常见的查询接口是如何设计的。一个订单有很多字段,每次调用方要查询的信息可能都不相同,不同字段之间的组合方式有 很多,不可能一一支持。那么怎么设计查询接口,来满足各种场景需求呢?

2025-03-05 00:52:16 154

转载 Java 实现责任链模式 + 策略模式:优雅处理多级请求的方式

责任链模式(Chain of Responsibility Pattern)是一种行为设计模式,它允许将请求沿着一个处理链传递,直到链中的某个对象处理它。这样,发送者无需知道哪个对象将处理请求,所有的处理对象都可以尝试处理请求或将请求传递给链上的下一个对象。核心思想:将请求的发送者与接收者解耦,通过让多个对象组成一条链,使得请求沿着链传递,直到被处理。// 抽象处理者接口// 设置下一个处理者// 处理请求的方法2. 定义用户请求类// 请求类// 用户类型(普通用户、管理员等)

2025-03-05 00:39:31 38

原创 Quarkus、springboot3.xx深度对比

【代码】Quarkus、springboot3.xx深度对比。

2025-01-24 12:02:26 706

转载 传统Java开发已死?重新定义云原生时代的Java开发!

Quarkus是一个为Java虚拟机(JVM)和原生编译而设计的全栈、Kubernetes原生Java框架。它的出现不仅仅是为了解决Java在云原生环境中的痛点,更是为了重新定义Java开发的方式,让Java在容器化和Serverless的世界中重新焕发生机。"Supersonic"(超音速):指Quarkus极快的启动速度和极低的资源消耗。"Subatomic"(亚原子):暗示了Quarkus极小的内存占用和极致的性能优化。

2025-01-17 13:04:36 75

原创 破局思维陷阱:架构师的决策进化之道

典型案例:某资深架构师坚持使用传统SOA架构改造新零售系统,因为他在金融领域有成功经验。架构师要清醒认识到,决策偏差是普遍存在的,关键是要建立有效的识别和防范机制,在实践中不断完善和进化。某大型企业花费2年打造统一中台,试图建立一套"完美"的技术中台解决方案。过度追求架构的完美性和理论正确性,导致方案脱离实际。过度依赖框架解决问题,导致架构失去灵活性。过度预测未来需求,导致架构过度设计。破局方案:以业务为中心的架构设计。解决之道:场景驱动的技术选型。应对策略:建立客观的决策机制。应对策略:基于约束的设计。

2025-01-17 12:55:16 443

转载 架构师必经之路:从设计模式到架构模式

从设计模式到架构模式的思维跃迁,本质上是一个不断提升抽象层次的过程。好的架构师需要在实践中不断积累和思考,既要掌握具体的设计模式,又要具备宏观的架构思维,才能在复杂系统设计中游刃有余。

2025-01-17 12:50:10 35

转载 架构师必备:MFA 了解一下

在探讨 MFA 之前,我们需要理解身份验证的本质。身份验证是确认某人或某物的身份是否属实的过程。无论是通过密码登录 Gmail,还是刷身份证进入火车站,身份验证的核心都是确保「你是你自称的那个人」。密码过于简单:许多人使用诸如“123456”或“password”这样的弱密码。密码重复使用:用户往往将同一个密码应用于多个网站,一旦一个账户泄露,其它账户也岌岌可危。钓鱼攻击和暴力破解:黑客通过欺骗或技术手段轻易获取用户密码。中间人攻击:在不安全的网络环境中,密码可能被拦截。

2025-01-17 12:42:47 164

转载 K8S重要概念区分:Ingress 和 Service 的异同点

对比点IngressService作用范围管理外部 HTTP/HTTPS 流量,路由到内部的多个服务。提供对单个服务(多个 Pod)的访问方式。协议支持仅支持 HTTP/HTTPS支持多种协议(TCP/UDP/HTTP/HTTPS 等)负载均衡对象在多个服务之间负载均衡。在同一服务的多个 Pod 之间负载均衡。是否必须依赖必须依赖 Ingress Controller 才能生效。独立运行,不依赖额外组件。高级功能支持域名、路径路由、TLS 终止等。

2025-01-17 12:33:20 46

转载 数据脱敏技术

数据脱敏(

2025-01-17 12:27:36 535

转载 架构设计规范

1. 高可用2. 易扩展、易伸缩3. 低成本4. 高性能5. 高安全1. 合适原则/适度超前2. 简单原则3. 演化原则4. 稳定原则5. 容错原则1. 质量要求1. 业务架构设计原则1. 应用架构设计原则2. 应用架构分解原则3. 应用架构依赖原则1. 服务设计原则2. 系统运行时原则3. 系统部署原则1. 数据架构设计原则确保系统能够保护用户数据和系统资源免受未经授权的访问、篡改和破坏。这可能包括访问控制、数据加密、身份验证等安全措施。安全性(Security)规范是设计和构建系统时必不可少的方面,旨在

2025-01-17 11:17:39 173

转载 高级进阶:复杂业务系统的通用架构设计

结合着业务系统的复杂性,如果想要系统未来具有长期价值,不得不把大的系统进行拆分,用统一的业务语言进行描述,把不可识别的问题,拆分成可识别的问题域进行解决,这也就是现在又逐渐盛行起来的领域驱动设计的方法。应用如何进行设计,包括模块如何划分,功能如何实现,技术如何支撑,数据如何展示,流程如何定义,逻辑如何实现,数据如何存储等等,都是应用架构的范畴。架构的本质依然没有改变,只是由于社会的发展,我们的需求,需要处理的问题、依赖愈来愈复杂,我们需要用发展的眼光,时刻追随技术前沿,进而推进、优化、迭代系统的架构设计。

2025-01-15 00:43:36 108

转载 GitLab :将停止对中国区用户提供服务!

根据 GitLab 的官方通知,中国区用户有60天的时间进行迁移,之后账户将被删除。Forgejo 是从 Gitea 分叉出来的项目,提供了更简单的部署和更美观的界面,适合需要自定义开发和社区支持的用户。Gitee 是国内领先的代码托管平台,提供 Git 代码托管、代码审查、项目管理等功能,适合个人和企业用户。作为全球最大的代码托管平台,GitHub 提供了丰富的开源项目和社区支持,适合全球范围内的开发者。阿里云提供的代码托管服务,集成了代码托管、代码质量分析、项目管理等功能,适合企业级用户。

2025-01-15 00:21:25 97

转载 从通用架构走向场景架构

场景架构”的地位提升,往往发生在业务发展到比较成熟的阶段,是业务进入深水区时的认知改变。如果业务本身还没有很复杂,基础建设也还有空间,那也还有很多的通用策略去解决问题,但是这一部分往往属于技术架构、数据架构、应用架构等方面,而业务架构,则没有银弹。回到架构场景上,在相对成熟的公司中,由于基础的建设相对完善,我们现在很难通过一个相对简单和通用的方法解决一大类类似的问题,进而需要进入特定的场景,一步一步地进行场景分析和架构设计,个人认为可以是进入了“场景架构”的时代。不再期待架构中有“神灯”

2025-01-15 00:14:28 17

转载 基于事件驱动的业务规则模型设计

事件驱动的业务规则模型是一种以事件为中心的业务逻辑设计方法。在这种模型中,

2025-01-14 19:13:25 46

转载 应用架构常用模式

应用架构常用模式主要有以下几种。

2025-01-14 17:59:07 76

转载 微服务全链路灰度设计

微服务体系架构中,服务之间的依赖关系错综复杂,有时某个功能发布依赖多个服务同时升级上线。我们希望可以对这些服务的新版本同时进行小流量灰度验证,这就是微服务架构中特有的全链路灰度场景,通过构建从网关到整个后端服务的环境隔离来对多个不同版本的服务进行灰度验证。在发布过程中,我们只需部署服务的灰度版本,流量在调用链路上流转时,由流经的网关、各个中间件以及各个微服务来识别灰度流量,并动态转发至对应服务的灰度版本。如下图:上图可以很好展示这种方案的效果,我们用不同的颜色来表示不同版本的灰度流量,可以看出。

2025-01-14 17:52:32 61

原创 mqtt协议的详细介绍

MQTT(Message Queuing Telemetry Transport)协议是一种基于发布 / 订阅(publish/subscribe)模式的轻量级物联网消息传输协议。

2025-01-06 15:32:02 883

转载 SpringBoot 集成MQTT

MQTT 配置# 用户名# 密码# 推送信息的连接地址,如果有多个,用逗号隔开,如:tcp://127.0.0.1:61613,tcp://192.168.1.61:61613# MQTT 生产者# 连接服务器默认客户端ID# 默认的推送主题,实际可在调用接口时指定# MQTT 消费者# 连接服务器默认客户端ID# 默认的接收主题,可以订阅多个Topic,逗号分隔公司的IOT平台主要采用MQTT(消息队列遥测传输)对底层的驱动做命令下发和数据采集。

2025-01-06 11:43:55 134

转载 什么是MQTT?一文快速了解MQTT基础知识

MQTT,全称为Message Queuing Telemetry Transport(消息队列遥测传输),是一种轻量级的发布-订阅式消息传输协议。它被设计用于在低带宽、不稳定网络环境下进行高效可靠的通信。MQTT适用于各种设备之间的实时数据传输,特别是在物联网(IoT)应用中非常常见。MQTT是一种基于发布/订阅模式的轻量级消息传输协议,适用于物联网等低带宽、高延迟的场景。而RabbitMQ是一个开源。

2025-01-04 16:43:04 470

转载 MQTT协议工作原理

MQTT协议之所以如此受欢迎,主要得益于其独特的设计理念和优势。它采用轻量级的消息传输方式,可以在网络带宽有限的情况下实现高效通信。MQTT协议支持发布/订阅模式,使得设备间可以实现解耦通信,降低了系统的复杂性和耦合度。MQTT协议还提供了丰富的消息类型和控制机制,使得设备间可以实现更加灵活和复杂的通信。实时可靠的消息传输:MQTT协议支持多种QoS(服务质量)等级,可以确保消息的实时性和可靠性。

2025-01-04 15:59:01 77

转载 第三方接口设计方案注意事项

接入开源的Hystrx或sentne框架,配置合理断的值(例如1分钟接口100个报错,断30s),实现超时或接口报错自动熔断,同时跟业务商量给出一个默认兜底值。例如调用大数据客群接口,如果第三方提供的客群接口大量报错或服务超时,为了保护我们自己的系统,框架自动熔断同时返回默认不命中的兜底值;要考虑单次批量调用参数的大小,比如单次传1000个id参数,这个也不行,可能导致接口直接超时,所以要对参数进行分组切割批量调用,比如1000个参,1次100个,分10次调用;无论是自动或手动,都需要配置业务告警。

2025-01-02 17:16:56 39

转载 Java程序中空值/异常最佳实践

其实,对于任何空指针异常的处理,最直白的方式是先判空后操作。如果要先判空后处理,大多数人会想到使用 if-else 代码块。但,这种方式既增加代码量又会降低易读性,我们可以尝试利用 Java 8 的 Optional 类来消除这样的 if-else 逻辑,使用一行代码进行判空和处理。修复思路如下:对于 Integer 的判空,可以使用 Optional.ofNullable 来构造一个 Optional,然后使用 orElse(0) 把 null 替换为默认值再进行 +1 操作。

2025-01-02 17:14:25 66

转载 玩转 MAT 分析内存泄漏

MAT 工具是基于 Eclipse 平台开发的,本身是一个 Java 程序,是一款很好的内存分析工具,所以如果你的堆快照比较大的话,则需要一台内存比较大的分析机器,并给 MAT 本身加大初始内存,这个可以修改安装目录中的 MemoryAnalyzer.ini 文件。可以看到,上手 MAT 工具是有一定门槛的,除了其操作模式,还需要对我们前面介绍的理论知识有深入的理解,比如 GC Roots、各种引用级别等。如果不能通过大对象发现问题,则需要对快照进行深入分析。

2025-01-02 15:39:38 537

Java8 新特性.rar

Java8新特性,包含代码实例与技术文档。

2020-03-29

空空如也

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

TA关注的人

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