微服务(Microservices)和服务网格(Service Mesh)架构概念整理

微服务(Microservices)

在过去的 2016 年和 2017 年,微服务技术迅猛普及,和容器技术一起成为这两年中最吸引眼球的技术热点。而以 Spring Cloud 为代表的传统侵入式开发框架,占据着微服务市场的主流地位。

微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该任务。在所有情况下,每个任务代表着一个小的业务能力。

形像一点来说,微服务架构就像搭积木,每个微服务都是一个零件,并使用这些零件组装出不同的形状。通俗来说,微服务架构就是把一个大系统按业务功能分解成多个职责单一的小系统,并利用简单的方法使多个小系统相互协作,组合成一个大系统。

如果学科派一点,微服务架构就是把因相同原因而变化的功能聚合到一起,而把因不同原因而变化的功能分离开,并利用轻量化机制(通常为 HTTP RESTful API)实现通信。

微服务架构 ≈ 模块化开发 + 分布式计算。

需要注意的是“微服务”与“微服务架构”是有本质区别的。“微服务”强调的是服务的大小,它关注的是某一个点。而“微服务架构”则是一种架构思想,需要从整体上对软件系统进行通盘的考虑。

微服务架构示意图:

常见的微服务组件及概念:

  • 服务注册:服务提供方将自己调用地址注册到服务注册中心,让服务调用方能够方便地找到自己。
  • 服务发现:服务调用方从服务注册中心找到自己需要调用的服务的地址。
  • 负载均衡:服务提供方一般以多实例的形式提供服务,负载均衡功能能够让服务调用方连接到合适的服务节点。并且,节点选择的工作对服务调用方来说是透明的。
  • 服务网关:服务网关是服务调用的唯一入口,可以在这个组件是实现用户鉴权、动态路由、灰度发布、A/B 测试、负载限流等功能。
  • 配置中心:将本地化的配置信息(properties, xml, yaml 等)注册到配置中心,实现程序包在开发、测试、生产环境的无差别性,方便程序包的迁移。
  • API 管理:以方便的形式编写及更新 API 文档,并以方便的形式供调用者查看和测试。
  • 集成框架:微服务组件都以职责单一的程序包对外提供服务,集成框架以配置的形式将所有微服务组件(特别是管理端组件)集成到统一的界面框架下,让用户能够在统一的界面中使用系统。
  • 分布式事务:对于重要的业务,需要通过分布式事务技术(TCC、高可用消息服务、最大努力通知)保证数据的一致性。
  • 调用链:记录完成一个业务逻辑时调用到的微服务,并将这种串行或并行的调用关系展示出来。在系统出错时,可以方便地找到出错点。
  • 支撑平台:系统微服务化后,系统变得更加碎片化,系统的部署、运维、监控等都比单体架构更加复杂,那么,就需要将大部分的工作自动化。现在,可以通过 Docker 等工具来中和这些微服务架构带来的弊端。 例如持续集成、蓝绿发布、健康检查、性能健康等等。严重点,以我们两年的实践经验,可以这么说,如果没有合适的支撑平台或工具,就不要使用微服务架构。

微服务架构的优点:

  • 降低系统复杂度:每个服务都比较简单,只关注于一个业务功能。
  • 松耦合:微服务架构方式是松耦合的,每个微服务可由不同团队独立开发,互不影响。
  • 跨语言:只要符合服务 API 契约,开发人员可以自由选择开发技术。这就意味着开发人员可以采用新技术编写或重构服务,由于服务相对较小,所以这并不会对整体应用造成太大影响。
  • 独立部署:微服务架构可以使每个微服务独立部署。开发人员无需协调对服务升级或更改的部署。这些更改可以在测试通过后立即部署。所以微服务架构也使得 CI/CD 成为可能。
  • Docker 容器:和 Docker 容器结合的更好。
  • DDD 领域驱动设计:和 DDD 的概念契合,结合开发会更好。

