微服务探索与实践—总述

背景

软件开发是一个不断发展的过程,从当初的面向过程为主到如今的面向对象的开发,软件开发者不断探索与实践更加符合时代发展要求的开发模式与架构思想,而这,也在极大程度上提高了软件开发的效率。

微服务是一种架构模式或者说是架构风格,而架构这个词语,相信有很多人都曾试图为它做出明确的定义,可是很难下,因为软件架构也在不断发展,内涵也在不断得到丰富。只是不变的是,我们需要通过软件架构,根据族组织、业务、技术等因素划分出不同的但可以相互协作的应用系统,使得设计出来的系统具有较高的伸缩性、可维护性以及可扩展性。

三层架构

曾经在与朋友讨论微服务的时候,朋友曾经说过三层架构是不是可以避免在某种程度上因架构设计带来的耦合度过大问题,我跟他说应该很难,因为三层就架构更多的关注是统一系统内的职责划分问题,而架构更多的是关注多套系统。这里的话,顺便提一下三层架构,大家对这种架构应该不会陌生,它主要包括表示层、业务逻辑层以及数据访问层,如下图所示

640?wx_fmt=png

可以发现,三层架构方式使得各层的关注点更加清晰,但如果随着业务的扩大,三层架构只是延长了系统的生命周期,并不会对系统架构带来太大的改变。这就需要讨论单体系统带来的问题了。

单体系统

三层架构是一种经典的单体应用架构。单体系统有的特点就是,开发、测试、部署都比较简单,以前我所在的公司,因为性能问题,几乎需要花大力气重构系统的时候,却发现只需要再加几台服务器就可以很简单的解决这个问题了,这说明了系统的水平扩张也非常简单。但即便他这么简单,现在也已经不再推荐去做了。

单体系统意味着公司所有的业务逻辑都被整合进去了,想要一个新人快速上手几乎不太可能,同时老员工离职所带来的风险也是不可估量的。随着大量功能的集成,也对未来新需求的继续集成带来了很大的困难,牵一发而动全身,实在让人无可奈何。更重要的是,互联网的快速发展,要求我们要做到快速开发、快速集成、快速上线、快速迭代,而单体应用很难做到这点,因为很多团队都会要求对系统的核心功能进行回归。

所以从架构角度对系统进行拆分就成了一种必要,SOA也随之诞生,本文不会具体讨论SOA,只会简单说明一下SOA关于系统拆分的理念。SOA是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。相对而言,SOA对系统拆分的力度似乎没有太“微”,但是和微服务思想几乎没有什么太大的区别了。

微服务与SOA

微服务与SOA的区别(由于很多场景下,SOA会使用到ESB,放在这里也方便与微服务做更好的比较,多说一句,ESB逐渐被P2P的虚拟总线所替代),如下图所示

640?wx_fmt=png

通过上图,可以知道微服务与SOA最大的区别在于,SOA使用了ESB来集成基于不同协议的服务之间的交互工作,而微服务去除了中间的管道,以服务化方式进行交互和集成。


SOA微服务架构
关注点关注可重用性的最大化,但服务粒度较大彻底实现服务器的组件化,服务粒度较小,并关注“上下文边界”
通信协议(通常会通过ESB调度)支持多种消息协议使用轻量级协议,推荐使用REST full风格,如HTTP
开发与交付修改时,由于依赖较大,往往牵扯面很大,交付并不灵活可以只是基于一套服务,交付快捷灵活
数据存储可共享数据存储每个微服务拥有独立的数据存储
部署使用通用平台可以不基于通用平台
服务治理共同的治理和标准服务微治理,实时生效
趋势DevOps、持续交付、容器,做的并不是很好DevOps、持续交付、容器在微服务方面的实践非常的丰富

总的来说,微服务是SOA的一个子集或者是升级版,它是SOA在互联网时代发展的必然进化结果,它有力的促进了企业级系统服务架构的实践。

微服务特性

