自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

蜜糖的代码注释

记录架构学习之路。

  • 博客(31)
  • 资源 (1)
  • 收藏
  • 关注

原创 如何保持系统的整洁

自顶向下设计当我们开发或者重构一个软件系统时,需要进行很多框架、中间件上的选型。这些选型的粒度有大有小,解决其中一种或几种系统问题。而我们正是通过将这些框架、中间件进行搭配、组合来完成一个系统的骨骼。如果把软件系统开发比喻成建造一个城市的话,那么对框架与中间件的选择,则对应各种城市的各种职能设施与其建设的配置。我们需要评估我们的需求,然后选择在最合适的位置上摆放最合适的设施,从而用最低的代价满足我们的需求。城市不是只有市长一个人管理,它有职责上的划分:教育、医疗、交通;也有地域上的划分:区、街道

2022-03-11 08:00:00 508

原创 理解Restful风格

REST是什么REST从2000年被Roy Fielding提出距今已有20多年,其对Web技术产生了深远的影响。REST本身并没有产生新的技术或者中间件,REST传递的是一种设计思想,其提供了一种约束原则和条件。REST全称为Representational State Transfer,中文为表征性状态转移,感觉前面其实还少了一个主语“资源”,个人理解应该是“资源表征性状态转移”。而其核心就是通过创造一种资源的定义与描述原则,形成一种标准化规范,从而减少技术人员在开发与沟通时候的成本。实现R

2022-03-10 08:00:00 217

原创 了解一下CQRS模式

背景问题简单的需求当我们系统中的数据模型层级较少时,数据模型足够简单时,模型与数据库可以直接进行映射。这种简单数据模型使我们不需要针对其相互关系进行复杂的建模设计,直接在工程中使用经典的三层模型就足以支撑项目需求。对于这种简单系统,过度设计会增加后续维护、重构的成本(并不能保证预设计能完美符合后续需求)。同时,对于简单系统,我们大部分的需求都只涉及其中的少量数据模型逻辑处理。而我们直接对数据模型进行CURD就能满足需求,进而的结论就是:针对简单需求,我们不需要特别区别查询和增删改的程序结

2022-03-06 15:48:48 2744

原创 PostmangRPC功能使用介绍

工具现状对于API调试工具来说近几年国内有不少整合的比较好的工具,比如Apifox、Apipost等。这些工具主打主打功能整合,多种功能集成一步到位,但目前对于协议的多样性则支持得较慢,截止本文写作时间点,其更多类型的支持暂时放到了后续规划中。PostmanPostman作为API调试的老大哥,整体的功能时比较全的,WebSocket(也是BETA)之前就已经支持了。而在最近的几个版本中Postman也提供了gRPC功能的支持。截止本文时间点,Postman最新版本为v9.14.0,所以本文

2022-03-02 08:00:00 809

原创 如何写好一个Java类?

混沌之初在进行程序开发的过程中,我们有时会看到这样的Java类: 有上百个公共方法 单个方法好几百行 整个Java文件几千行 先下结论,这样的类显然是不好的。尽管他勉强能维持当前功能的运行。但实际上它已经无法在进行功能上的扩展了。我们对他能做的只有保守治疗,在危楼上再添砖加瓦。尽管大家都不愿意承认自己是一片混沌的制造者,但实际上每一个巨型类的代码都是由你我亲手或间接缔造的。但是当有一天我们意识到,这个类已经太过巨大,需要进行重构的时候,我们需要一些方法论与准则来帮助

2022-02-28 08:00:00 373

原创 G1 收集器 面向服务端(多CPU)应用的垃圾回收器

垃圾回收器可以说事Java的基石之一,垃圾回收器的实现充满了大量的实现细节,对于一些优化十分具有参考价值。

2022-02-25 08:00:00 369

原创 数据库读写分离如何保证主从一致性?

读写分离当我们的数据库压力主键变大的时候,我们会尝试增加一些从节点来分摊主节点的查询压力。而一般来说,我们是用一主多从的结构来作为读写分离的基本结构。而一般来说我们有两种常用的方法来实现读且分离架构:客户端直接分离这种方式是由客户端,或者我们的微服务直接进行数据库的读写选择。将读库选择路由到主库上进行,将查询路由到从主库上进行。这种方式的优点在于因为是直连所以性能比较高,但是需要由业务团队了解数据库的实例细节,当数据库做调整的时候就需要业务侧同步改造。使用数据中间件代理这种方式是由一层代理层对

