建模:确定服务的边界——《微服务设计》读书笔记

什么样的服务才是好的服务?

      高内聚、松耦合的服务才是好的服务。简而言之,就是把相关性强的放在一起,相关性不强的分开,物以类聚,人以群分,服务的划分也是这样。这就需要确定什么要放在一起,什么是要分开的,这个寻找的过程就是确定服务边界的过程。

 

限界上下文

       限界上下文确定了这个边界内它所承担的职责。

      Evans在《领域驱动设计》中作喻:细胞之所以会存在,是因为细胞膜定义了什么在细胞内,什么在细胞外,并且确定了什么物质可以通过细胞。这是限界上下文的绝好比喻。

      任何一个给定的领域都包含多个限界上下文。限界上下文中包含了一些内容(或者叫模型),它们的相关性较高,一部分需要与外部通信,一部分不需要与外部通信,每个限界上下文都有明确的接口,该接口决定了它会暴露哪些模型给其他的上下文。外部想与限界上下文通信,需要使用模型和它的显式限界(接口)进行通信。这样做可以得到高内聚,从而很好地形成组合限界。

      限界与限界之间,也会存在共享模型,如下所示,仓库和财务都需要库存信息,但不能把仓库所有的库存信息都给财务,因为有些信息对于财务是并没有用的,同时也不能让财务伸到仓库内部去取数据,这样有可能会破坏限界上下文的完整性,因此,我们提供了一个共享模型——库存项。

                  

      这些模块限界就可以成为绝佳的微服务候选,一般来说,微服务应清晰地和限界上下文保持一致。

 

如何确定限界上下文

      1.推荐使用领域来表分解限界上下文

      如果把系统分解成为限界上下文来表示领域的话,那么对于某个功能所做的修改,就更倾向于在一个单独的微服务限界之内。另外,服务之间应该共享相同的术语,也应该反映到服务的接口上。

      2.应从限界上下文提供的功能来考虑,而不是数据

只考虑数据和模型,不考虑上下文的功能,很容易导致“贫血”,所以要先问“这个上下文是做什么用的“,再考虑它”需要什么样的数据“。

      3.不要过早划分上下文

      对于一个新系统而言,可以先使用一段时间的单块系统,因为如果服务之间的限界搞错了,后面修复的代价就会很大,所以最好能够等到系统稳定下来之后,再确定把哪些东西作为一个服务划分出去。

      4.不要排斥嵌套上下文

       一开始,你会识别一些粗粒度的限界上下文,而这些限界上下文可能又包含一些嵌套的限界上下文。如下所示:使用这些嵌套的上下文不直接对外可见,对于外界来说,它们用的还是仓库的功能,但发出的请求其实被透明地映射到了两个或更多有服务上。

               

      当然,根据每个团队的情况不同,我们也可以将仓库的内的上下文再隔离出来,如下所示:

              

      5.谨慎根据技术边界来确定上下文

      一般而言,我们建议按照业务的垂直划分来建立上下文,而不是按照技术的分层来确定上下文,比如,你如果将DAO、BLL、UI层分成3个不同的服务,那么当你需要变更业务的时候,你需要频繁地同时修改两个服务,这样显然是不合理的。但也不是说这样划分总是不合理,如果一个组织想达到某个性能目标,这样划分反而更合理。

      

参考

      《微服务设计》(Sam Newman 著 / 崔力强 张骏 译)

相关文章: 

  • 微服务的概念——《微服务设计》读书笔记

  • 微服务架构师的职责——《微服务设计读书笔记》

原文地址:http://www.cnblogs.com/gudi/p/6613989.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谈谈系统稳定性设计

转载自 谈谈系统稳定性设计 一、差旅随想 因为base在分公司,需要经常去总部出差,所以搭乘飞机成了家常便饭,很多时候坐在飞机上会不由的感叹,设计制造这样精密复杂的机器的那帮人真的是了不起,他们是怎样保证这样一台…

Android使用MPAndroidChat

参考文档: https://blog.csdn.net/u013184970/article/details/52095170 https://blog.csdn.net/cen_yuan/article/details/52204281 注意: 在要使用的module的build.gradle添加: dependencies { compile ‘com.github.PhilJay:MPAndroidChart:v3.0.0-be…

微服务集成——《微服务设计》读书笔记

一.理想的集成应该是什么样的? 1.避免破坏性修改 如果在一个微服务的响应中添加一个字段,服务的消费方不应该受到影响。 2.保证API的技术无关性 微服务之间的通信应该是与技术无关的。 3.使服务的消费方易于使用 如果消费方使用该服务比登天还难&…

什么是加密算法

转载自 什么是加密算法 Java的加密知识也是Java常见的领域之一,加密技术的底层确实很复杂,运用了大量的数学知识,要弄明白非常复杂。但是Java语言中运用密码加密工具却是非常简单。我们在Java里面运用这些加密技术,只需要把原理…

