微服务架构介绍

e08cb6f80d334f16a8f6d169803e4f11.jpg系统架构的演变

 

 

1、技术架构发展历史时间轴

 

     

 

 ①单机垂直拆分:应用间进行了解耦,系统容错提高了,也解决了独立应用发布的问题,存在单机计算能力瓶颈。

 

   ②集群化负载均衡可有效解决单机情况下并发量不足瓶颈。

 

 

 

 ③服务改造架构

 

       虽然系统经过了垂直拆分,但是拆分之后发现有重复的功能,比如,用户注册、发邮件等等,一旦项目大了,集群部署多了,这些重复的功能无疑会造成资源浪费,所以会把重复功能抽取出来,名字叫"XX服务(Service)"。为了解决服务跟服务如何相互调用,需要一个程序之间的通信协议,所以就有了远程过程调用(RPC),作用就是让服务之间的程序调用变得像本地调用一样的简单。

 

     优点:在垂直架构的基础上解决了业务重用的问题。

 

 ④服务治理

 

  随着业务的增大,基础服务越来越多,调用网的关系由最初的几个增加到几十上百,造成了调用链路错综复杂,需要对服务进行治理。服务治理要求:当服务节点数几十上百的时候,需要对服务有动态的感知,引入了注册中心。当服务链路调用很长的时候如何实现链路的监控。单个服务的异常,如何能避免整条链路的异常(雪崩),需要考虑熔断、降级、限流。服务高可用:负载均衡。典型框架比如有:Dubbo,默认采用的是Zookeeper作为注册中心。

 

 

 

 ⑤微服务时代

 

 微服务是在2012年提出的概念,微服务的希望的重点是一个服务只负责一 个独立的功能。 拆分原则,任何一个需求不会因为发布或者维护而影响到不相关的服务, 一切可以做到独立部署运维。 比如传统的“用户中心”服务,对于微服务来说,需要根据业务再次拆分,可 能需要拆分成“买家服务”、“卖家服务”、“商家服务”等。 典型代表:Spring Cloud,相对于传统分布式架构,SpringCloud使用的是 HTTP作为RPC远程调用,配合上注册中心Eureka和API网关Zuul,可以做到细 分内部服务的同时又可以对外暴露统一的接口,让外部对系统内部架构无感, 此外Spring Cloud的config组件还可以把配置统一管理。

 

 

 

 

 

 

 

 

 

 

 

       Spring Cloud微服务架构存在的不足: Spring Cloud属于侵入式框架,在项目中需要添加spring cloud maven 依赖,加上spring cloud组件注解,写配置,打成jar的时候还必须要把非业务的代码也要融合在一起。 微服务中的服务支持不同语言开发,也需要维护不同语言和非业务代码 的成本; 业务代码开发者应该把更多的精力投入到业务熟悉度上,而不应该是非 业务上,Spring Cloud虽然能解决微服务领域的很多问题,但是学习成本还是较大的。 互联网公司产品的版本升级是非常频繁的,为了维护各个版本的兼容 性、权限、流量等,因为Spring Cloud是“代码侵入式的框架”,这时候 版本的升级就注定要让非业务代码一起,一旦出现问题,再加上多语言之间的调用,工程师会非常痛苦。 我们已经感觉到了,服务拆分的越细,只是感觉上轻量级解耦了,但是维护成本却越高了。

 

 

 

⑥服务网格新时期 (Service Mesh)

 

    Service Mesh主要解决的问题就希望开发人员对于业务的聚焦,服务发 现、服务注册、负载均衡等对于开发人员透明,可以更加专注业务逻辑的实 现。 如果将为微服务提供通信服务的这部分逻辑从应用程序进程中抽取出来, 作为一个单独的进程进行部署,并将其作为服务间的通信代理,可以得到如下 图所示的架构:

 

 

 

     当服务大量部署时,随着服务部署的Sidecar代理之间的连接形成了一个如下图所示的网格,该网格成为了微服务的通讯基础设施层,承载了微服务之间的所有流量,被称之为Service Mesh(服务网格)。

 

 

 

     服务网格中有数量众多的Sidecar代理,如果对每个代理分别进行设置,工作量将非常巨大。为了更方便地对服务网格中的代理进行统一集中控制,在服务网格上增加了控制面组件。

 

 

 

      服务网格用来描述组成这些应用程序的微服务网络以及它们之间的交互。随着服务网格的规模和复杂性不断的增长,它将会变得越来越难以理解和管理。它的需求包括服务发现、负载均衡、故障恢复、度量和监控等。服务网格通常还有更复杂的运维需求,比如 A/B 测试、金丝雀发布、速率限制、访问控制和端到端认证。

 

 

 