2022-02-23 08:00:00 827

原创 了解一下ProtoBuf

序列化与反序列化我们在进行网络通信调用的时候,总是需要将内存的数据块经过序列化,转换成为一种可以通过网络流进行传输的格式。而这种格式在经过了传输之后再经过序列化,能还原成我们预想中的数据结构。那么我们对于这种用于中间网络传输的数据格式就有一定的要求。首先它可以准确地描述数据内容,在此基础上我们则希望它尽量的小。最开始流行起来的是XML,可扩展标记语言。由于它可以用来标记数据、定义数据类型,所以用户可以自己定义数据自己的语言,从而让对不同的数据结构化成统一的格式称为了可能。而另外一个我们熟知的

2022-02-21 08:00:00 358

原创 为什么需要单元测试?

没有单元测试时的验证在学习编程和业务开发的工程中,我们有一段时间总是在讨论:单元测试是否有用?而进行这种讨论的主要原因是,我们似乎在不使用单元测试的时候,项目也可以跑得很好。小到毕业设计时的内容,大到一个十几人大小的团队。我们设计项目、分析需求,然后根据设计的结果进行代码的编写,然后进行接口或者业务执行上面的测试,让我们知道所编写的代码已经可以完美的完成计划内容后,会请测试同学帮我们进行代码测试,以保证他们确实完成了计划中的内容。最终,代码上线,可喜可贺。看起来没什么不好的,直到最终的问题发生。我们当

2022-02-20 08:00:00 241

原创 用UML来描述领域模型吧

UML统一建模语言的目的是在于提出一种独立于程序实现之外的描述方式,以可视化的方式对对象进行建模。可以用于对产品的描述、文档的编制等。同时因为其使用了严格的图形语意的规范,所以可以保证所有模型提供的信息方式是一致的,便于直接理解和阅读。而对于复杂系统来说,通过对不同层级的系统进行建模。就可以将整个系统的模型描述清晰了。UML建模分为结构图( structure diagrams )和行为图(behavior diagrams)两大类。结构图:结构图主要是为了描述一个系统中的静态结构关系,包含

2022-02-18 08:00:00 686

原创 如何选择充血模型和贫血模型

从领域模型说起回顾一下我们进行领域建模时候的流程:进行需求分析进行用例设计针对用例进行领域建模针对领域模型并行进行数据库设计和程序设计。在经过了前面几步分析后,我们会得到领域模型以及他们之间的关系。在这之后我们要根据领域模型分别进行数据库设计与程序设计。我们会根据领域模型之间的关系将模型之间的关系映射到系统表设计之间的关系。那么我们该怎么进行对应的程序设计呢?一般来说:将领域模型设计转化为程序设计,有贫血模型与充血模型两种方法。贫血模型在之前的文章中我们举过一个订单模型的例子:在

2022-02-16 08:00:00 207

原创 如何优雅的处理错误逻辑

程序的健壮性程序在运行的时候总是不可避免地遇到各种错误。这些错误有一些是包含在原有的逻辑判断中的。而有一些是被程序描述了,但是我们并不认为它是正常逻辑的一部分。不论是什么形式的问题,我们在进行我们预期的业务逻辑编程的同时,不可避免地要为程序的异常进行编程。为了在异常中保护程序的流程的正确性,以至于不会出现“过分”的功能不可用,我们要为了异常编程。从而保证了程序的健壮性。一般来说,如果我们能覆盖系统所有的异常,那么我们的程序就将变得十分的坚不可摧。显然,这时候程序的健壮性就得到了体现。不可放弃的可读性

2022-02-15 08:00:00 210

原创 程序员,如何避免无效会议?