Android传感器的使用

Android 中主要的传感器有以下几种 TYPE_ACCELEROMETER 加速度传感器又叫 G-sensor,该数值包含地心引力的影响,单位是 m/s 测量应用于设备 x 、y、z 轴上的加速度。 将手机平放在桌面上,x 轴默认为0,y 轴默认0,z 轴默…

理解C# 4 dynamic(2) – ExpandoObject的使用

ExpandoObject的使用非常简单,很容易入手。上一篇里面已经有详细的介绍了,可以看这里(理解C# 4 dynamic(1) - var, object, dynamic的区别以及dynamic的使用) 下面对ExpandoObject的使用场合和一些认为需要注意的地方,谈一下自己的看法: 一…

谈谈服务限流算法的几种实现

转载自 谈谈服务限流算法的几种实现 保障服务稳定的三大利器:熔断降级、服务限流和故障模拟。今天和大家谈谈限流算法的几种实现方式,本文所说的限流并非是Nginx层面的限流,而是业务代码中的逻辑限流。 为什么需要限流 按照服务的调用方&…

Android如何实现NoActionBar以及Theme.NoTitleBar.Fullscreen效果

效果一 NoActionBar 无论Activity继承自Activity还是AppCompatActivity 只需要在styles中的修改Theme <style name"AppTheme" parent"Theme.AppCompat.Light.NoActionBar"><!-- Customize your theme here. --><item name"colorPrima…

自己动手写一个能操作redis的客户端

转载自 自己动手写一个能操作redis的客户端 引言 redis大家在项目中经常会使用到。官网也提供了多语言的客户端供大家操作redis,如下图所示 但是&#xff0c;大家有思考过&#xff0c;这些语言操作redis背后的原理么&#xff1f;其实&#xff0c;某些大神会说 只要按照redis…

离线安装 VS2017 的正确姿势

国内的网络环境&#xff0c;真的是有很大的不同&#xff0c;有的人装 VS 的时候&#xff0c;号称满速&#xff0c;有的人&#xff08;其实就是我&#xff09;要等它下载很久&#xff0c;还告诉我有个组件没有安装成功。很久很久以前&#xff0c;VS 是提供 ISO 版的离线安装包的…

Android中ImageView的旋转与缩放

说明在代码中已经注释 XML代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wra…

ASP.NET Core MVC四种枚举绑定方式

前言 本节我们来讲讲在ASP.NET Core MVC又为我们提供了哪些方便&#xff0c;之前我们探讨过在ASP.NET MVC中下拉框绑定方式&#xff0c;这节我们来再来重点看看枚举绑定的方式&#xff0c;充分实现你所能想到的场景&#xff0c;满满的干货&#xff0c;你值得拥有。 探讨枚举绑…

关于分布式事务、两阶段提交协议、三阶提交协议

转载自 关于分布式事务、两阶段提交协议、三阶提交协议 随着大型网站的各种高并发访问、海量数据处理等场景越来越多&#xff0c;如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。 为了解决这样一系列问题&#xff0c;大型网站的架构也在不断发展。提高…

React对标签属性进行限制(props)

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>对props进行限制</title> </head> <body><!-- 准备好一个“容器” --><div id"test1"></div><div …

服务的协作:服务间的消息传递——《微服务设计》读书笔记

在微服务集成——《微服务设计》读书笔记文章中&#xff0c;我们说过服务间的消息传递有几种方式&#xff0c;一种是请求/响应技术&#xff0c;另一种是基于事件的机制。 RPC&#xff08;远程过程调用&#xff09; RPC是Remote Procedure Call的简称。 这是请求/响应技术的一种…

jdbc事务和事务的隔离级别

转载自 jdbc事务和事务的隔离级别 在jdbc的使用中以最简单的jdbc的使用为例&#xff0c;说明了jdbc的具体用法。然而在通常项目中&#xff0c;需要考虑更多内容&#xff0c;例如事务。 事务&#xff0c;在单个数据处理单元中&#xff0c;存在若干个数据处理&#xff0c;要么整…

Android自定义View画钟表

第一种使用背景表盘 主要代码&#xff1a; package com.zjs.zidingyiview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.os.Message; impo…

理解C# 4 dynamic(3) – DynamicObject的使用

上篇文章"理解C# 4 dynamic(2) – ExpandoObject的使用" 了解了xpandoObject的基本使用。但ExpandoObject的问题就是它是一个万金油&#xff0c;什么都可以做&#xff0c;但是又都不专注。使用DynamicObject正好可以解决这个问题。这篇文章介绍DynamicJson是如何继承…

jsx中的注释的写法

{}表示里面要写js语句 js语句里面的注释为/**/