前面有讲过,微服务是一种架构风格,一个大型应用系统有一个或多个微服务组成,系统中的各个微服务可被独立部署,各个微服务之间是松耦合的,每个微服务体现着单一职责原则。它主要有以下特性:

  • 彻底的组件化

    • 彻底的组件化有着极好的灵活性和可替换性,明确了单一职责,它可以在不影响或者极少影响其他业务组件的情况下进行快速迭代与快速交付,也实现了业务的高度内聚

    • 640?wx_fmt=png

  • 技术的异构性

    • 在微服务架构中可以根据不同的业务特征采用不同的技术方向,有针对性的解决具体的业务问题

    • 640?wx_fmt=png

  • 独立存储与部署

    • 每个微服务拥有自己的数据库,并部署在不同的平台上

    • 640?wx_fmt=png

  • 围绕业务组建团队

    • 不同于传统的IT团队,对技能以及职责的区分非常明确,在微服务里,提供以业务为核心,按业务能力组建团队,因此团队成员的技能是跨领域的一体化团队,通常团队不会太大。

    • 640?wx_fmt=png

写到最后

微服务确实有着无可比拟的优势,但是微服务也带来了很大的缺点:

  • 加大分布式系统的复杂度:随着服务的拆分,原先基于进程内通讯的功能被迁移到了进程间通信或者网络通信,增加了不稳定性;也会存在服务版本的变化必须兼容其他服务的问题,从而导致接口版本过多,存有大量的重复代码

  • 测试压力与运维成本:原先的一个系统被拆分出了很多套微服务,这些都需要增加测试与运维的投入

  • 服务治理与监控也非常复杂,需要有人力的投入

所以,微服务的进行,需要根据现状在做决定,切不可为了拆分而拆分

640?wx_fmt=jpeg


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

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

相关文章

这周,全球首个IT技术全中文免费学习平台诞生了!太惊艳!

本周三的Developer Wednesday为大家揭秘了Microsoft Learn网站的全新学习模式一时间Microsoft Learn圈粉无数如果你正在为错过直播而暴风哭泣等一等,看这里!全程高清回播将为你持续解密这一次你一定不可以再错过了哦!什么是Microsoft Learn&…

十分钟了解Kubernetes

何为Kubernetes?最简单的一句话来概括Kubernetes。它就是一套成熟的商用服务编排解决方案。Kubernetes定位在Paas层,重点解决了微服务大规模部署时的服务编排问题。Kubernetes组件介绍了解Kubernetes都是从Pod开始的。Pod是Kubernetes最小的调度单元,所…

【CF1194E】Count The Rectangles【类扫描线】【单调性】【树状数组】

传送门 题意:给定NNN条与坐标轴平行的线段,保证不垂直的线段没有交点,求一共构成多少个矩形(以线段交点为顶点)。 1≤N≤50001\leq N\leq50001≤N≤5000 显然是个数据结构乱搞题。 直觉告诉我们先枚举一条线段。 假…

.NET Core 的过去、现在和未来

在最新的微软 Build 大会主题网站上,微软.NET 程序经理 Scott Hunter 发表了一篇文章,指出.NET Core 是.NET 的未来。去年,微软就已经确认 Visual Studio Live 中的.NET 框架将会被.NET Core 取代。将.NET Core 作为开源开发技术栈在 2014 年…

Visual Basic 兴衰记

这是一篇暴露年龄的文章。为什么这么说?因为现在年轻的程序员可能没有接触过当年红极一时的 Visual Basic。28 年前的 1991 年 4 月,Microsoft 发布了 Visual Basic 1.0 for Windows,次年 9 月,发布了 Visual Basic 1.0 for DOS。…

函数式编程里的Materialization应该翻译成什么?

Materialization是函数式编程里的一个专业术语, 用于特指函数式编程中查询被实际执行并生成结果的这一过程.首先, 搜了一下中文资料, 暂时没有对该词的中文翻译, CSDN\博客园\阿里云上所有关于它的文档都没有做中文翻译, 直接沿用这个英文单词.难道轮到我来创造这个词的中文翻…

Ozon Tech Challenge 2020 (Div.1 + Div.2) E.Kuroni and the Score Distribution 构造

传送门 文章目录题意:思路:题意: 思路: 不难想到,长度为nnn的数组最多的满足条件的三元组序列是1,2,3....,n1,2,3....,n1,2,3....,n,对于每一个位置贡献为i−12\frac{i-1}{2}2i−1​,那么如果m…

Exceptionless(二) - 使用进阶

