微服务
什么是微服务?
微:单个服务的设计,所有参与人从设计、开发、测试、运维所有人加起来只需要两个披萨就够了
服务:一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知的最小功能集
微服务是一种架构,这种架构是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通常实现一组独立的特性或功能,包含自己的业务逻辑和适配器。各个微服务之间的关联通过暴露API来实现。这些独立的微服务不需要部署在同一个虚拟机,同一个系统和同一个应用服务器中。
微服务的由来
微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。
为什么需要微服务?
在传统的IT行业软件大多是各种独立系统的堆砌,这些系统的问题总结来说就是拓展性差,可靠性不高,维护成本高。到后面引入了SOA服务化,但是,由于 SOA 早期均使用了总线模式,这种总线模式是与某种技术栈强绑定的,比如:J2EE。这导致很多企业的遗留系统很难对接,切换时间太长,成本太高,新系统稳定性的收敛也需要一些时间。最终 SOA 看起来很美,但却成为了企业级奢侈品,中小公司都望而生畏。
单体应用系统
单体架构在规模比较小的情况下工作情况良好,但是随着系统规模的扩大,他暴露出来的问题也越来越多,主要有以下几点:
- 复杂性逐渐变高
- 比如有的项目有十几万行的代码,各个模块之间区别比较模糊,逻辑比较混乱,代码越多复杂性越高,越难解决遇到的问题
- 技术债务逐渐上升
- 公司的人员流动是再正常不过的事情,有的员工在离职之前,疏于代码质量的自我管束,导致留下来很多坑,由于单体项目代码量庞大的惊人,留下的坑很难被发觉,这就给新来的员工带来很大的烦恼,人员流动越大所留下的坑越多,也就是所谓的技术债务越来越多。
- 部署速度逐渐变慢
- 单体架构的模块非常多,代码量非常大,导致部署项目所花费的事件越来越多,曾经有的项目启动就要一二十分钟,这是多么恐怖的事情啊,启动几次项目一天的时间就过去了,留给开发者开发的时间就非常少了。
- 阻碍技术创新
- 比如以前的某个项目使用struts2写的,由于各个模块之间有着千丝万缕的联系,代码量大,逻辑不够清楚,如果现在想用spring mvc来重构这个项目将是非常困难的,付出的成本将非常大,所以更多的时候公司不得不硬着头皮继续使用老的struts架构,这就阻碍了技术的创新。
- 无法按需伸缩
- 比如说电影模块是CPU密集型的模块,而订单模块是IO密集型的模块,假如我们要提升订单模块的性能,比如加大内存、增加硬盘,但是由于所有的模块都在一个架构下,因此我们在扩展订单模块的性能时不得不考虑其它模块的因素,因为我们不能因为扩展某个模块的性能而损害其它模块的性能,从而无法按需进行伸缩。
分布式应用系统
由于整个系统运行需要使用到Tomcat和MySQL,单台服务器处理的能力有限,2G的内存需要分配给Tomcat和MySQL使用,随着业务越来越复杂,请求越来越多.。内存越来越不够用了,所以这时候我们就需要进行分布式的部署。
我们进行一个评论的请求,这个请求是需要依赖分布在两台不同服务器上的组件(tomcat和mysql),才能完成的。所以叫分布式系统
分布式和单体项目最大的区别在于分布式的项目是分开部署的,比如说把数据库,MQ,ES,单独放在一台或者多台服务器上。
集群
在上一个例子中其实是存在问题的,当我们任意一个服务器出现单点故障问题,服务就无法继续提供,所以针对这些问题我们会采用集群的方式来解决,那么什么是集群呢?
在单机达到瓶颈时我们会选择增加部署相同服务的服务器,来构成集群。集群中每个服务器都叫一个节点,每个节点提供相同的服务。这样不论是高可用还是负载均衡都可以通过集群的方式来实现,而负载均衡的方式也有很多:nginx做七层的负载,lvs做四层的负载,以及硬件的负载F5。高可用则是通过keepalived来实现
系统架构的演变
架构的演变大致为:单一应用架构—》垂直应用架构—》分布式服务架构—》流动计算架构微服务—》······
单一应用架构
互联网早期,一般网站应用流量较少,只需要一个应用,将所有代码都部署在一起就可以了,这样可以减少开发、部署和维护成本
比如说一个电商系统,里面会包含很多用户管理,商品管理,订单管理,物流管理等等很多模块,我们会把它们做成一个web项目,然后部署到一台tomcat服务器上。
他的优点在于:
- 项目部署简单,小型项目的话,开发成本低
- 项目部署在一个节点上,维护容易
- 他的缺点也是显而易见
缺点:
- 全部功能集成在一个工程中,对于大型项目来讲不易开发和维护
- 项目模块之间紧密耦合,单点容错率低
- 无法针对不同的模块进行针对性优化和水平扩展
垂直应用架构
随着访问量的逐渐增大,单一应用只能依靠增加节点来应对,但是这时候会发现并不是所有模块都会有比较大的访问量
还是以上面的电商为例子, 用户访问量的增加可能影响的只是用户和订单模块, 但是对消息模块的影响就比较小. 那么此时我们希望只多增加几个订单模块, 而不增加消息模块. 此时单体应用就做不到了, 垂直应用就应运而生了。
所谓的垂直应用架构,就是将原来的一个应用拆成互不相干的几个应用,以提升效率。比如我们可以将上面电商的单体应用拆分成:
- 电商系统(用户管理 商品管理 订单管理)
- 后台系统(用户管理 订单管理 客户管理)
- CMS系统(广告管理 营销管理)
这样拆分完毕之后,一旦用户访问量变大,只需要增加电商系统的节点就可以了,而无需增加后台和CMS的节点。
他的优点在于:
- 系统拆分实现了流量分担,解决了并发问题,而且可以针对不同模块进行优化和水平扩展。一个系统的问题不会影响到其它系统,提高容错率。
缺点:
- 系统之间相互独立,无法进行相互调用
- 系统之间相互独立,会有重复的开发任务
分布式架构
当垂直应用越来越多,重复的业务代码就会越来越多。这时候,我们就思考可不可以将重复的代码抽取出来,做成统一的业务层作为独立的服务,然后由前端控制层调用不同的业务层服务呢? 这就产生了新的分布式系统架构。它将把工程拆分成表现层和服务层两个部分,服务层中包含业务逻辑。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
优点:
- 抽取公共的功能为服务层,提高代码的复用性
缺点:
- 系统间耦合度变高,调用关系错综复杂,难以维护
SOA架构
在分布式架构下,当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心对集群进行实时管理。此时,用于资源调度和治理中心(SOA Service Oriented Architecture,面向服务的架构)是关键。
优点:
- 使用注册中心解决了服务间调用关系的自动调节
缺点:
- 服务间会有依赖关系,一旦某个环节出错会影响较大(服务雪崩)
- 服务关系复杂,运维、测试部署困难
注册中心: nacos ,zookeeper ,nacos ,eureka,consul
微服务架构
微服务架构在某种程度上是面向服务的架构,他更加强调服务的彻底拆分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bZmn75TH-1691465345847)(C:\Users\admin\Desktop\markdown\微服务架构.png)]
优点:
- 服务原子化拆分,独立打包、部署和升级,保证每个微服务清晰的任务划分,利于拓展
- 微服务之间采用RESTful等轻量级http协议相互调用
- 服务各自有自己的单独的职责,服务之间松耦合,避免因一个模块的问题导致服务崩溃
缺点:
- 分布式系统开发的技术成本高(容错、分布式事务)
- 服务治理和服务监控关键
- 多服务运维难度,随着服务的增加,运维的压力也在增大
微服务需要解决的问题
微服务架构,简单来叔就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目
微服务架构的常见问题
- 这么多小服务,如何管理他们?
- 这么多小服务,他们之间如何通讯?
- 这么多小服务,客户端怎么访问他们?
- 这么多小服务,一旦出现问题了,应该如何自处理?
- 这么多小服务,一旦出现问题了,应该如何排错?
这些问题是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决
微服务架构的常见概念
服务治理
服务治理就是进行服务的自动化管理,其核心是服务的注册与发现
**服务注册:**服务实例将自身服务信息注册到注册中心
**服务发现:**服务实例通过注册中心,获取到注册到其中的服务实例信息,通过这些信息去请求他们提供服务
**服务剔除:**服务注册中心将出问题的服务自动剔除到可用列表之外,使其不会被调用到。
服务调用
在微服务架构中,通常存在多个服务之间的远程调用的需求,目前1主流的远程调用的技术有基于HTTP请求的RESTFul接口及基于TCP的RPC协议。
REST(Representational State Transfer):这是一种HTTP调用的格式,更标准,更通用,无论哪种语言都支持http协议。
RPC(Remote Promote Call):一种进程间通信方式。允许像调用本地服务一样调用远程服务。RPC框架的主要目标就是让远程服务调用更简单、透明。RPC框架负责屏蔽底层的传输方式、序列化方式和通信细节。开发人员在使用的时候只需要了解谁在什么位置提供了什么样的远程服务接口即可,并不需要关心底层通信细节和调用过程。
他们之间的区别于联系:
比较项 | RESTFul | RPC |
通讯协议 | HTTP | 一般是TCP |
性能 | 略低 | 较高 |
灵活度 | 高 | 低 |
应用 | 微服务架构 | SOA架构 |
服务网关
随着微服务的不断增多,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信可能出现:
客户端需要调用不同的url地址,增加难度。
在一定的场景下,存在跨域请求的问题。
每个微服务都需要进行单独的身份认证。
为了解决这些问题,API网关顺势而生。
API网关直面意思是将所有API调用统一接入到API网关层,由网关层统一接入和输出。一个网关的基本功能有:统一接入、安全防护、协议适配、流量管控、长短链接支持、容错能力。有了网关之后,各个API服务提供团队可以专注于自己的的业务逻辑处理,而API网关更专注于安全、流量、路由等问题。
服务容错
在微服务当中,一个请求经常会涉及到调用几个服务,如果其中某个服务不可用,没有做服务容错的话,极有可能会造成一连串的服务不可用,这就是雪崩效应。
我们没法预防雪崩效应的发生,只能尽可能去做好容错。服务容错的三个核心思想是:
不被外界环境影响。
不被上游请求压垮。
不被下游响应拖垮。
链路追踪
随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要对一次请求涉及的多个服务链路进行日志记录,性能监控即链路追踪。