微服务实战:从架构到发布(一)

2023-05-16

转载自:https://blog.maxleap.cn/archives/195


引言:“微服务”是当前软件架构领域非常热门的词汇,能找到很多关于微服务的定义、准则,以及如何从微服务中获益的文章,在企业的实践中去应用“微服务”的资源却很少。本篇文章中,会介绍微服务架构(Microservices Architecture)的基础概念,以及如何在实践中具体应用。

单体架构(Monolithic Architecture )

企业级的应用一般都会面临各种各样的业务需求,而常见的方式是把大量功能堆积到同一个单体架构中去。比如:常见的ERP、CRM等系统都以单体架构的方式运行,同时由于提供了大量的业务功能,随着功能的升级,整个研发、发布、定位问题,扩展,升级这样一个“怪物”系统会变得越来越困难。

单体架构的初期效率很高,应用会随着时间推移逐渐变大。在每次的迭代中,开发团队都会面对新功能,然后开发许多新代码,随着时间推移,这个简单的应用会变成了一个巨大的怪物。

图1:单体架构

大部分企业通过SOA来解决上述问题,SOA的思路是把应用中相近的功能聚合到一起,以服务的形式提供出去。因此基于SOA架构的应用可以理解为一批服务的组合。SOA带来的问题是,引入了大量的服务、消息格式定义和规范。

多数情况下,SOA的服务直接相互独立,但是部署在同一个运行环境中(类似于一个Tomcat实例下,运行了很多web应用)。和单体架构类似,随着业务功能的增多SOA的服务会变得越来越复杂,本质上看没有因为使用SOA而变的更好。图1,是一个包含多种服务的在线零售网站,所有的服务部署在一个运行环境中,是一个典型的单体架构。

单体架构的应用一般有以下特点:
  • 设计、开发、部署为一个单独的单元。
  • 会变得越来越复杂,最后导致维护、升级、新增功能变得异常困难
  • 很难以敏捷研发模式进行开发和发布
  • 部分更新,都需要重新部署整个应用
  • 水平扩展:必须以应用为单位进行扩展,在资源需求有冲突时扩展变得比较困难(部分服务需要更多的计算资源,部分需要更多内存资源)
  • 可用性:一个服务的不稳定会导致整个应用出问题
  • 创新困难:很难引入新的技术和框架,所有的功能都构建在同质的框架之上

微服务架构(Microservices Architecture)

微服务架构的核心思想是,一个应用是由多个小的、相互独立的、微服务组成,这些服务运行在自己的进程中,开发和发布都没有依赖。
多数人对于微服务的定义是,
把本来运行在单体架构中的服务拆分成相互独立的服务,并运行在各自的进程中。在我看来,不仅如此。最关键的地方在于,不同的服务能依据不同的业务需求,构建的不同的技术架构之上,并且聚焦在有限的业务功能之上。

因此,在线零售网站可以用图2的微服务架构来简单概括。基于业务需求,需要增加一个账户服务微服务,因此构建微服务绝不是在单体架构中把服务拆分开这么简单。

       2
   图2:微服务架构

微服务设计:规模、范围、业务功能

你可能从零开始用微服务来构建应用,也可能重构现有系统,确定微服务的规模,范围和功能都特别重要。让我们讨论一些有关微服务设计的关键问题和对它的误解:
  • “微”很容易被误解:很多开发者会倾向于把服务往尽量小的颗粒度去做
  • 在SOA方式下,服务都还是以单体架构在运行,用于支持不同的功能。如果依旧采用SAO类似的服务,仅仅是名义上叫做微服务,并不能带来任何微服务的优势。

那我们在微服务中应该怎样设计呢。以下是微服务的设计指南:
  • 职责单一原则(Single Responsibility Principle):把某一个微服务的功能聚焦在特定业务或者有限的范围内会有助于敏捷开发和服务的发布。
  • 设计阶段就需要把业务范围进行界定。
  • 需要关心微服务的业务范围,而不是服务的数量和规模尽量小。数量和规模需要依照业务功能而定。
  • 于SOA不同,某个微服务的功能、操作和消息协议尽量简单。
  • 项目初期把服务的范围制定相对宽泛,随着深入,进一步重构服务,细分微服务是个很好的做法。

微服务消息

在单体架构中,不同功能之间通信通过方法调用,或者跨语言通信。SOA降低了这种语言直接的耦合度,采用基于SOAP协议的web服务。这种web服务的功能和消息体定义都十分复杂,微服务需要更轻量的机制。