作者:markjiang7m2原文地址:https://www.cnblogs.com/markjiang7m2/p/11100563.html官网地址:http://letyouknow.net在上一篇文章Exceptionless - .Net Core开源日志框架中就说到如何对Exceptionless进行本地化部署,不过我也跟大家…

基于 Kong 和 Kubernetes 的 WebApi 多版本解决方案

前言大家好,很久没有写博客了,最近半年也是比较的忙,所以给关注我的粉丝们道个歉。去年和朱永光大哥聊的时候提了一下我们的这个方案,他说让我有空写篇博客讲一下,之前是非常的忙,所以这次趁着有些时间就写…

CodeCraft-20 (Div. 2) D. Nash Matrix 构造 + dfs

传送门 文章目录题意:思路:题意: 给定一个n∗nn*nn∗n的矩阵,每个点上面都有一个xi,yix_i,y_ixi​,yi​,表示这个点到xi,yix_i,y_ixi​,yi​这个点停下,当xi−1,yi−1x_i-1,y_i-1xi​−1,yi​−1的时候代表…

从严治码-别人在项目中下毒,我该怎么治?

01 从软考说起从4月份开始,由于备考《系统集成项目管理工程师》的原因,博客没有持续更新,在上半年考试结束之后,又对项目进行了一些收尾的工作。下面就这段时间的学习作一个记录和总结吧。在学习的过程中,提炼了一些自…

学习MVVM设计模式后第一次用于生产

WPF的MVVM设计模式从winform转变到WPF的过程,难点主要还是在MVVM的设计模式。当然,如果依然采用winform的涉及方式,在每个控件背后绑定事件的方式运用在wpf中,依然可行,但是假如GUI改版,其背后绑定的特别为…

netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源

基于netcore2.0 mvc 开发的 快速搭建具有如下特色的后台管理系统用户管理菜单管理角色管理权限管理[精确到按钮])代码生成器代码克隆到本地 用vs2017或以上版本 打开工程。项目结构如下:找到DbModel下面的初始化db脚本里面包含4张表的schema和初始化数据…

asp.net core 系列之Startup

这篇文章简单记录 ASP.NET Core中 ,startup类的一些使用。一.前言在 Startup类中,一般有两个方法:ConfigureServices 方法: 用来配置应用的 service 。 Configure 方法:创建应用的请求处理管道它们都在应用启动时,被AS…

译 | .NET Core 基础架构进化之路(一)

原文:Matt Mitchell翻译:Edi Wang随着 .NET Core 3.0 Preview 6 的推出,我们认为简要了解一下我们基础设施系统的历史以及过去一年左右所做的重大改进会很有用。如果您对构建基础结构感兴趣,或者想要了解我们如何构建与 .NET Core…

剑指 Offer 27. 二叉树的镜像

思路:递归 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:TreeNode* mirrorTree(TreeNode*…

Codeforces Round #626 (Div. 2) D. Present 按位贡献 + 快排新姿势

传送门 文章目录题意:思路:题意: 给你一个长度为nnn的序列aaa,让你计算 n≤4e5,a≤1e7n\le 4e5,a\le 1e7n≤4e5,a≤1e7 思路: 首先这个式子是n2n^2n2的,显然不能直接算,并且异或没有分配律&…

.NET开发框架(一)-框架介绍与视频演示

本文主要介绍一套基于.NET CORE的SPA高并发、高可用的开发框架.我们暂且称它为:(让你懂.NET)开发框架。以此为主线,陆续编写教程,讲述如何构建高并发、高可用的框架。(欢迎转载与分享)它标准化了…

译 | .NET Core 基础架构进化之路(二)

原文:Matt Mitchell翻译:Edi Wang(接上篇 译 | .NET Core 基础架构进化之路(一))Maestro 及依赖流.NET Core 3.0 基础结构难题的最后一部分就是我们所说的依赖项流。这不是 .NET Core 的唯一概念。除非它们…

在.Net Core中实现一个WebSocket路由

Net Core中使用WebSocket默认是没有路由系统的,只能通过Request.Path"/xxx"来判断请求,例如:1 2 3 4 5 6 7 8 91011121314151617181920app.Use(async (context, next) >{ if (context.Request.Path "/ws") { …