前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一起玩转微服务(5)——分层架构

一起玩转微服务(5)——分层架构

作者头像
cloudskyme
发布于 2020-06-22 06:48:15
发布于 2020-06-22 06:48:15
9210
举报
文章被收录于专栏:cloudskymecloudskyme

领域驱动设计DDD(Domain Driven Design)提出了从业务设计到代码实现一致性的要求,不再对分析模型和实现模型进行区分。也就是说从代码的结构中我们可以直接理解业务的设计,命名得当的话,非程序人员也可以“读”代码。这与微服务设计中的约定优于配置不谋而合,如果你熟悉英文,那么直接根据包名和类名就可以直接解读出程序开发者所构建的业务的大概意图。

领域模型包含一些明确定义的类型:

  • 实体是一个对象,它有固定的身份,具有明确定义的"连续性线索"或生命周期。通常列举的示例是一个 Person(一个实体)。大多数系统都需要唯一地跟踪一个 Person,无论姓名、地址或其他属性是否更改。
  • l值对象没有明确定义的身份,而仅由它们的属性定义。它们通常不可变,所以两个相等的值对象始终保持相等。地址可以是与 Person 关联的值对象。
  • l集合是一个相关对象集群,这些对象被看作一个整体。它拥有一个特定实体作为它的根,并定义了明确的封装边界。它不只是一个列表。
  • l服务用于表示不是实体或值对象的自然部分的操作或活动。

领域模型在实现时可大可小,在业务的早期,在系统比较小的情况下,它有可能是一个类。当系统做大了以后,它可能是个库。再做更大一点的时候,它可能是一个服务,给不同的应用去调用。

要将领域元素转换为服务,可按照以下一般准则来完成此操作:

  • 使用值对象的表示作为参数和返回值,将集合和实体转换为独立的微服务。
  • 将领域服务(未附加到集合或实体的服务)与独立的微服务相匹配。
  • 每个微服务应处理一个完整的业务功能。

领域模型又可以分为失血、贫血和充血3种。

  • 失血模型:基于数据库的领域设计方式就是典型的失血模型,只关注数据的增删改查。
  • 贫血模型:就是在domain object包含了不依赖于持久化的领域逻辑,而那些依赖持久化的领域逻辑被分离到server层。
  • 充血模型:充血模型跟贫血模型差不多,不同的是如何划分业务逻辑,就是说,约大部分业务应该放到domain object里面,而service应该是很薄的一层。

设计原则之分层架构

同一公司使用统一应用分层,以减少开发维护学习成本。应用分层这件事情看起来很简单,但每个程序员都有自己的一套,哪怕是初学者,所以想实施起来并非那么容易。

最早接触分层架构的应该是我们最熟悉的MVC(Model-View-Controller)架构,将应用分成了模型、视图和控制层,可以说引导了绝大多数开发者,而我们现在的应用中非常多的包括框架,架构设计都使用此模式。这后又演化出了MVP(Model-View-Presenter)和MVVM(Model-View-ViewModel)。这些可以说都是随着技术的不断发展,为了应对不同场景所演化出来的模型。而微服务的每个架构都可以再细分成领域模型,下面看一下经典的领域模型架构。

它包括了Domain,Service Layer和Repositories。核心实体(Entity)和值对象(Value Object)应该在Domain层,定义的领域服务(Domain Service)在Service Layer,而针对实体和值对象的存储和查询逻辑都应该在Repositories层。值得注意的是,不要把Entity的属性和行为分离到Domain和Service两层中去实现,即所谓的贫血模型,事实证明这样的实现方式会造成很大的维护问题。基于这种设计,工程的结构可以构造为:

- MicroService-Sample/src/

    domain

    gateways

    interface

    repositories

    services

当然,在微服务的架构中,每个微服务不必严格遵照这样的规定,切忌死搬硬套,最重要的是理解,在不同的业务场合,架构的设计可以适当的做调整,毕竟适合的架构一定要具有灵活性。

分层的原则包括:

  • 文件夹分层法

应用分层采用文件夹方式的优点是可大可小、简单易用、统一规范,可以包括 5 个项目,也可以包括 50 个项目,以满足所有业务应用的多种不同场景。

  • 调用规约

在开发过程中,需要遵循分层架构的约束,禁止跨层次的调用。

  • 下层为上层服务