同步消息 – REST, Thrift 
同步消息就是客户端需要保持等待,直到服务器返回应答。REST是微服务中默认的同步消息方式,它提供了基于HTTP协议和资源API风格的简单消息格式,多数微服务都采用这种方式(每个功能代表了一个资源和对应的操作)。
Thrift是另外一个可选的方案。它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。
      3
图3:REST接口,对外微服务
异步消息 – AMQP, STOMP, MQTT
异步消息就是客户端不需要一直等待服务应答,有应到后会得到通知。某些微服务需要用到异步消息,一般采用AMQP, STOMP, MQTT。
消息格式 – JSON, XML, Thrift, ProtoBuf, Avro 
消息格式是微服务中另外一个很重要的因素。SOA的web服务一般采用文本消息,基于复杂的消息格式(SOAP)和消息定义(xsd)。微服务采用简单的文本协议JSON和XML,基于HTTP的资源API风格。如果需要二进制,通过用到Thrift, ProtoBuf, Avro。
服务约定 – 定义接口 – Swagger, RAML, Thrift IDL
如果把功能实现为服务,并发布,需要定义一套约定。单体架构中,SOA采用WSDL,WSDL过于复杂并且和SOAP紧耦合,不适合微服务。
REST设计的微服务,通常采用Swagger和RAML定义约定。
对于不是基于REST设计的微服务,比如Thrift,通常采用IDL(Interface Definition Languages),比如Thrift IDL。

微服务集成 (服务间通信)

微服务架构下,应用的服务直接相互独立。在一个具体的商业应用中,需要有些机制支持微服务之间通信。因此服务间的通信机制特别重要。

SOA体系下,服务之间通过企业服务总线(Enterprise Service Bus)通信,许多业务逻辑在中间层(消息的路由、转换和组织)。微服务架构倾向于降低中心消息总线(类似于ESB)的依赖,将业务逻辑分布在每个具体的服务终端。

大部分微服务基于HTTP、JSON这样的标准协议,集成不同标准和格式变的不再重要。另外一个选择是采用轻量级的消息总线或者网关,有路由功能,没有复杂的业务逻辑。下面就介绍几种常见的架构方式。

点对点方式 – 直接调用服务
点对点方式中,服务之间直接用。每个微服务都开放REST API,并且调用其它微服务的接口。
1-444
图4:通过点对点方式通信
很明显,在比较简单的微服务应用场景下,这种方式还可行,随着应用复杂度的提升,会变得越来越不可维护。这点有些类似SOA的ESB,尽量不采用点对点的集成方式。
点对点有下面几个缺点:
  • 非功能的需求,比如用户授权、限制、监控,需要在每个微服务中进行实现
  • 随着功能的演进,服务会变得越来越复杂。
  • 不同的服务直接,客户端和服务直接没有控制功能(监控、跟踪、过滤)
  • 直接通信在大型系统设计中,一般是反面典型。
因此,如果设计一个大型的微服务系统,尽量避免点对点的通信方式,也不能像ESB这样重量级的总线。而是一个轻量级的总线,能够提供非业务功能的抽象。这就是API网关方式。
API-网关方式
API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能个。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和管理服务。
      1-5
图5:通过API-网关暴露微服务
用我们网上商店的例子,在图5中,所有的业务接口通过API网关暴露,是所有客户端接口的唯一入口。微服务之间的通信也通过API网关。
采用网关方式有如下优势:
  • 有能力为微服务接口提供网关层次的抽象。比如:微服务的接口可以各种各样,在网关层,可以对外暴露统一的规范接口。
  • 轻量的消息路由、格式转换。
  • 统一控制安全、监控、限流等非业务功能。
  • 每个微服务会变得更加轻量,非业务功能个都在网关层统一处理,微服务只需要关注业务逻辑
目前,API网关方式应该是微服务架构中应用最广泛的设计模式。
消息代理方式
微服务也可以集成在异步的场景下,通过队列和订阅主题,实现消息的发布和订阅。一个微服务可以是消息的发布者,把消息通过异步的方式发送到队列或者订阅主题下。作为消费者的微服务可以从队列或者主题共获取消息。通过消息中间件把服务之间的直接调用解耦。
图6:异步通信方式
通常异步的生产者/消费者模式,通过AMQP、MQTT等异步消息规范。

数据的去中心化

单体架构中,不同功能的服务模块都把数据存储在某个中心数据库中。

       1-7
图7:单体架构,用一个数据库存储所有数据