为什么不得不进行会议在一两年之前,我是十分讨厌开会的。我觉得开会所消耗的时间无法与得到的成果成为正比。但是随着工作时间的增长,我逐渐理解到了会议的必要性(尽管很多会议的必要性仍然有待商榷)。以下我列举出几个例子:问题统一处理:由于会议通常是由复数人员参加,所以通常可以将涉及到复数人员的问题在统一时间处理,从而提高处理效率。问题升级仲裁:当你发现所遇到的问题级别已经超出你当前的决策范围时,就需要将问题升级。而该问题升级后将由上一级的委员会在会议中决策进行。高效沟通:由于通讯工具本身具有接收

2022-02-13 08:00:00 173 1

原创 你会写java脚本吗-JShell?

什么是JShell从Java9开始,java中推出了JShell,他是一个交互式的脚本工具。在官方的说明上将其定义为REPL(Read-Eval-Print Loop,读取-求值-输出 循环)工具,他的出现使得Java可以通过一种解释性的方式进行交互。官网介绍地址为:https://docs.oracle.com/javase/9/jshell/introduction-jshell.htm而由于这种读取、求值、输出的特性,使得我们不必像日常进行Java工程项目开发似的进行项目的编译等逻辑,举个

2022-02-11 13:00:12 346

原创 领域模型设计该如何落地到数据库设计?

早期项目设计在比较早期的软件程序设计中,或者说,当软件需求十分简单的时候。我们往往会按照如下的方式进行设计:分析需求文档。根据需求文档中设计到的数据进行库表设计。根据库表设计结合业务,进行程序设计。这样的操作流程是直观的,往往在进行第二步库表设计的时候,对应数据库字段中的内容就是需要展示的“列表”、“详情页“或者”表单“等内容。但是在这样的流程操作加,我们实际上是有两次对需求中的业务数据进行了两次全量分析,第一次是在进行数据库设计的时候,而第二次是在进行程序设计的时候。两次对需求

2022-02-10 08:00:00 919

原创 你使用的是数据结构还是对象?

你编写的是数据结构还是对象写Java的人都会自豪的说我是面向对象编程(或许没有那么自豪)。但我们在实际大型网络项目中进行开发的时候,我们最经常编写的各种对象,他们设计的是否真的妥当。如果你学过C语言的话应该知道,C语言中允许用户自己指定多个数据并用struct关键字将数据组合为一个整体,而称这种数据结构为结构体。,例如定义一个学生信息结构体:struct student{ char name[20]; int age;};我们不难发现因为C语言是面向过程的,结构体中只能有各种数

2022-02-09 09:40:48 482

原创 Java11 特性 - 效能翻倍的 HttpClient

古老的背景从JDK1.1开始,JDK中就有HttpURLConnection来提供了网络连接的能力,但是由于实现的比较古早,其有很多的局限性。比如HttpURLConnection是通过底层提供的socket连接来进行通信,而每一个HttpURLConnection实例只能发送一个请求,之后只能通过close()释放请求的网络资源,或在持久化连接时用disconnect()来关闭关闭底层socket。而其基类URLConnection是为了支持很多协议而设计的,但诸如FTP这种协议已经不咋用了。Http

2022-02-08 13:33:04 1115

原创 了解一下DDD领域驱动设计

为什么需要领域驱动在一个项目的生命周期中,随着项目需求的变动,我们需要不断地改变、扩展项目中软件的功能。在之前的文章《如何阻止软件退化》我们了解到,如果在不改变原有功能框架的前提下,对功能进行直接的添加,那么软件会虽然功能的增加很快就被腐化。这是因为,我们在最开始进行框架设计的时候,是根据最初提出的客观世界规律来设计的,而并没有根据新的、更细节的客观规律进行设计。而为了避免这种腐化,我们需要在进行新的功能开发前,先对原有功能根据新的需求进行结构上的调整,然后在这个基础上在进行新功能的编写,也就是我们的前

2022-02-07 08:00:00 1328

原创 如何写出格式清晰的代码?

代码格式的意义代码是用来描述业务逻辑的表达语言。而代码的格式则是为了更精准地表达业务逻辑。有的人可能会认为,无论多么的难以阅读,只要能完成产品预定的业务逻辑,就是好的代码。我认为这个想法是不对的。主要原因在于,在大型项目和持续维护的过程中,以及其他人在进行backup的时候,比起当时的业务逻辑是否准确,能否让人理解你的意图更加重要。而代码格式便是服务于此:为代码提供额外的上下文信息。尽管当前各种现代IDE提供了方便的格式化操作。但是这种格式化主要是针对一些简单的格式比如: 元素之间的空