Istio

 

    2017年5月24日,Google, IBM 和 Lyft 共同发布 Istio 的第一个公开版本(0.1)。Istio为一款开源的为微服务提供服务间连接、管理以及安全保障的平台软件,支持运行在Kubernetes、Mesos等容器管理工具,但不限于Kubernetes、Mesos,其底层依赖于Envoy。Istio提供一种简单的方法实现服务间的负载均衡、服务间认证、监控等功能,而且无需应用层代码调整。其控制平面由Pilot、Citadel 和 Galley组成,数据平面由Envoy实现,通常情况下,数据平面代理Envoy以sidecar模式部署,使得所有服务间的网络通信均由Envoy实现,而Istio的控制平面则负责服务间流量管理、安全通信策略等功能。

 

istio架构

 

 

 

     实际上Istio 就是 Service Mesh 架构的一种实现,服务之间的通信(比如这里的 Service A 访问 Service B)会通过代理(默认是 Envoy)来进行。而且中间的网络协议支持 HTTP/1.1,HTTP/2,gRPC 或者 TCP,可以说覆盖了主流的通信协议。代理这一层,称之为数据平面。控制平面做了进一步的细分,分成了 Pilot、Citadel 和 Galley,它们的各自功能如下:Pilot:为 Envoy 提供了服务发现,流量管理和智能路由(AB 测试、金丝雀发布等),以及错误处理(超时、重试、熔断)功能。Citadel:为服务之间提供认证和证书管理,可以让服务自动升级成 TLS协议。Galley:Galley 是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来。数据平面会和控制平面通信,一方面可以获取需要的服务之间的信息,另一方面也可以汇报服务调用的 Metrics 数据。

 

 为什么使用 Istio?

 

     通过负载均衡、服务间的身份验证、监控等方法,Istio 可以轻松地创建一个已经部署了服务的网络,而服务的代码只需很少更改甚至无需更改。通过在整个环境中部署一个特殊的 sidecar 代理为服务添加 Istio 的支持,而代理会拦截微服务之间的所有网络通信,然后使用其控制平面的功能来配置和管理Istio,这包括:为 HTTP、gRPC、WebSocket 和 TCP 流量自动负载均衡。通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制。可插拔的策略层和配置 API,支持访问控制、速率限制和配额。集群内(包括集群的入口和出口)所有流量的自动化度量、日志记录和追踪。在具有强大的基于身份验证和授权的集群中实现安全的服务间通信。Istio 为可扩展性而设计,可以满足不同的部署需求。

 

    

 

二、架构特点分析

 

1 单体应用架构(ALL IN ONE)

 

   单体应用架构应用大部分都是一个WAR包或者JAR包,包含前端页面,后端三层架构(web层,service层,dao层),即将所有的功能模块打包到一起并放在一个web容器中(如tomcat)运行。

 

   

 

优点: 所有功能集成在一个项目工程中,项目架构简单,前期开发成本低,要快速增加新功能或部署发布都比较简单,小型项目的首选,项目初期是一种比较好的方案。

 

缺点: 对于大型项目不易扩展。 系统性能受限,系统性能扩展只能通过扩展集群节点的方式,成本高,技术栈受限,有瓶颈。

 

2 垂直应用架构

 

   随着用户量越来越多,系统的压力也随之增长。当并发访问量提高到一定程度,单一应用通过增加机器提高性能的方式瓶颈越来越明显,在系统不能支撑当前的用户量后,需要将项目按照不同的业务来做拆分,拆分为多个子系统,系统之间通过Webservice或者HTTP接口来进行交互,系统不再那么臃肿了。当其中某一个模块使用的频率比较高,就对这个模块进行扩展,即多部署几个节点。再加一个Nginx用于负载均衡,刚开始还没什么大问题,当子系统越来越多的时候,每个子系统前面都要加一层负载,对运维人员来说工作量就增加了,因为要维护的也增多了。

 

 

 

优点: 通过垂直拆分,可在一定程度上突破原来单体应用的并发访问瓶颈,不同的子项目可采用不同的技术,技术栈相对丰富。

 

缺点:①随着用户量的增加及系统性能的提升,需要拆分的子项目越来越多,运维成本大幅度提升。

 

   ②按照业务拆分的子系统,各个子系统之间存在重合的服务,如用户注册、邮件发送等,重复的功能会造成资源浪费,需要进一步抽取公共功能作为独立服务。

 

3 分布式SOA架构

 