微服务方式,多个服务之间的设计相互独立,数据也应该相互独立(比如,某个微服务的数据库结构定义方式改变,可能会中断其它服务)。因此,每个微服务都应该有自己的数据库。

图8:每个微服务有自己私有的数据库,其它微服务不能直接访问。

数据去中心话的核心要点:

  • 每个微服务有自己私有的数据库持久化业务数据
  • 每个微服务只能访问自己的数据库,而不能访问其它服务的数据库
  • 某些业务场景下,需要在一个事务中更新多个数据库。这种情况也不能直接访问其它微服务的数据库,而是通过对于微服务进行操作。

数据的去中心化,进一步降低了微服务之间的耦合度,不同服务可以采用不同的数据库技术(SQL、NoSQL等)。在复杂的业务场景下,如果包含多个微服务,通常在客户端或者中间层(网关)处理。

 下篇文章会介绍微服务实战的其它内容:管理去中心化、服务的注册和发现、安全、事务、失败的设计、其它。


原文作者:Kasun Indrasiri,软件架构师,WSO2
原文链接:https://dzone.com/articles/microservices-in-practice-1
翻译自MaxLeap团队_云服务研发成员:Frank Qin

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微服务实战:从架构到发布(一) 的相关文章

  • MariaDB INSERT INTO SELECT 报错

    文章目录 1 错误描述2 原因3 例子参考文献 1 错误描述 MariaDB 10 5 9 在使用 INSERT INTO SELECT 时会报错 xff0c 错误如下 xff1a ERROR 1064 42000 You have an
  • 科班程序员逆袭为渗透测试工程师的坎坷路(第一篇)

    渗透测试工程师 1 什么是渗透测试 渗透测试 xff08 penetration test xff09 事实上并没有一个标准的定义 xff0c 在国外的大部分安全组织达成的统一说法是 xff1a 渗透测试是通过模拟恶意黑客的攻击方法 xff
  • XD基础操作演示

    基础操作演示 1 启动页面 xff0c 页面上展示了几种画板类型 xff0c 根据项目类型选择相应的画板 xff0c 或者自定义画板大小 在XD中是使用一倍图进行设计 xff0c 由于XD是矢量设计软件 xff0c 所以导出 64 2x 6
  • SQL中的注释语句(三种注释)

    一 单行注释 采用 34 34 双减号 进行单行注释 xff0c 注意 xff1a 34 34 与注释内容要用空格隔开才会生效 二 多行注释 采用 进行多行注释 三 xff0c xff08 单行 xff09 注释 在mysql数据库中就可使
  • Python内置库——http.client源码刨析

    看过了http client的文档 xff0c 趁热打铁 xff0c 今天继续研究一下http client的源码 xff08 一 xff09 你会怎么实现 开始之前先让我们回忆一下一个HTTP调用的完整流程 xff1a 看到这张图 xff
  • 端到端 个人理解

    什么是端到端 端到端是根据客户端提出的需求端 xff0c 到满足客户需求端的一个过程 xff0c 这个过程叫做端到端服务 举个栗子 xff1a 客户可以看做市场 xff0c 客户提出的需求可以看做输入端 xff0c 而我们满足客户需求的结果
  • @PathVariable注解的作用

    1 64 PathVariable注解的作用 在SpringMVC中可以使用占位符进行参数绑定 xff0c 地址 list 1 3可以写成 list page limit xff0c 占位符 page 和 limit 对应的值就是1和3 在
  • ssm配置

    web xml lt context param gt lt param name gt log4jConfigLocation lt param name gt lt param value gt classpath log4j prop
  • Ubuntu16.04安装hexo

    在Ubuntu16 04中安装hexo出现一系列的问题 xff0c 总结一下安装hexo的步骤 首先安装noejs xff0c Ubuntu源中的nodejs时旧版本 xff0c 所以需要在安装后更新nodejs span class hl
  • Power Manager之DisplayPowerState.PhotonicModulator

    Android4 4 DisplayPowerState java PhotonicModulator PhotonicModulator是DisplayPowerState的内部类 xff0c private final class xf
  • AB升级之odex文件首次开机处理

    开启AB升级方案的项目 xff0c 因为很多需要升级的镜像都有两份 xff0c 所以存储空间比较浪费 为缓解此问题 xff0c 有个针对odex的优化方案 编译版本会生成两个system镜像 xff1a system img和system
  • 使用PyQt5/PySide2编写一个极简的音乐播放器

    文章目录 一 创建UI界面二 获取网络歌曲三 创建和链接信号槽 疫情肆虐 xff0c 憋在家实在无聊 xff0c 索性写点东西 xff0c 于是就有了这个极极极极极简的音乐播放器 这个极极极简的音乐播放器类似于 阅后即焚 的软件 xff0c
  • linux中最常用的用户、组和权限

    资源分派 xff1a Authentication xff1a 认证 Authorization xff1a 授权 Accouting Audition xff1a 审计 用户user 令牌token identity Linux用户 xf
  • Ansible的playbook

    playbook还是感觉学的不扎实 xff0c 可能得再来一遍才能写出来 xff0c 先占个位置 xff0c 过几天再补充 xff01
  • DNS相关介绍

    1 名字解析介绍和DNS 1 1 背景 当前TCP IP网络中的设备之间进行通信 xff0c 是利用和依赖于IP地址实现的 但数字形式的IP地址是很难记忆的 当网络设备众多 xff0c 想要记住每个设备的IP地址 xff0c 可以说是 不可
  • 关于ubuntu22.04的安装分区时需要注意的情况

    不同于20 04版本 xff0c 可以按照如下安装 如果是ubuntu 22 04 xff0c 则必须安装efi https blog csdn net janeqi1987 article details 106172976 https
  • 系统日志管理

    1 系统日志管理 1 系统日志介绍 将系统和应用发生的事件记录至日志中 xff0c 以助于排错和分析使用 日志记录的内容包括 xff1a 历史事件 xff1a 时间 xff0c 地点 xff0c 人物 xff0c 事件 日志级别 xff1a
  • python——实现名片管理器

    39 39 39 16 编写程序 xff0c 完成 名片管理器 项目 需要完成的基本功能 xff1a 添加名片 删除名片 修改名片 查询名片 退出系统 程序运行后 xff0c 除非选择退出系统 xff0c 否则重复执行功能 名片 xff1a
  • python——实现五子棋

    39 39 39 五子棋 矩阵做棋盘 16 16 34 43 34 打印棋盘 for for 游戏是否结束 开始下棋 while True 游戏是否结束 xff1a 黑白交替 player 61 0 p 2 61 61 0 61 61 1
  • python面向对象——烤土豆,开枪案例

    烤土豆应用 xff1a 示例属性如下 cookedLevel 这是数字 xff1b 0 3表示还是生的 xff0c 超过3表示半生不熟 xff0c 超过5表示已 经烤好了 xff0c 超过8表示已经烤成木炭了 xff01 我们的地瓜开始时时