以用户为中心,以目标为导向。上层(业务逻辑层)需要什么,下层(数据访问层)提供什么,而不是下层(数据访问层)有什么,就向上层(业务逻辑层)提供什么。

  • 实体层规约

Entity是数据表对象,不是数据访问层对象;DTO 是网络传输对象,不是表现层对象;BO 是内存计算逻辑对象,不是业务逻辑层对象,不是只能给业务逻辑层使用 。如果仅限定在本层访问,则导致单个应用内大量没有价值的对象转换。以用户为中心来设计实体类,可以减少无价值重复对象和无用转换。

  • U 型访问

下行时表现层是 Input,业务逻辑层是 Process,数据访问层是 Output。上行时数据访问层是 Input,业务逻辑层是 Process,  表现层就 Output。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-06-19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
学生成绩管理系统(C语言版)「建议收藏」
大一刚接触这个计算机专业的相关知识,就觉得这个专业很有趣。最先接触的编程语言就是C语言,想必大多数人都是如此吧。我们这个学期末,也就是期末考试结束后,开始这个实训。我也是第一次听说实训这个东西,当然可能这个实训也主要针对我们计算机专业的学生。 我们这次实训历时5天,是由公司请来的专业人员给我们进行指导的。前面几天时进行C语言基础知识的复习与巩固,后面两天就是给每个组时间,进行实训项目的制作。我们组选择的是学生成绩管理系统,这个也是比较常见的项目,有些组选择的是贪吃蛇等等。 下面给图片展示我们组的实训项目图片: 1 登录界面(确实挺简陋的)
全栈程序员站长
2022/09/06
7800
学生成绩管理系统(C语言版)「建议收藏」
学生成绩管理系统(C语言版)
C语言版学生成绩管理系统 教材里的,要提交实验报告,能实现以下功能。 #include "stdio.h" #include "stdlib.h" #include "string.h" #define MAX_LRN 10 #define STU_NUM 30 #define COURSE_NUM 6 typedef struct student { long num; char name[MAX_LRN]; float score[COURSE_NUM]; fl
繁依Fanyi
2023/05/07
1.1K0
学生成绩管理系统(C语言版)
【学生管理系统C语言】没有用数据库,正在学习C语言的看看吧
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> # define SIZE1 33 # define SIZE2 7 # define PI 3.14159 struct student_grade //学生成绩 { intnum; //学号 char
赵腰静
2018/03/09
1.8K0
【C语言】学生管理系统
学生管理系统是一个用于管理学生信息、成绩、课程等数据的软件系统。在本文中,我们将使用C语言来实现一个简易的学生管理系统,包括学生信息的录入、显示、查询等功能。我们将使用文件来存储学生信息,以便实现持久化存储。
DevKevin
2024/03/19
5150
【C语言】学生管理系统
学生成绩管理系统-C语言(附源码)[通俗易懂]
链接:https://pan.baidu.com/s/13Zx6RJiUX2e0nxom22kn5A 提取码:5892
全栈程序员站长
2022/09/06
12.4K2
学生成绩管理系统-C语言(附源码)[通俗易懂]
【学生管理系统】c语言版:这是我的第一个系统程序
有时候小白或者学生自学可以试试跟着编程书打比较大的程序,我发现这样可以学到很多东西
天天Lotay
2022/12/01
3680
【学生管理系统】c语言版:这是我的第一个系统程序
按格式读写文件存取学生信息(含注释)
The conquest of today, coward lamented yesterday, idle waiting for tomorrow.
小Bob来啦
2020/12/15
8120
按格式读写文件存取学生信息(含注释)
看懂这一篇,C++也算入门了
呜呜周六要补班,只能趁着周六晚上连夜弄了一个。互动交流是我坚持下去的动力,希望可以帮到这位小伙伴哦。
用户9831583
2022/06/16
5030
看懂这一篇,C++也算入门了
C语言实现图书管理系统
相关视频——C语言课程设计实战:图书管理系统!计算机专业同学的一大难题,今天用代码实战演示,手把手带你完成!_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
半生瓜的blog
2023/05/12
3300
C语言开发简单的学生成绩管理系统(附源码)
(2)不修改函数,仅仅修改项目的属性。因为fopen_s是一种Microsoft的函数,若纯做Windows开发则直接改为_s也无妨,但是我们尽量还是用标准C++比较好,这样代码有较好的移植性。
全栈程序员站长
2022/08/28
1.3K0
C语言开发简单的学生成绩管理系统(附源码)
【升级版学生信息管理系统&员工工资信息管理系统】+文件操作+更多细节
目录 1.功能介绍(主菜单-有什么功能)  2.结构体的定义(定义一个结构体类型) 3.主函数(如何调用分函数) 4.初始化顺序表(数组加上数组的附加信息) 5.退出程序同时保存数据到文档 6.增加员工信息 7.删除员工信息  8.按照名字查找(查询工资信息) 9. 修改员工信息 10. 按照工资排序 11.按照工号排序 12. 计算工资信息  13.打印工资信息 14. 统计员工总数 15.default语句  16.源代码 ---- 1.功能介绍(主菜单-有什么功能) 讲一下:这个0123的标号的伏
MicroFrank
2023/01/16
5240
【Python全栈100天学习笔记】Day37MySQL详解(sql语句基本操作含索引、视图、存储过程)
我们通常可以将SQL分为三类:DDL(数据定义语言)、DML(数据操作语言)和DCL(数据控制语言)。DDL主要用于创建(create)、删除(drop)、修改(alter)数据库中的对象,比如创建、删除和修改二维表;DML主要负责插入数据(insert)、删除数据(delete)、更新数据(update)和查询(select);DCL通常用于授予权限(grant)和召回权限(revoke)。
天道Vax的时间宝藏
2022/04/02
9850
【Python全栈100天学习笔记】Day37MySQL详解(sql语句基本操作含索引、视图、存储过程)
那些年我们一起忘掉的C (十七).文件读写结构体
思路比较简单和直接,主要是在巩固结构体的定义,属性的调用,基于其中部分属性值的排序,还有文件的读写方法
franket
2021/10/18
2530
c语言实现的简单学生管理系统
本文链接:https://blog.csdn.net/sakurakider/article/details/72823662
C语言中文社区
2022/05/30
4600
c语言实现的简单学生管理系统
c语言学生成绩管理系统(c语言链表实现学生管理系统)
二、目的与要求 每位学生记录包含有学号、姓名、性别、出生日期、三门功课的成绩(高等数学、大学英语、C语言)、总分和平均分 系统菜单: (1)录入学生记录 (2)添加学生记录 (3)删除学生记录 (4)修改学生记录(要求输入密码) (5)查找学生记录(按学号、按姓名) (6)按总分对记录进行降序排列 (7)将当前结果显示或打印,重新保存进数据文件中 (8)输出所有学生信息 (9)计算班级平均分 (10)修改管理员密码(未保存至文件,程序关闭后失效) (11)C语言挂科人数 (0)结束程序
全栈程序员站长
2022/07/25
4.3K0
c语言学生成绩管理系统(c语言链表实现学生管理系统)
C语言学生管理系统源代码「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128553.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/28
1.8K0
C语言学生成绩管理系统(设计报告和全部源码)「建议收藏」
实现如下功能: 1)能够实现学生成绩信息的插入、删除和修改; 2)能够实现各种查询(分别根据学生学号、姓名、课程名称等); 3)能够实现按照考试成绩、总评成绩进行排序; 4)能够查询某门课程的最高分、最低分并输出相应学生信息; 5)能够查询某门课程的优秀率(90 分及以上)、不及格率;
全栈程序员站长
2022/09/06
3.9K0
C语言学生成绩管理系统(设计报告和全部源码)「建议收藏」
用C语言写的学生成绩管理系统
#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> int n; struct student//结构体 { int xuehao; char name[20]; int score; }student[20]; //student[i].xuehao; //student[i].name; //student[i].score; int color(int c) //颜色函数 { Se
跋扈洋
2021/02/02
2.5K0
DEVC怎么建工程「建议收藏」
打开文件,选择新建–>项目–>ConsoleApplication(控制台程序),输入项目名,选择保存路径。(单独建一个文件夹存放)
全栈程序员站长
2022/09/20
7690
DEVC怎么建工程「建议收藏」
学生选课管理系统c语言课程设计_大一c语言学生选课系统代码
《学生选课管理系统c语言程序》由会员分享,可在线阅读,更多相关《学生选课管理系统c语言程序(38页珍藏版)》请在人人文库网上搜索。
全栈程序员站长
2022/11/03
1.1K0
推荐阅读
相关推荐
学生成绩管理系统(C语言版)「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档