2022-02-06 11:05:57 326 2

原创 如何阻止软件退化?

从软件退化说起软件开发行业,尤其是互联网相关行业中,软件工程的首要职责是对于利益点、风口业务的支持与落地。而这两者都是有着与时间相关的属性的。也就是说,同样的一件事,如果没有在正确的时间内做到,那可能也就没有意义了。所以软件行业是一个争分夺秒的行业。那么当真的风口到来时,软件工程的开发是否能快速跟上目标呢?希望总是好的,但是现实是很骨感的。当新的目标出现的时候,你会发现总有那么多的额外逻辑拖慢了脚步。项目工程什么时候是最优秀的时候呢?如果你是一个认真负责的开发人员的话,那么这个答案理应是当这个软

2022-02-05 09:47:36 309

原创 如何写好代码注释?

注释的本质对于代码注释来说,在不同的教程或者原则中有不同的规定或者解释。有的原则是需要使用JavaDoc来描写每个方法,而有的原则是要求每一个属性标注命名。我愿意相信每一份看起来不那么妥当的注释都是出于一些善意的目的,这就是注释的本质:对未能自行解释的代码做出解释。在进行代码工作的时候我们多多少少会有一些陈旧的、与业务无关的逻辑在代码中运行。有时候并不是一个变量名或者一个方法名就能阐述清楚产品同学所期望的业务内容。我们希望将代码外的逻辑也加入到其中,但是一篇长篇大论的注释似乎也不那么妥当,所以对于注释

2022-02-04 10:50:09 576

原创 JDK9响应式流使用详解

上文中咱们简单提到了JDK9中Flow接口中的静态内部类实现了响应式流的JAVA API,并且提供了一个一个Publisher的实现类SubmissionPublisher。本文将先梳理一下接口中具体的处理流程,然后再以几个调用者的例子来帮助大家理解。JDK9中的实现再放上一下上文中的响应式流的交互流程:订阅者向发布者发送订阅请求。发布者根据订阅请求生成令牌发送给订阅者。订阅者根据令牌向发布者发送请求N个数据。发送者根据订阅者的请求数量返回M(M<=N)个数据重复3,4数据发送完毕后

2022-02-03 10:06:08 460

原创 Java响应式编程基础-响应式流