微服务架构的缺点:

  • 微服务强调了服务大小,但实际上这并没有一个统一的标准:业务逻辑应该按照什么规则划分为微服务,这本身就是一个经验工程。有些开发者主张 10-100 行代码就应该建立一个微服务。虽然建立小型服务是微服务架构崇尚的,但要记住,微服务是达到目的的手段,而不是目标。微服务的目标是充分分解应用程序,以促进敏捷开发和持续集成部署。
  • 微服务的分布式特点带来的复杂性:开发人员需要基于 RPC 或者消息实现微服务之间的调用和通信,而这就使得服务之间的发现、服务调用链的跟踪和质量问题变得的相当棘手。
  • 分区的数据库体系和分布式事务:更新多个业务实体的业务交易相当普遍,不同服务可能拥有不同的数据库。CAP 原理的约束,使得我们不得不放弃传统的强一致性,而转而追求最终一致性,这个对开发人员来说是一个挑战。
  • 测试挑战:传统的单体WEB应用只需测试单一的 REST API 即可,而对微服务进行测试,需要启动它依赖的所有其他服务。这种复杂性不可低估。
  • 跨多个服务的更改:比如在传统单体应用中,若有 A、B、C 三个服务需要更改,A 依赖 B,B 依赖 C。我们只需更改相应的模块,然后一次性部署即可。但是在微服务架构中,我们需要仔细规划和协调每个服务的变更部署。我们需要先更新 C,然后更新 B,最后更新 A。
  • 部署复杂:微服务由不同的大量服务构成。每种服务可能拥有自己的配置、应用实例数量以及基础服务地址。这里就需要不同的配置、部署、扩展和监控组件。此外,我们还需要服务发现机制,以便服务可以发现与其通信的其他服务的地址。因此,成功部署微服务应用需要开发人员有更好地部署策略和高度自动化的水平。
  • 总的来说(问题和挑战):API Gateway、服务间调用、服务发现、服务容错、服务部署、数据调用。

不过,现在很多微服务的框架(比如 Spring Cloud、Dubbo)已经很好的解决了上面的问题。

 

服务网格(Service Mesh)

2017 年底,非侵入式的 Service Mesh 技术从萌芽到走向了成熟。

Service Mesh 又译作“服务网格”,作为服务间通信的基础设施层

如果用一句话来解释什么是 Service Mesh,可以将它比作是应用程序或者说微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控。对于编写应用程序来说一般无须关心 TCP/IP 这一层(比如通过 HTTP 协议的 RESTful 应用),同样使用 Service Mesh 也就无须关系服务之间的那些原来是通过应用程序或者其他框架实现的事情,比如 Spring Cloud、OSS,现在只要交给 Service Mesh 就可以了。

Service Mesh 的来龙去脉:

  1. 从最原始的主机之间直接使用网线相连
  2. 网络层的出现
  3. 集成到应用程序内部的控制流
  4. 分解到应用程序外部的控制流
  5. 应用程序的中集成服务发现和断路器
  6. 出现了专门用于服务发现和断路器的软件包/库,如 Twitter 的 Finagle 和 Facebook 的 Proxygen,这时候还是集成在应用程序内部
  7. 出现了专门用于服务发现和断路器的开源软件,如 Netflix OSS、Airbnb 的 synapse 和 nerve
  8. 最后作为微服务的中间层 Service Mesh 出现

Service Mesh 有如下几个特点:

  • 应用程序间通讯的中间层
  • 轻量级网络代理
  • 应用程序无感知
  • 解耦应用程序的重试/超时、监控、追踪和服务发现

Service Mesh 架构图:

目前流行的 Service Mesh 开源软件有 Linkerd、Envoy 和 Istio,而最近 Buoyant(开源 Linkerd 的公司)又发布了基于 Kubernetes 的 Service Mesh 开源项目 Conduit。

