/images/avatar.png

半生戎码

Go 使用 gRPC

简介

gRPC 是一个高性能、通用的开源 RPC 框架,其由 Google 主要面向移动应用开发并基于 HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。

gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等等。这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

DDD

基本概念

  • aggregate (聚合):聚合就是一组相关对象的集合,我们把聚合作为数据修改的单元。外部对象只能引用聚合中的一个成员,我们把它称为根。在聚合的边界之内应用一组一致的规则。
  • bounded context(限界上下文):特定模型的限界应用。限界上下文使团队所有成员能够明确地知道什么必须保持一致,什么必须独立开发。
  • context(上下文):一个单词或句子出现的环境,它决定了其含义。参见 bounded context 。
  • context map(上下文图):项目所涉及的限界上下文以及它们与模型之间的关系的一种表示。
  • core domain(核心领域):模型的独特部分,是用户的核心目标,它使得应用程序与众不同并且有价值。
  • deep model(深层模型):领域专家们最关心的问题以及与这些问题最相关的知识的清晰表示。深层模型不停留在领域的表层和粗浅的理解上。
  • distillation(精炼):精炼是把一堆混杂在一起的组件分开的过程,从中提取出最重要的内容,使得它更有价值,也更有用。在软件设计中,精炼就是对模型中的关键方面进行抽象,或者是对大系统进行划分,从而把核心领域提取出来。
  • 领域(domain):知识、影响或活动的范围。
  • 领域专家(domain expert):软件项目的成员之一,精通的是软件的应用领域而不是软件开发。并非软件的任何使用者都是领域专家,领域专家需要具备深厚的专业知识。
  • domain layer(领域层):在分层架构中负责领域逻辑的那部分设计和实现。领域层是在软件中用来表示领域模型的地方。
  • entity(实体):一种对象,它不是由属性来定义的,而是通过一连串的连续事件和标识定义的。
  • factory(工厂):一种封装机制,把复杂的创建逻辑封装起来,并为客户抽象出所创建的对象的类型。
  • implicit concept(隐式概念):一种为了理解模型和设计的意义而必不可少的概念,但它从未被提及。
  • layered architecture(分层架构):一种用于分离软件系统关注点的技术,它把领域层与其他层分开。
  • model(模型):一个抽象的系统,描述了领域的所选方面,可用于解决与该领域有关的问题。
  • model driven design (模型驱动的设计):软件元素的某个子集严格对应于模型的元素。也代表一种合作开发模型和实现以便互相保持一致的过程。
  • repository (存储库):一种把存储、检索和搜索行为封装起来的机制,它类似于一个对象集合。
  • service (服务):一种作为接口提供的操作,它在模型中是独立的,没有封装的状态。
  • strategic design(战略设计):一种针对系统整体的建模和设计决策。这样的决策影响整个项目,而且必须由团队来制定。
  • ubiquitous language (通用语言):围绕领域模型建立的一种语言,团队所有成员都使用这种语言把团队的所有活动与软件联系起来。
  • value object (值对象):一种描述了某种特征或属性但没有概念标识的对象。

领域建模

  • 模型是对领域的抽象,建模是针对特定问题建立领域的合理模型
  • 领域 -> 模型(领域知识/业务需求) -> 代码(技术实现)
  • 模型分解(领域划分/限界上下文)解决面向对象的复杂性(一个对象太臃肿)
  • 复杂性来源于业务本身的复杂性和技术引入的额外复杂性
  • 领域驱动设计通过分解模型和模型驱动设计控制复杂性

有效建模的要素

  1. 模型和实现的绑定。
  2. 建立了一种基于模型的通用语言。
  3. 开发一个蕴含丰富知识的模型。
  4. 提炼模型。
  5. 头脑风暴和实验。

领域建模容易产生问题的应对方法

  1. 不要单纯以角色的行为(活动)为中心进行沟通和建模
  2. 领域沟通过程中,研发人员发挥主动性,以便发现深层模型
  3. 场景走查

常用建模方法

  1. Domain Storytelling (领域故事陈述法)本地工具 在线工具
  2. Event Storming (事件风暴法)
  3. 4C (四色建模法)

DDD 与其他开发方法的区别

DDD 与面向对象 OOAD 的区别

区别 联系
OOAD 没有战略设计,DDD 通过战略设计划分领域和模型 都是建模和设计方法
OOAD 仅用对象描述世界,DDD 的描述更细致(实体/值对象/聚合/聚合根) 部分建模方法和工具可复用

DDD 与敏捷

区别 联系
敏捷:关注流程和文化,DDD:关注建模和设计方法
敏捷:重人员轻文档,DDD:重视统一语言的建立
都是软件工程领域的思想,解决软件工程中的不同问题,一般可结合应用

战略战术设计

建模和设计的整体流程:挖掘用户故事 -> 建立通用语言 -> 战略设计 -> 战术设计