什么是流形象的比喻来说就是如同水一样绵绵不绝的数据形式。而抽象点来说,是有一个生产者(source)产生,由一个或者多个消费者(sink)消费的数据元素(item)序列。那从这个抽象的描述就可以看出,使用流来承担数据交互的模式就是咱们经常说的生产者/消费者模型,而这种模型也可以称之为发布者/订阅者模型(后文将使用这个名字,因为JDK中使用的是这个名字)。对于流数据来说,一般有两种的数据流转方式:拉(pull)数据模式:订阅者向发布者索要数据。推(push)数据模式:发布者向订阅者推送数据(push

2022-02-02 01:40:48 299

原创 JAVA新特性的入场券-函数式接口

从Java8的“新”特性说起说到Java中的函数式编程,就不得不说到Java8中引入的lambda表达式、stream API等特性。它们与函数式接口一起支撑起了Java的函数式编程。函数式编程有较高的可读性与更好扩展性。而也正因为此,在后续版本Java的各种API中,充斥着各种通过函数式接口进行能力扩展的功能。所以,可以说理解函数式接口(编程)是进行后续高级特性学习的第一步。本文将从概念上引入函数式接口的意义,以及着重针对Java8新提供函数式接口进行功能汇总,并不对lambda表达式与stream

2022-01-31 10:11:23 581

原创 如何写好一个Java方法?

什么样的方法才是最好的方法要回答这个问题,我们首先要确定的是我们需要什么样子的方法。无论我们出于什么样子的目的产生对方法的需求,我可以说精准地满足我们需求的方法就是好方法。精准的含义是不过也不少。那么我们需要什么样的方法呢?就我个人的理解而言,我们对于方法的需求源于软件系统本身,系统是为需求服务的,而方法则为系统服务。所以我们的方法是为了更好地实现需求。那么对于项目需求而言,能够满足需求的设计、实现、迭代的方法就是最好的方法。但往往在进行代码开发时候,我们更关注的是功能上线,从而忽略了后续的迭代部分(当

2022-01-30 10:25:41 614

原创 值得学习的Java17新特性——密封类 Sealed Classes

尽管不同语言中的密封类的概念各不相同,但总的来说都是对子类的继承进行了限制,只不过这个继承的限制范围和程度各不一样。

2022-01-29 08:00:00 2504

原创 写了这么多年后端,你知道事务脚本模式吗?

什么是事务脚本模式事务脚本模式(Transaction Script)可以简称TS模式,这个模式本身的核心思想就是名称中的两个词,即:事务与脚本。事务可以理解为实际需要执行的一段原子业务;脚本则是指的一组原子业务的编排方式。而通常来说脚本的编排会直接映射到用户的一个行为动作上。事务脚本本身可以理解是用户动作的一次任务编排,而触发的方式一般直接与用户的行为建立联系。由于使用的是脚本的编排方式,所以事务的组织是面向过程的。而对于事务脚本模式,不同关联用户动作的脚本所编排的事务之间一般是相互隔离的

2022-01-28 08:00:00 1230

原创 为什么需要闭包?闭包是什么概念?

什么是闭包闭包的英文对应的是Closure,如果要单纯的讨论这个概念的话就要提到和图灵机起名的大名鼎鼎的lambda演算(lamdba calculus)。尽管lamdba的概念并不是本文的重点,但是闭包概念的目的便是支持lamdba的实现。如果你单独地在百度对进行搜索闭包的话,你会发现大部分都是js相关的内容,主要是js本身就只用闭包的这个概念。但是闭包并不仅限于js,而是一个通用的概念。借用wiki中有点抽象的定义来说的话,闭包就是:在计算机科学中,闭包(英语:Closure),又称词法闭包(L

2022-01-27 08:00:00 365

原创 全栈工程师?你知道全流程工程师吗?

你是全栈工程师吗?在更早的几年中,你是否经常听到全栈工程师的这个概念。十分仰慕,但是自己可能后端技术或者前端技术还是半吊子的情况下也仅仅是只能对全栈工程师这个概念感到向往。全栈似乎是和大牛画上等号。而在那段时间中,全球的一线国际大厂,如谷歌微软,的招聘岗位中更多地有全栈的这一概念,更有甚者则只有全栈这一岗位。让全栈工程师的这一概念更加的神圣化。但是你有没有思考过这么一个问题,全栈相比一般的前端后端程序员来说,他们有什么样的优势?全栈工程师的优势全栈工程师,我们广义上的理解,一般理解成他对前端、后端、

2022-01-26 09:59:41 227

原创 一线开发人员,你对项目了解多少?

对于一个程序开发人员来说,对项目的熟悉程度意味着你对工作内容的掌握程度。那么你是否可以问一下自己,你对你的项目了解吗?

2022-01-26 01:29:34 221

原创 起个变量名,好的代码应该是这样的

先起一个名字在进行项目编写的过程中,免不了的就是要进行各种方法、变量的命名。你一定经历过对变量命名无比困难的时候。而有的时候命名就看起来很轻松,比如对新增一个领域实体的时候。那用户(user)来举例子,可能还没有进行更多的思考,但 addUser的方法就已经创建了。工作完成,可喜可贺。但真的是这样吗?有多少同学在进行后续的代码翻阅的时候,反而发现别的同学的接口出现了 saveXxx的方法?该跟他保持一致吗?还是继续我行我素?如果在团队中的命名规范不明确的话,这种确实会出现。而比表面上看起来更严重的问题

2022-01-24 10:42:40 355

VB做的抽奖用的PPt 内有音乐

用VB做的抽奖用PPT,里面陪了抽奖音效,用在晚会里或者其他活动都挺好的,不过音乐需要在VB里再设一下路径就好了

2012-11-30

空空如也

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

TA关注的人

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