Service Mesh 开源项目简介:

  • Linkerd(https://github.com/linkerd/linkerd):第一代 Service Mesh,2016 年 1 月 15 日首发布,业界第一个 Service Mesh 项目,由 Buoyant 创业小公司开发(前 Twitter 工程师),2017 年 7 月 11 日,宣布和 Istio 集成,成为 Istio 的数据面板。
  • Envoy(https://github.com/envoyproxy/envoy):第一代 Service Mesh,2016 年 9 月 13 日首发布,由 Matt Klein 个人开发(Lyft 工程师),之后默默发展,版本较稳定。
  • Istio(https://github.com/istio/istio):第二代 Service Mesh,2017 年 5 月 24 日首发布,由 Google、IBM 和 Lyft 联合开发,只支持 Kubernetes 平台,2017 年 11 月 30 日发布 0.3 版本,开始支持非 Kubernetes 平台,之后稳定的开发和发布。
  • Conduit(https://github.com/runconduit/conduit):第二代 Service Mesh,2017 年 12 月 5 日首发布,由 Buoyant 公司开发(借鉴 Istio 整体架构,部分进行了优化),对抗 Istio 压力山大,也期待 Buoyant 公司的毅力。
  • nginMesh(https://github.com/nginmesh/nginmesh):2017 年 9 月首发布,由 Nginx 开发,定位是作为 Istio 的服务代理,也就是替代 Envoy,思路跟 Linkerd 之前和 Istio 集成很相似,极度低调,GitHub 上的 star 也只有不到 100。
  • Kong(https://github.com/Kong/kong):比 nginMesh 更加低调,默默发展中。

关于微服务和服务网格的区别,我的一些理解:微服务更像是一个服务之间的生态,专注于服务治理等方面,而服务网格更专注于服务之间的通信,以及和 DevOps 更好的结合

转载于:https://www.cnblogs.com/jking10/p/11038519.html

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

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

相关文章

python os.listdir列举当前文件夹下所有文件及文件夹

import ospath C:\\Users\\Desktop\\test str os.listdir(path) print(str)运行结果:1、2为文件夹,123.txt为文件

正则查找倒数第二个符合条件的字符串_EXCEL正则表达式的基础语法

正则表达式的基本概念及用途了解之后,我们就来学习下具体的语法,先以一个简单的例子来讲解。基础语法:比如,A1单元格中有一串字符:aabbccddaabbcc,我们要把其中的a找到,然后替换成o。代码如下&a…

javafx css样式_使用CSS设置JavaFX饼图样式

javafx css样式渲染图表时, JavaFX默认提供某些颜色。 但是,在某些情况下,您想自定义这些颜色。 在此博客文章中,我将使用一个示例来更改JavaFX饼图的颜色,该示例打算在今天下午在2013年RMOUG培训日的演示中包括。一些…

java 异步操作

/** * 异步删除 * * param keys */ public void asycExecute(String keys) { ExecutorService executor Executors.newFixedThreadPool(1); CompletableFuture<String> future CompletableFuture.supplyAsync(new Supplier<String>() { Override public String g…

企业发文的红头文件_【红头文件写作格式】 公司红头文件格式范本

红头文件写作格式 一、红头文件的制作及标准进行页面设臵选择“文件”——“页面设臵”选择“页边距”附签&#xff0c;上&#xff1a;3.7厘米&#xff0c;下&#xff1a;3.5厘米&#xff0c;左&#xff1a;2.8厘米&#xff0c;右&#xff1a;2.6厘米。选择“版式”附签&#x…

matlab 城市间最短路径

clear all;clc;close all; %最短路径代码&#xff0c;输入&#xff1a;起点空格终点&#xff08;大写字母&#xff0c;如:A F&#xff09; % 输出最短路径值d 最短路径路线 % W为一个对称矩阵&#xff0c;如果不能直接到达距离为inf % 本例中A到B距离为12; A到F距离为0; B到…

docker开放的端口_关于docker自动开放端口解决方案

在docker中只要有容器映射了端口docker就会自动加iptablesiptables -L -nChain DOCKER (8 references)target prot opt source destinationACCEPT tcp -- 0.0.0.0/0 172.18.0.2 tcp dpt:2379ACCEPT tcp -- 0.0.0.0/0 172.18.0.5 tcp dpt:8888ACCEPT udp -- 0.0.0.0/0 172.18.0.…

即将举行的网络研讨会:调试生产中Java的5种最佳实践

您的团队是否花费超过10&#xff05;的时间在生产环境中调试Java&#xff1f; 将新代码部署到生产中是一项艰巨的任务。 在您的本地环境中起作用的东西在生产中的作用并不相同&#xff0c;您可以通过用户来了解。 不理想吧&#xff1f; 生产中的调试是一个关键要素&#xff0…

保存网页上没有 另存为图片 选项的方法

找到要存储的图片&#xff0c;并点击右键查看源代码 找到图片地址&#xff0c;复制到新的浏览器里打开 将图片 另存为 转载于:https://www.cnblogs.com/lszw/p/11040047.html

BP算法,用梯度下降法更新权值W与偏置项b

Bp算法实际是输出的误差函数对每一个参数求导&#xff0c;输出层可以直接求出&#xff0c;非输出层则有链式法则求导。这里以上图5层神经网络为例进行说明。 一 符号说明&#xff1a; 1)这里使用激活函数为sigmoid函数&#xff1a; &#xff08;1&#xff09; 对sigmoid函数…

字典生成工具_CANOpen系列教程09_CANOpen对象字典

说明&#xff1a;本文原创作者『strongerHuang』首发于微信公众号『嵌入式专栏』&#xff0c;同时也更新在我的个人网站&#xff1a;EmbeddedDevelop标签&#xff1a;CAN、 CANOpen、 CanFestival一、写在前面上一篇文章主要是引导大家学习CANOpen协议通信接口的相关内容。通信…

Java命令行界面(第4部分):命令行

我在Java中进行命令行解析的系列的第四部分介绍了Commandline &#xff0c;它被描述为 “用于解析命令行参数的Java库”&#xff0c;它“基于使用注释从命令行参数到对象的映射”。 像以前介绍的args4j和jbock一样&#xff0c; Commandline使用注释来提供潜在命令行选项的“定…

Dijkstra 计算两地间的最短距离

这里使用Dijkstra(戴克斯特拉)算法&#xff0c;该算法起始点实际计算出到任一点的距离&#xff0c;计算两城市间的距离实际是一个副产物&#xff0c;所有一下图为例来说明&#xff0c;该图为无向图&#xff0c;顶点间所标数字即为两点之间的距离。 问题&#xff1a;求点D到点A的…

Sequence

题目链接&#xff1a;http://dsalgo.openjudge.cn/binarytree/12/ 总时间限制: 3000ms 内存限制: 65536kB描述给定m个数字序列&#xff0c;每个序列包含n个非负整数。我们从每一个序列中选取一个数字组成一个新的序列&#xff0c;显然一共可以构造出n^m个新序列。接下来我们对每…

hadooprbac_rbac权限管理系统的学习

RGBA学习在web开发项目中,有些网页是公开给所有人访问的,但有些网页涉及了某些数据表的增删改查的操作,而某些操作,特别是增改删的操作是一些敏感操作所有需要给不同的用户添加不同的权限&#xff0c;那么问题来了来了,我们需要怎样设置数据表来分配不同权限呢&#xff1f;很显…

api过滤器_了解播放过滤器API

api过滤器随着Play 2.1的热销&#xff0c;很多人开始询问新的Play过滤器API。 实际上&#xff0c;API非常简单&#xff1a; trait EssentialFilter {def apply(next: EssentialAction): EssentialAction }本质上&#xff0c;过滤器只是一个执行一个动作并返回另一个动作的函数…

HTML5中的webSocket、ajax、http

本文原链接&#xff1a;https://cloud.tencent.com/developer/article/1115496 https://cloud.tencent.com/developer/article/1193011 webSocket与ajax、web 一、webSocket与ajax 1、ajax2、webSocket二、webSocket API 1、事件2、方法3、属性4、常量三、webSocket与HTTP四、w…

动态规划,背包问题

背包问题模型&#xff0c;背包问题是一类整数规划问题&#xff0c;叙述如下&#xff1a;设有n件物品&#xff0c;并且第i件物品的重量为&#xff0c;其价值为&#xff0c;而背包能承受的总重量是&#xff0c;问应如何选择这些物品&#xff0c;才可以使背包中所装物品的价值最大…

routing zuul_尚学堂0131之zuul的相关概念及如何性能调优

采用服务名称指定路由方式1.1使用服务名称指定路由的规则是什么&#xff1f;1.2需改配置文件&#xff0c;将路由规则修改为使用服务名称路由。通过服务名, service-id为服务名zuul:routes:E-Book-Product-Provider:path: /suibian/**service-id: E-Book-Product-Provider路由的…

实时通信:使用Spring Boot实现Websocket

在开发Web应用程序时&#xff0c;有时我们需要将服务器事件下推到已连接的客户端。 但是&#xff0c;HTTP并非旨在允许这样做。 客户端打开与服务器的连接并请求数据。 服务器不会打开与客户端的连接并推送数据。 为了解决此限制&#xff0c;建立了一种轮询模式&#xff0c;其…