3.1 SOA

 

  SOA 全称为 Service-Oriented Architecture,即面向服务的架构。它可以根据需求通过网络对松散耦合的粗粒度应用组件(服务)进行分布式部署、组合和使用。一个服务通常以独立的形式存在于操作系统进 程中。 站在功能的角度,把业务逻辑抽象成可复用、可组装的服务,通过服务的编排实现业务的快速再生,目的是把原先固有的业务功能转变为通用的业务服务,实现业务逻辑的快速复用。 即SOA 有如下几个特点:分布式、可重用、扩展灵活、松耦合。

 

  当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求

 

 

 

优点: 抽取公共的功能为服务,提高开发效率对不同的服务进行集群化部署解决系统压力 基于ESB/DUBBO减少系统耦合。

 

缺点: 抽取服务的粒度较大 服务提供方与调用方接口耦合度较高。

 

3.2 微服务架构

 

 

 

优点: 通过服务的原子化拆分,以及微服务的独立打包、部署和升级,小团队的交付周期将缩短,运维成 本也将大幅度下降 微服务遵循单一原则。微服务之间采用Restful等轻量协议传输。

 

缺点: 微服务过多,服务治理成本高,不利于系统维护。 分布式系统开发的技术成本高(容错、分布式事务等)。

 

 3.3 SOA与微服务的关系

 

  SOA( Service Oriented Architecture )“面向服务的架构”:是一种设计方法,其中包含多个服 务,服务之间通过相互依赖最终提供一系列的功能。一个服务通常以独立的形式存在与操作系统进程中。各个服务之间 通过网络调用。

 

  微服务架构:其实和 SOA 架构类似,微服务是在 SOA 上做的升华,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。 这些小应用之间通过服务完成交互和集成。

 

 

 

4 分布式核心知识

 

1) 分布式中的远程调用

 

    在微服务架构中,通常存在多个服务之间的远程调用的需求。远程调用通常包含两个部分:序列化和通信协议。常见的序列化协议包括json、xml、hession、protobuf、thrift、text、bytes等,目前主流的远程调用技术有基于HTTP的RESTful接口以及基于TCP的RPC协议。

 

 (1)RESTful接口 REST,即Representational State Transfer的缩写,如果一个架构符合REST原则,就称它为RESTful架 构。

 

  资源(Resources)

 

  所谓"资源",就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图 片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它, 每种资

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

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

相关文章

Spring修炼之路--基础知识

一、核心概念 1.1软件模块化 软件模块化是一种软件开发的设计模式,它将一个大型的软件系统划分成多个独立的模块,每个模块都有自己的功能和接口,并且能够与其他模块独立地工作1. 软件模块化设计可以使软件不至于随着逐渐变大而变得不可控&am…

【ICASSP 2023】ST-MVDNET++论文阅读分析与总结

主要是数据增强的提点方式。并不能带来idea启发,但对模型性能有帮助 Challenge: 少有作品应用一些全局数据增强,利用ST-MVDNet自训练的师生框架,集成了更常见的数据增强,如全局旋转、平移、缩放和翻转。 Contributi…

Vulnhub实战-DC9

前言 本次的实验靶场是Vulnhub上面的DC-9,其中的渗透测试过程比较多,最终的目的是要找到其中的flag。 一、信息收集 对目标网络进行扫描 arp-scan -l 对目标进行端口扫描 nmap -sC -sV -oA dc-9 192.168.1.131 扫描出目标开放了22和80两个端口&a…

Python 之利用matplotlib.pyplot 生成图形和图表

文章目录 介绍运用 介绍 matplotlib.pyplot是Matplotlib库的一个子模块,它提供了一个简单的界面来创建各种类型的图形和图表。使用pyplot,您可以轻松创建、定制和显示图形,而无需编写大量的底层代码。以下是matplotlib.pyplot的一些常见用法…

天然气跟踪监管系统具体实现

物资跟踪监管系统具体实现 系统开发环境框架设计(1)在VS2017中创建一个项目工程(2)在web目录下新建一个index.htm页面,② 与前端界面和操作相关框架文件③ 自定义文件。 物资跟踪监管系统基于Leaflet开发库实现&#x…

虚拟机已经启动 但是xshell连接不上服务器

目录 一:关于ping的问题二.网络的问题--找到控制面板三:防火墙的问题 一:关于ping的问题 1.虚拟机ping百度 观察虚拟机是否有网络 2.windows下ping linux的ip地址 ping 虚拟机地址 3.linux下ping windows 二.网络的问题–找到控制面板 三:防火墙的问题…

21天学会C++:Day9----初识类与对象

CSDN的uu们,大家好。这里是C入门的第九讲。 座右铭:前路坎坷,披荆斩棘,扶摇直上。 博客主页: 姬如祎 收录专栏:C专题 目录 1. 面向过程与面向对象 2. 类的定义 3. 类中的访问限定符 3.1 访问限定符的…

