微:单个服务的设计,所有参与人从设计、开发、测试、运维所有人加起来只需要两个披萨就够了
服务:一定要区别于系统,服务一个或者一组相对较小且独立的功能单元,是用户可以感知的最小功能集
微服务是一种架构,这种架构是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通常实现一组独立的特性或功能,包含自己的业务逻辑和适配器。各个微服务之间的关联通过暴露API来实现。这些独立的微服务不需要部署在同一个虚拟机,同一个系统和同一个应用服务器中。
微服务最早由Martin Fowler与James Lewis于2014年共同提出,微服务架构风格是一种使用一套小服务来开发单个应用的方式途径,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API,这些服务基于业务能力构建,并能够通过自动化部署机制来独立部署,这些服务使用不同的编程语言实现,以及不同数据存储技术,并保持最低限度的集中式管理。
在传统的IT行业软件大多是各种独立系统的堆砌,这些系统的问题总结来说就是拓展性差,可靠性不高,维护成本高。到后面引入了SOA服务化,但是,由于 SOA 早期均使用了总线模式,这种总线模式是与某种技术栈强绑定的,比如:J2EE。这导致很多企业的遗留系统很难对接,切换时间太长,成本太高,新系统稳定性的收敛也需要一些时间。最终 SOA 看起来很美,但却成为了企业级奢侈品,中小公司都望而生畏。
单体架构在规模比较小的情况下工作情况良好,但是随着系统规模的扩大,他暴露出来的问题也越来越多,主要有以下几点:
由于整个系统运行需要使用到Tomcat和MySQL,单台服务器处理的能力有限,2G的内存需要分配给Tomcat和MySQL使用,随着业务越来越复杂,请求越来越多.。内存越来越不够用了,所以这时候我们就需要进行分布式的部署。
我们进行一个评论的请求,这个请求是需要依赖分布在两台不同服务器上的组件(tomcat和mysql),才能完成的。所以叫分布式系统
分布式和单体项目最大的区别在于分布式的项目是分开部署的,比如说把数据库,MQ,ES,单独放在一台或者多台服务器上。
在上一个例子中其实是存在问题的,当我们任意一个服务器出现单点故障问题,服务就无法继续提供,所以针对这些问题我们会采用集群的方式来解决,那么什么是集群呢?
在单机达到瓶颈时我们会选择增加部署相同服务的服务器,来构成集群。集群中每个服务器都叫一个节点,每个节点提供相同的服务。这样不论是高可用还是负载均衡都可以通过集群的方式来实现,而负载均衡的方式也有很多:nginx做七层的负载,lvs做四层的负载,以及硬件的负载F5。高可用则是通过keepalived来实现
架构的演变大致为:单一应用架构—》垂直应用架构—》分布式服务架构—》流动计算架构微服务—》······
互联网早期,一般网站应用流量较少,只需要一个应用,将所有代码都部署在一起就可以了,这样可以减少开发、部署和维护成本
比如说一个电商系统,里面会包含很多用户管理,商品管理,订单管理,物流管理等等很多模块,我们会把它们做成一个web项目,然后部署到一台tomcat服务器上。
他的优点在于:
缺点:
随着访问量的逐渐增大,单一应用只能依靠增加节点来应对,但是这时候会发现并不是所有模块都会有比较大的访问量
还是以上面的电商为例子, 用户访问量的增加可能影响的只是用户和订单模块, 但是对消息模块的影响就比较小. 那么此时我们希望只多增加几个订单模块, 而不增加消息模块. 此时单体应用就做不到了, 垂直应用就应运而生了。
所谓的垂直应用架构,就是将原来的一个应用拆成互不相干的几个应用,以提升效率。比如我们可以将上面电商的单体应用拆分成:
这样拆分完毕之后,一旦用户访问量变大,只需要增加电商系统的节点就可以了,而无需增加后台和CMS的节点。
他的优点在于:
缺点:
当垂直应用越来越多,重复的业务代码就会越来越多。这时候,我们就思考可不可以将重复的代码抽取出来,做成统一的业务层作为独立的服务,然后由前端控制层调用不同的业务层服务呢? 这就产生了新的分布式系统架构。它将把工程拆分成表现层和服务层两个部分,服务层中包含业务逻辑。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现。
优点:
缺点:
在分布式架构下,当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心对集群进行实时管理。此时,用于资源调度和治理中心(SOA Service Oriented Architecture,面向服务的架构)是关键。
优点:
缺点:
注册中心: nacos ,zookeeper ,nacos ,eureka,consul
微服务架构在某种程度上是面向服务的架构,他更加强调服务的彻底拆分
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bZmn75TH-1691465345847)(C:\Users\admin\Desktop\markdown\微服务架构.png)]
优点:
缺点:
微服务架构,简单来叔就是将单体应用进一步拆分,拆分成更小的服务,每个服务都是一个可以独立运行的项目
微服务架构的常见问题
这些问题是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每一个问题提供了相应的组件来解决
服务治理就是进行服务的自动化管理,其核心是服务的注册与发现
**服务注册:**服务实例将自身服务信息注册到注册中心
**服务发现:**服务实例通过注册中心,获取到注册到其中的服务实例信息,通过这些信息去请求他们提供服务
**服务剔除:**服务注册中心将出问题的服务自动剔除到可用列表之外,使其不会被调用到。
在微服务架构中,通常存在多个服务之间的远程调用的需求,目前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网关更专注于安全、流量、路由等问题。
在微服务当中,一个请求经常会涉及到调用几个服务,如果其中某个服务不可用,没有做服务容错的话,极有可能会造成一连串的服务不可用,这就是雪崩效应。
我们没法预防雪崩效应的发生,只能尽可能去做好容错。服务容错的三个核心思想是:
不被外界环境影响。
不被上游请求压垮。
不被下游响应拖垮。
随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要对一次请求涉及的多个服务链路进行日志记录,性能监控即链路追踪。