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

《领域驱动设计》(Eric Evans):告诉我们用代码呈现真实世界的重要性,并且告诉我们如何更好地建模。

      持续交付理论:如何更有效及更高效地发布软件品,并指出保持每次提交均可发布的重要性。

      六边形架构理论(Alistair Cockburn):把我们从分层架构中拯救出来,从而能更好地体现业务逻辑。(http://alistair.cockburn.us/Hexagonal+architecture)

      随着领域驱动设计、持续交付、按需要虚拟化、基础设施自动化、小型自治团队、大型集群系统这些实践的流行,微服务也就应运而生。

 

什么是微服务?

      微服务就是一些协同工作的小而自治的服务。

1.小,专注

      单一职责原则:把因相同原因而变化的东西聚合在一起,把因不同原因而变化的东西分享开来。(Single Resonsibility Principle,http://programmer.97things.oreilly.com/wiki/index.php/The_Single_Responsibility_Principle)

微服务将内聚性应用在独立的服务上,根据业务的边界来确定服务的边界,可避免代码库过大衍生的问题。

      讨论:多小才算小?

      使用代码行来衡量是有问题的。大家都认为自己的系统过于庞大,却不知道什么才算是小。ok,那么就一直拆分,直到你不再感觉它过于庞大,那么它有可能就足够小了。另外,如果你的小团队无法正常维护,那么它就太大了。

      小的优点与缺点:独立性带来的好处越多,但管理也越复杂。

2.自治性

      一个微服务是一个独立的实体,它可以独立部署,独立修改,服务之间通过暴露API来进行通信,API的实现技术应避免与具体技术相关,以保证技术的选择不受限制。

      自治性其实就是要求你的服务与其他的服务之间很好的解藕,判断是否解藕的黄金法则:你是否能够修改一个服务并对其进行部署,而不影响其他任何服务?

     

微服务的好处

1.技术异构性

      对于微服务而言,我们可以根据需要采用最适合这个服务所需要的技术。

      对于微服务系统而言,总会存在一些地方让我们可以尝试新技术,这种可以快速采用新技术的能力对很多组织而言是非常有价值的。

2.弹性

      如果系统中的一个组件不可用,但并没有传染到其他的组件,没有导致级联故障,系统的其他部分还可以正常工作。

3.扩展

      庞大的单块服务只能作为一个整体进行扩展,即使系统中只有一小部分存在性能问题,也需要对整个服务进行扩展。如果使用较小的多个服务,则可以对只需要进行扩展的服务进行扩展,这样就可以把那些不需要扩展的服务运行在更小的、性能稍差的硬件上。

4.简化部署

      在有几百万行代码的单块应用中,即使只修改了一行代码,也需要重新部署整个应用程序才能发布该变更。这种部署影响很大、风险很高,于是部署的频率就会降低,两次部署的差异越大,出错的可能性就更大!

      在微服务架构中,各个服务的部署都是独立的,这样就可以更快地对特定部分的代码进行部署,如果真出了问题,也只会影响一个服务,并且容易快速回滚,这样就意味着客户可以快速使用我们的新功能。

5.与组织结构相匹配

      可以避免出现庞大的代码库,从而获得理想的团队大小及生产力。

6.可组合性

      分布式系统和面向服务架构的主要好处是易于重用已有功能。不同于以往的单纯的Web、PC端程序,人们有更多的选择使用同一个功能。微服务中会开放很多接口供外部调用,当情况发生改变时,可以使用不同的方式构建应用。

7.可替代

      在单块系统中,删除一百行代码会让人心惶惶,而在微服务系统中,可以轻易地重写服务,或删除不再使用的服务。

 

面向服务的架构(SOA)

      SOA是一种设计方法,它通过提供服务向外提供一系列功能,服务之间通过网络调用,而非采用进程内调用的方式进行通信。

      SOA可以用来应用庞大的单块应用程序,从而提高软件的复用性,比如多个终端共享一个服务。但大多数人对SOA的理解未达成共识,而微服务就是实现SOA的一种新方法,就像XP或Scrum是敏捷软件开发的一种特定方法一样。

 

其他分解技术

1.共享库

      有些共享库不属于任何一个业务领域,并且可以在整个组织中进行重用。但还是需要小心,如果使用共享库来做服务之间的通信的话,那么它会成为一个藕合点。

2.模块

      有些语言提供自己的模块分解技术,它允许对模块进行生命周期管理,这就可以把模块部署到运行的进程中并且可以不在停止整个进程的前提下对某个模块进行修改,但很少有人这么做,因为尽管在单块进程中创建隔离性很好的模块是可能的,但是它们这些模块会迅速和其他代码藕合在一起。

      同时,在单进程中采用模块化技术,也会大大限制我们采用新技术和独立服务进行扩展的能力。

 

参考

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

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


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

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

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

相关文章

图标设计

一、图标的作用: 1.吸引用户的注意力 2.跨语言障碍,更好的实现人机交互。 二、图标的尺寸: 1.128128 2.4848 3.256256 4.3232 5.16*16 三、icon的中文意思就是图标,图形化表示。 四、图标的色彩数量: 1.颜色数&#xf…

React中后台管理系统添加广告分类显示不出来

问题描述 添加广告分类之后,其他的页面能正常显示,看不到广告页面,或者看到广告页面不停的转圈(打开network看到client的拦截信息) 问题分析 可能是浏览器中的拦截器拦截了请求 解决办法 关闭浏览器中的拦截广告插件

自定义机架感知

副本节点的选择(机架感知) 1、默认情况下 第一个副本在client所处的节点上,如果客户端在集群之外,(在win7上运行程序,写文件到集群上),随机选一个。 第二个副本和第一个副本在不同…

想要玩转实现负载均衡,你知道这些吗?

转载自 想要玩转实现负载均衡,你知道这些吗? 一、前言 互联网早期,业务流量比较小并且业务逻辑比较简单,单台服务器便可以满足基本的需求;但随着互联网的发展,业务流量越来越大并且业务逻辑也越来越复杂&…

按钮设计

一、按钮的常识: 1.状态:正常状态、鼠标放上去的状态、按下时的状态 2.按钮的格式:bmp、gif、png、jpg(应用程序中的) gif、png、jpg、swf(网页中的) 二、按钮的表现形式: 1.图形方式 2.文字方式 3.综合方式 4.动画方式 三、按钮的…

netcore实践:跨平台动态加载native组件

缘起netcore框架下实现基于zmq的应用。在.net framework时代,我们进行zmq开发由很多的选择,比较常用的有clrzmq4和NetMQ。 其中clrzmq是基于libzmq的Interop包装, NetMQ是100%C#的zmq实现(基于AsyncIO组件)。以上两种…

>>右移运算符

>>是右移运算符。假设x5,那么x的二进制为0101,x>>1表示x右移1位,即把最右边一位的1删掉,变为010,此时x2; 仍然设x5,二进制0101,x>>2表示x右移2位,把最…

如何实现酷狗音乐pc页面点击播放时,打开多个歌曲播放时,始终在一个播放页面,(标签页的通讯)

大致有两种思路, 一种是通过wind.open()方法传第二个参数, A页面: //点击跳转播放页函数function toPlayPage(){window.open(path/xxxx/xxxx?name音乐名,music)//第二个参数写一个定值,代表跳转页面都为music标签页&#xff0…

LOGO设计

一、什么是LOGO: 是用一种特殊文字或图像组成的大众传播符号,是人们相互交流的一种视觉语言。 二、LOGO的特征: 1.识别性 2.领导性 3.同一性 4.涵盖性 5.革新性 三、LOGO的格式: 1.为了便于以后更改:ai cdr eps 2.在使…

Redis进阶之内存模型

转载自 Redis进阶之内存模型 前言 Redis是目前最火爆的内存数据库之一,通过在内存中读写数据,大大提高了读写速度,可以说Redis是实现网站高并发不可或缺的一部分。 我们使用Redis时,会接触Redis的5种对象类型(字符…

React中jsx的规则

jsx语法规则:1.定义虚拟DOM时,不要写引号。2.标签中混入JS表达式时要用{}。3.样式的类名指定不要用class,要用className。4.内联样式,要用style{{key:value}}的形式去写。5.只有一个根标签6.标签必须闭合7.标签首字母(1).若小写字…

C#将引入可空的引用类型

是的,标题没错。C#其中一份新提案假定,所有的引用类型在默认情况下都是不可空的。在新语法下,你需要显式地标明一个引用变量是可空的,就像对值类型所做的那样。 和值类型一样,T是指不可空类型,而T?是指可…

Android中SlidingDrawer开发报错You need to use a Theme.AppCompat theme (or descendant) with this activity.

Android抽屉开发报错You need to use a Theme.AppCompat theme (or descendant) with this activity. 方法1: 创建的activity时,如果不是那么强烈需要继承自AppCompatActivity,就直接继承Activity。 如将activity继承自AppCompatActivity&…

特效字的设计

一、文字的属性: 1.字体:楷体、宋体、行书、小篆 2.字号:14px 16px 20px 3.颜色:red green 4.特殊属性:文字的粗体和斜体 二、特效字的表现形式 1.文字笔画的变形 2.文字的变化与对比 3.文字的特殊材质 4.综合形式 三、…

Redis进阶之持久化

转载自 Redis进阶之持久化 一、Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义。 我们知道,在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务&am…

React遍历数组

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>jsx小练习</title> </head> <body><!-- 准备好一个“容器” --><div id"test"></div><!-- 引入rea…

未来的.NET之多重继承

通过抽象接口引入有限形式的多重继承&#xff0c;这一.NET新提议颇具争议性。该特性是受Java默认方法&#xff08;Default Methods&#xff09;的启发。 默认方法的目的在于允许开发人员修改已发布的抽象接口。修改已发布接口将会产生破坏性的更改&#xff0c;因此在Java和.NE…

Android build.gradle(app)介绍

/**首先第一行应用了一个插件&#xff0c;一般有两个值可选&#xff0c;com.android.application表示这是一个应用程序模块&#xff0c;* com.android.library表示这是一个库模块。应用模块和库模块的最大区别是&#xff1a;一个是可以直接运行的&#xff0c;一个只能做为代码库…

React中的方法调用

onClick{demo}//可以调用函数 onClick{demo()}//返回的是undefide

企业级负载均衡如何实现

转载自 企业级负载均衡如何实现 负载均衡简介 首先&#xff0c;我们来了解一下什么是负载均衡&#xff1a; 在一个大型网站中&#xff0c;在线用户有时可能有几千个甚至上万个之多。如果一个用户的请求需要服务使用0.02秒来处理&#xff0c;那么该服务实例每秒钟将只能处理…