基于Java的新能源充电系统的设计与实现(亮点:完整合理的充电流程,举报反馈机制、余额充值、在线支付、在线聊天)

新能源充电系统 一、前言二、我的优势2.1 自己的网站2.2 自己的小程序(小蔡coding)2.3 有保障的售后2.4 福利 三、开发环境与技术3.1 MySQL数据库3.2 Vue前端技术3.3 Spring Boot框架3.4 微信小程序 四、功能设计4.1 主要功能描述 五、系统实现5.1 完整充…

xss渗透(跨站脚本攻击)

一、什么是XSS? XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了。 这里我们主要注意四点: 1、目标网站目标用户; 2、浏览…

Linux:centos9的本地yum仓库配置

其实9和7的配置方法是差不多一样的,只不过你使用7的本地yum仓库里面直接挂载就可以直接把仓库位置指向挂载点 具体可以看我往期文章,但是先看完我下面的描述再去看我链接的文章才能看懂如何配置centos9的yum仓库 Linux:YUM仓库服务_鲍海超-…

C#实现钉钉自定义机器人发送群消息帮助类

一、自定义机器人发送群消息使用场景 在企业中,针对一些关键指标内容(如每天的生产产量、每天的设备报警信息等信息),需要同时给多人分享,此时就可以将需要查看这些数据的人员都拉到一个群中,让群里的机器人将这些关键指标内容推送到群里即可【(目前已实现在钉钉群里创建…

STM32 学习笔记1:STM32简介

1 概述 STM32,从字面上来理解,ST 是意法半导体,M 是 Microelectronics 的缩写,32 表示 32 位,合起来理解,STM32 就是 ST 公司开发的 32 位微控制器。是一款基于 ARM 公司推出的基于 ARMv7 架构的 32 位 Co…

elasticsearch16-聚合API

个人名片: 博主:酒徒ᝰ. 个人简介:沉醉在酒中,借着一股酒劲,去拼搏一个未来。 本篇励志:三人行,必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》,SpringCloud…

unity学习第1天

本身也具有一些unity知识,包括Eidtor界面使用、Shader效果实现、性能分析,但对C#、游戏逻辑不太清楚,这次想从开发者角度理解游戏,提高C#编程,从简单的unity游戏理解游戏逻辑,更好的为工作服务。 unity201…

AWS创建实例 启用/禁用 自动分配公有 IP

给AWS新账户做完了对等连接,因为默认VPC网段都冲突 就换了VPC,然后发现新VPC内创建的实例都没有分配公网IP地址,自动分配公网IP地址变成了禁用。后续建机子需要手动修改成启用太麻烦了。 在VPC里面找到编辑子网设置,勾上启用自动…

【电子元件】常用电子元器件的识别之电阻器

目录 前言1. 电阻器的识别1.1 普通电阻器的识别1. 普通电阻器的识别色环电阻器绕线电阻器水泥电阻器贴片电阻器网络电阻器(排阻)保险电阻器精密电阻器2. 电阻器的符号3. 普通电阻器的主要参数标称阻值和允许误差额定功率最高工作电压温度系数1.2 电位器的识别1. 电位器的识别…

【C++初阶】C++STL详解(四)—— vector的模拟实现

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:C初阶 🎯长路漫漫浩浩,万事皆有期待 【C初阶】CSTL详解(三…

全国职业技能大赛云计算--高职组赛题卷①(容器云)

全国职业技能大赛云计算--高职组赛题卷①(容器云) 第二场次题目:容器云平台部署与运维任务1 Docker CE及私有仓库安装任务(5分)任务2 基于容器的web应用系统部署任务(15分)任务3 基于容器的持续…

给yarn/npm包管理设置代理加速nodejs依赖下载的方法

由于墙内网络干扰屏蔽国外网络的原因&#xff0c;在国内下载nodejs依赖是非常缓慢的。 所以为了解决这个问题&#xff0c;必须设置代理&#xff0c;具体方法如下&#xff1a; NPM设置代理&#xff1a; npm config set proxy<http_proxy> NPM删除代理&#xff1a; npm c…

Java8中判断一个对象不为空存在一个类对象是哪个

Java8中判断一个对象不为空存在一个类对象是哪个&#xff1f; 在Java 8中&#xff0c;你可以使用java.util.Optional类来处理可能为空的对象。Optional类可以帮助你优雅地处理空值情况&#xff0c;而不需要显式地进行空值检查。 这是一个简单的Optional示例&#xff1a; imp…