随机推荐

  • linux 如何查看端口被哪个进程占用?

    1 lsof i 端口号 2 netstat tunlp grep 端口号 都可以查看指定端口被哪个进程占用的情况 步骤一 lsof i lsof i 用以显示符合条件的进程情况 lsof xff08 list open files 是一个
  • 学习Hadoop——Zookeeper 介绍

    Zookeeper 是一个开源的分布应用程序协调服务 xff0c 来自于Google 一个开源的实现 xff0c 是Hadoop 和HBase 的重要组件 Zookeeper 可以为分布式应用提供一致性服务 xff0c 功能包括 xff1a
  • 数据库中的CAP原理

    去年在参加盒子科技秋招笔试题中遇到过 xff0c 印象深刻 xff0c 一直想要查资料总结下来 这个理论是由美国著名科学家 xff0c 同时也是著名互联网企业Inktomi的创始人Eric Brewer在2000年PODC Symposiu
  • downloadingSpring(Failed to download)下载失败的解决办法

    如下图所示报错 解决办法 点击Set up HTTP proxy settings 点击后 xff0c 在第二项添加华为Maven仓库https mirrors huaweicloud com repository maven 点击Try
  • 如何将本地文件复制到远程服务器

    首先 xff0c 点击windows开始按钮 xff0c 点击运行 xff08 windows 7系统请按windows快捷键 43 R xff09 xff0c 输入mstsc xff0c 点击确定 在弹出来的对话框中 xff0c 输入服务
  • 用xstart远程连接linux图形用户界面

    有时工作中 xff0c 我们需要用到linux图形用户界面环境进行一些操作 xff08 比如装oracle数据库等等 xff09 xff0c 这时就需要用xstart远程连接linux图形用户界面 xff0c 这样我们就不用特意跑到机房操作
  • SpringDataJpa 动态复杂查询NativeQuery

    SpringDataJpa 动态复杂查询NativeQuery emm挺长时间没更新了 xff0c 最近在忙项目 xff0c 外加搬家 后续会继续更新 遇到一个复杂的sql查询 xff0c 在不通过外键关联的情况下 xff0c 只能选择使用
  • 又见一帘幽梦

    又见一帘幽梦 最是魂断伤心处 xff0c 浮生若残梦 冷遇秋 xff0c 夕阳下 xff0c 碧野又清空 xff0c 泪眼朦胧 一帘幽梦红尘路 xff0c 爱深处 xff0c 情留驻 秋菊相思 xff0c 旭日重生 xff0c 无奈生死殊途
  • Openfeign ErrorDecoder caused java.io.IOException: stream is closed

    实现错误解码器 保留 feign 服务异常信息 xff0c 左侧是之前设计的 偶尔下游系统出现异常时 xff0c 拿到返回结果时 xff0c 居然会是stream is closed xff0c 就找了下原因 Don 39 t use an
  • 鞋厂园区--稳食生涯--2017~2018

    2017年初 进入广州的鞋类企业搞数字化新零售中台业务开发 这个地方 应该是我进入电商新零售业务的启蒙和提升之地 不但学习了线上线下的电商与门店业务 也学习了完整的一套新零售中台业务技术架构和整体的微服务演变进程 同时也应该算是收获最多朋友
  • 棉类工业园--奋斗的故事--2018~2020

    nbsp 2018年8月 进入深圳的工业园继续搞数字化新零售中台业务开发 18年初步规划设计 从0到1打造整个电商与新零售中台体系 1 用户中心 用户表 角色表 系统表 菜单表 用户角色表 角色菜单表 角色系统表 数据范围表 用户数据范围
  • 不是我写的原文

    青春的尾声悄然敲响 xff0c 我站在尽头送别剩下为数不多的光阴 婚礼上同学聚会上 xff0c 越来越多的人开始为人妻为人母 xff0c 我们在经受着一场不可逆的转变 转变以前是快乐的 xff0c 转变后也会是另一种快乐 xff0c 但是转
  • 我这是一条什么路

    首先 xff0c 我从未在这里发表博客 xff0c 有些胆战 其次 xff0c 我技术不精 xff0c Java web php Android 再次 xff0c 没有共享过源码 xff0c 倒是从不少开源代码获益 最后 xff0c 这也许
  • 在珠海的一年

    时间倒退到2013年 作为应届生 xff0c 初入职场 xff0c 来到珠海 xff0c 开始了我IT生涯的第一步 以Java初级程序员的身份 xff0c 加入一家港企 xff0c 位于珠海的香洲区唐家湾镇 xff0c 还真的是一个镇啊 一
  • Hadoop的构造模块

    Hadoop集群中运行的守护进程共有5类 xff1a NameNodeDataNodeSecondary NameNodeJobTrackerTaskTracker Hadoop集群中的机器 节点 分为2类 xff1a 主节点和从节点 xf
  • 通过yum来进行mysql的安装

    1 卸载掉原有mysql rpm qa grep mysql 这个命令就会查看该操作系统上是否已经安装了mysql数据库 rpm e mysql 普通删除模式 rpm e nodeps mysql 强力删除模式 xff0c 如果使用上面命令
  • 因为咳嗽

    看了下我曾写过的博客 xff0c 居然发现年初的时候 xff0c 原来也咳嗽的撕心裂肺一次 xff0c 而这次又发作了 xff0c 我预估这是一种很严重的肺炎 xff0c 但还没去医院检测过 xff0c 心情甚是忧伤 回头望了下自己这几年写
  • VC++ 学习笔记------Window 多线程(生产消费者模式 案例)

    理论部分参考 这篇文章讲生产 消费者模式比较详细 http ifeve com producers and consumers mode 使用VC 43 43 模式实现如 xff1a span class hljs comment 创建信号
  • 微服务横行的今天, 你的文档跟上节奏了么?

    转载自 xff1a https blog maxleap cn archives 1241 说起微服务 想必现在的技术圈内人士个个都能谈笑风云 娓娓道来 的确 技术变革日新月异 各种工具框架雨后春笋般涌现 现在我们可以轻巧便捷地根据自己的业
  • 微服务实战:从架构到发布(一)

    转载自 xff1a https blog maxleap cn archives 195 引言 xff1a 微服务 是当前软件架构领域非常热门的词汇 xff0c 能找到很多关于微服务的定义 准则 xff0c 以及如何从微服务中获益的文章 x