微服务架构设计 (一): 核心概念

微服务设计是架构设计。
所以, 微服务设计不应是一个讲求标准答案, 简单粗暴的设计过程。而应该是一个考量各方因素下的一个决策的过程。
所以, 在探讨微服务设计前, 我们先来探讨下, 所谓的微服务具体应包含哪些核心的概念?

I. 分布式 (Distributed):

微服务与微服务间分布式调用最主要的概念便是: protocol-aware heterogeneous interoperability; 各微服务可各自拥有自身的 platform (Java,C#, Scala…等等), 但, 各微服务间却只能藉由单一共同的协议 (protocol); 如: REST; 进行分布式的调用。

II. 分别部署 (Separately Deploy):

微服务架构的产品或许会有数百甚至数千个微服务所构成。所以, 部署微服务时, 便很难经由手工来完成, 而必须相当程度的依赖自动化的 DevOps 工具。

Service Registry And Discovery Deployment Monitoring
Zookeeper
Doozer
Etcd
SmartStack
Eureka
NSQ
Serf
Spotify
DNS
SkyDNS
Consul
Cloud Foundry
Gradle
Docker
Docker Hub
Docker Machine
Kitematic
Docker Compose
Docker Swarm
AWS
Jenkins
Continuum
Hudson
Artifactory
Terraform
Grunt
OpenShift
SonarCube
Logstash
New Relic
Graphite
Mesosphere / DCOS
Winston
Hystrix

III. 服务组件 (Service Component):

微服务是以服务组件, 而不是以类或模块的方式体现; 每个服务组件会包含一个或多个类或组件。
微服务共分为两大类:
A. Infrastructure Services
: 主要是为产品中其他的微服务提供服务; 被产品中其他的微服务直接的调用。
如: login service 便是一Infrastructure Services 的例子; 主要是为产品中其他的微服务提供产品登入的服务。
所以, Infrastructure Services 对产品外部的使用者界面、系统、设备都是不可见的, 也就是说, 产品外部的使用者界面、系统、设备是无法经由 api layer 来找到 Infrastructure Services 的。
B. Functional Services: 主要是为产品外部的使用者界面、系统、设备提供某一端到端业务场景的服务。
所以, 相对于 Infrastructure Services, Functional Services 对产品外部的使用者界面、系统、设备而言, 都是可见的。也就是说, 产品外部的使用者界面、系统、设备是经由 api layer 来找到 Functional Services 的。

IV. 边界上下文 (Bounded Context):

微服务的边界上下文包含:
A. 某一端到端业务场景 (功能) 。
B. 数据 (数据库) 。
微服务的边界上下文, 使得每一个微服务拥有各自的某一端到端业务场景 (功能)与数据 (数据库) 。
更重要的是: 当微服务X需调用微服务Y, 则微服务X 与微服务Y的边界上下文, 将可避免或降低发生, 当微服务Y 运作失败时, 会影响到微服务 X。
所以, 微服务的边界上下文提供了一个很重要的微服务概念:微服务应能独立各自的开发、测试, 并且当发布、部署后, 亦不致影响到其他微服务的功能或运作。

V. 不共享任何事物 (Share Nothing):

因为, 微服务间共享任何的事物, 将会造成微服务间的依赖。
所以, 微服务间应避免共享任何的事物; 如:继承结构下的抽象接口, 服务, 模块, utility, 类, 数据 (数据库)…等等。

VI. api layer:

api layer 主要是在微服务与微服务外部的使用者界面、系统或设备之间构建:
A. endpoint proxy: 隐藏各微服务的 endpoint。
当某个新增的场景在某个新的微服务上开发完后, 这个新的微服务便会有了新的 endpoint。 而api layer 便可将此微服务外部的使用者界面、系统或设备导向此新的微服务上的 endpoint。使得微服务外部的使用者界面、系统或设备可在不需要有任何修改的情况下, 便可以使用此新的微服务。而当微服务外部的使用者界面、系统或设备发现此新的微服务不适用时, api layer 便可将微服务外部的使用者界面、系统或设备导向旧的微服务上的 endpoint, 而使得新的微服务, 对微服务外部的使用者界面、系统或设备而言, 变得不可见。
B. load balancer: 多节点间的负载均衡。

VII. 开发新的微服务优于在既有的微服务上不断的加新的场景或功能:

当某个微服务开发完后, 便应避免不要再在此微服务上, 不断的加新的场景或功能; 新的场景或功能应该是属于另一个新的微服务。



本文作者:
方俊贤 (Ken Fang), 曾任职于 IJI, Rational, Telelogic, Borland◦ 有将近二十年在半导体, 电信产业与军事研究单位, 从事软件工程与精益敏捷开发相关咨询服务的经验。 主要专长是精益敏捷开发, 有价值的产品需求挖掘, 使用者行为场景分析, 动态注入框架设计, ROA, 既有软件架构优化, 探索式测试, 敏捷测试与持续集成。

本文转载自 方俊贤_Ken 的 CSDN 博客 原文链接:http://blog.csdn.net/featuresoft/article/details/52156360

时间: 2024-12-31 20:22:00

微服务架构设计 (一): 核心概念的相关文章

微服务架构设计(四):提升微服务分布式远程调用的可靠性与性能

在分布式微服务的架构下, 架构师往往面临著可靠性与性能间的抉择. 当来自某个微服务外部 Client 的远程调用, 要求微服务处理一购买 100 张股票的订单时.假如: A.  架构师所设计的微服务外部 Client 远程调用的 Time Out 时间是 2000 ms. 但, 此次微服务外部 Client 远程调用.微服务成功处理这 100 张股票的订单并送回一确认成功的信息到微服务外部 Client 时, 共花费了 3000 ms.所以, 微服务外部 Client 会误认为, 先前所发送的请

学霸君基于Docker的微服务架构设计

以下内容根据演讲PPT以及现场分享整理而成. 今天主要分享的是我们在实践微服务架构或者容器架构过程中踩过的坑,对于致力在容器技术方面进行探索的同学会有很大帮助.本次将站在整体的角度,分享如何去运维整个线上系统,如何看待整个微服务的架构.微服务能带来什么帮助以及微服务又有哪些缺点,还有重要的一点就是微服务架构如何去落地实施.虽然阿里云这样的服务商为我们做了大量的工作,但是将微服务架构真正地落地实施还需要做很多的工作.而对于任何技术而言,都是存在优缺点的,微服务架构也不是救世的良药. 一.学霸君的发

互联网保险O2O平台微服务架构设计

关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也提现在这里.这也是微服务能够流行的原因,看看市场上曾经出现的服务架 构:EJB.SCA.Dubbo等等,都比微服务先进,都比微服务功能完善,但它们都没有微服务这么深入民心,就是因为他们过于复杂.简单就是高科技,苹 果手机据说专门有个团队研究如何能让用户更加简单的操作.大公司都是由小公司发展起来的,如果小公司在开始技术选型时感觉某个框架费时费力就不会选择,而 小公司发展到大公司的过程,一般也伴随着系统不断优化的过程,而不断优化往往不会重

微服务架构设计 (二): 架构迁移策略

在微服务的核心概念中, 最重要的核心概念便是: 边界上下文 (Bounded Context); 每一个微服务拥有各自的某一端到端业务场景 (功能)与数据 (数据库) . 当将既有的架构迁移到微服务时, 常见的作法便是:A. 只将既有架构的功能模块拆解成粒度较小的功能模块: 这样的作法, 其实, 实质上的意义是不大的.因为, 即使拆解成粒度较小的功能模块, 并且拆解后的各功能模块能互相的解藕, 但, 拆解后的各功能模块, 也许仍需共用数据库.所以, 当数据库即使只是修改某个数据表结构的某几个字段

微服务架构设计(五):获取微服务数据, 生成报表

架构师在设计从多个微服务取数据, 而生成报表的架构设计方案时, 往往面临著需在边界上下文 (Bounded Context), 数据的时效性, 性能, 可靠性与开发的复杂度间作取舍. 从多个微服务取数据, 而生成报表的设计方案, 主要是参考: Enterprise Integration Patterns; Hohpe and Woolf. A. Database Pull Model (Shared DataIntegration Style): 直接至各微服务所拥有的数据库中获取数据, 并写

微服务架构设计 (六): 微服务间的共享的管理

在微服务的架构下, 产品或许会有上百个或上千个微服务.所以, 当这些上百个或上千个微服务, 同时都依赖于某个库 (Library) 时, 则当此共享的库, 即使只是针对某个微服务做些很少量的修改, 也可能会对其他上百个或上千个微服务, 造成不可预期的影响. 但在实际的项目中, 产品中的微服务又无法避免的会对某些库 (Library) 产生依赖; 共享某些库 (Library). 所以, 架构师必需要知道要如何管理微服务间的共享? 微服务会形成共享的原因, 主要是来自于: 微服务共同继承于某个抽象

几种常见的微服务架构方案——ZeroC IceGrid、Spring Cloud、基于消息队列、Docker Swarm

微服务架构是当前很热门的一个概念,它不是凭空产生的,是技术发展的必然结果.虽然微服务架构没有公认的技术标准和规范草案,但业界已经有一些很有影响力的开源微服务架构平台,架构师可以根据公司的技术实力并结合项目的特点来选择某个合适的微服务架构平台,以此稳妥地实施项目的微服务化改造或开发进程. 本文选自<架构解密:从分布式到微服务>. 本文盘点了四种常用的微服务架构方案,分别是ZeroC IceGrid.Spring Cloud.基于消息队列与Docker Swarm. ZeroC IceGrid微服

融数微服务架构

内容简介 谈谈微服务 微服务技术选型过程 微服务架构设计的一些思考点 融数微服务架构的核心概念和实现 融数DevOps平台对微服务的支撑 技术团队的组织 Operation Excellent 谈谈微服务 微服务与SOA的异同 从设计原则来讲,微服务架构遵循SOA principles 小的.可重用的服务并不一定是微服务,微服务架构强调敏捷.独立开发.独立部署.独立扩展,重用在某种程度上范围影响 敏捷性 微服务架构为了实现其敏捷特性,在SOA约束的基础之上又添加了新的约束 微服务之间不能互相依赖

微服务架构下的分布式数据管理

1.1 分布式数据管理之痛点 为了确保微服务之间松耦合,每个服务都有自己的数据库, 有的是关系型数据库(SQL),有的是非关系型数据库(NoSQL). 开发企业事务往往牵涉到多个服务,要想做到多个服务数据的一致性并非易事,同样,在多个服务之间进行数据查询也充满挑战. 我们以一个在线B2B商店为例,客户服务 包括了客户的各种信息,例如可用信用等. 管理订单,提供订单服务,则需要验证某个新订单与客户的信用限制没有冲突. 在单体应用中,订单服务只需要使用传统事务交易就可以一次性检查可用信用和创建订单.