Spring Cloud从入门到精通(一):初识微服务

微服务

随着互联网技术的飞速发展,用户量大量增高,业务场景越来越复杂,传统的单体架构已经很难满足我们的需求。
这时微服务的概念就应运而生,微服务英文名称Microservice,微服务架构的系统是一个分布式系统,按业务领域划分为独立的服务单元,有自动化运维、容错、快速演进的特点
它能够解决传统单体架构系统的痛点,同时也能满足越来越复杂的业务需求。

微服务按照业务来划分,例如支付和商品等业务模块分为不同的服务,当然业务到底怎么拆分合适还需要开发团队去决定。
按业务划分的微服务单元独立部署,运行在独立的进程中,服务之间没有耦合,有非常好的扩展性和复用性。
微服务单元之间的通信方式一般倾向于使用HTTP这种简单的通信机制,更多的时候使用RESTful API。
并且不同的服务可以用不同的语言去实现,之间通过HTTP进行通信。
服务之间也可以通过轻量级的消息总线来通信,例如RabbitMQ等。
服务之间通信的数据格式,一般为JSON、XML,因为这两种格式与语言、平台、通信协议无关。
还有一种用Protobuf进行数据序列化,经过序列化的数据为二进制数据,比JSON更轻量,但是可读性非常差,需要反序列化才能读懂。
但是由于用Protobuf序列化的数据更为轻量,所以在通信协议和数据存储上很受欢迎。
服务之间通过HTTP或者消息总线方式进行通信,存在弊端,其通信机制是不可靠的,虽然成功率很高,但是会有失败的时候。

微服务的一个特点就是按业务划分服务,服务之间无耦合,就连数据库也是独立的。
一个典型的微服务的架构就是每个微服务都有自己独立的数据库,数据库之间没有任何联系。
好处是数据库独立,单业务的数据量少,易于维护,迁移也很方便。

优点:
(1)将复杂的业务分解成若干小的业务,每个业务拆分为一个服务,将复杂的问题简单化。新人加入团队,只需要了解他所管理的服务代码。
(2)服务之间没有任何耦合,随着业务的增加,可以根据业务再拆分服务,具有极强的横向扩展能力
(3)出现问题只需要修改某个服务,并且进行测试和部署。

分布式系统有一个著名的CAP理论。即CAP是不可能被同时满足的,最多两种,所以应该根据系统有所取舍。
Consistency 数据的强一致性。如果写入某个数据成功,之后读取,读到的都是新写入的数据。
Availability 服务的可用性。
Partition-tolerance:分区容错。
在分布式系统中,P是基本要求,当我们选择AP时,数据的一致性就是我们要面临的巨大问题。
这就需要用到大家一直很为头疼的分布式事务,以后我们会专门来学习分布式事务的解决方案。

Spring Cloud

Spring Cloud是一个基于Spring Boot实现的微服务架构开发工具。他提供了微服务开发所需的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等组件。 Spring Cloud的目标就是通过提供一系列的开发组件和框架,帮助开发者迅速的搭建一个分布式系统.

微服务系统主要应该具有以下这些功能。

(1) 服务的注册与发现
微服务系统由多个服务组成,而每个服务可能又有众多实例,服务数量众多,服务之间的相互依赖构成网状结构,所以微服务系统需要一个服务注册中心来统一管理微服务实例,方便查看每个微服务实例的健康状态。
服务注册是指向服务注册中心注册一个服务实例,服务提供者将自己的服务信息(服务名、ip地址等)告知服务注册中心,服务发现是指当服务消费者需要消费另外一个服务时,服务注册中心能够告知服务消费者它所要消费服务的实例信息(服务名、ip地址等)。通常情况下,一个服务既是服务提供者,也是服务消费者。服务消费者一般使用HTTP协议或者消息组件这种轻量级的通信机制来进行服务消费。
服务消费中心会提供服务的健康检查方案,检查被注册的服务是否可用。通常一个服务实例注册后,会定时向服务注册中心提供"心跳",以表明自己还处于可用的状态。当一个服务实例停止向服务注册中心提供心跳一段时候后,服务注册中心会认为该服务实例不可用,会将该服务实例从服务注册列表中剔除。如果这个被剔除的服务实例过段时间继续向注册中心提供心跳,那么服务注册中心就会将该服务实例重新加入到服务注册中心的列表中。微服务的服务注册组件都会提供可查看的UI界面,可以很清晰的查看服务的健康状态。

(2)服务的负载均衡
微服务架构中,服务之间的相互调用一般是通过HTTP协议来实现的。为了保证高可用,服务往往是集群化的,那么服务消费者该调用哪个服务提供者实例呢?这就涉及到了服务的负载均衡。
服务的负载均衡一般做法是,由于每个服务都需要向服务注册中心注册,服务注册中心持有每个服务的应用名和ip,同时每个服务也会或者服务注册列表信息。服务消费者集成负载均衡组件,该组件会获取服务注册列表信息,每隔一段时间进行更新。当服务消费者消费服务时,负载均衡组件通过一定的负载均衡策略(开发者可以配置),选择一个服务提供者实例,向该实例进行消费,从而实现负载均衡。
服务注册中心不仅需要定时接收每个服务的心跳,而且每个服务会定期获取服务注册列表的信息,当服务实例数量很多时,服务注册中心承担了很大的负载。由于注册中心在微服务系统中的作用很重要,所以必须保证高可用,一般的做法是将服务注册中心集群化,每个服务注册中心的数据实时同步。

在这里插入图片描述

(3)服务的容错
服务之间的依赖错综复杂,如果一个服务不可用,会影响到依赖这个服务的其他服务,用户的请求都处于阻塞状态,在高并发的场景下,短时间内会造成服务器的线程资源消耗殆尽,最后造成整个系统处于瘫痪状态,也就是雪崩效应。
为了解决分布式系统的雪崩效应,分布式系统引进了熔断器机制。原理为当服务处理用户请求的失败次数大于设定的阀值时,说明服务出了故障,打开熔断器,这时所有的请求会执行快速失败,不执行业务逻辑。
当处于打开状态的熔断器一段时间后会自动转换为半打开状态,并执行一定数量的请求,剩余的请求会执行快速失败,若执行的请求失败了,则继续打开熔断器,否则关闭熔断器。
这种熔断器机制有着非常重要的意义,不仅可以防止系统雪崩,而且自我修复能力也大大减少了工作量。

(4)服务网关
微服务系统通过将资源以API接口的形式暴露给外界来提供服务。在微服务系统中,API接口资源通常是由服务网关统一暴露,内部服务不直接对外提供API资源的暴露,这样做的好处是将内部服务隐藏起来,在一定程度上保护了微服务系统的安全。服务网关通常有请求转发的作用,另外它可能需要负责一定的安全验证,例如判断某个请求是否合法、是否具有权限等。
通常情况下,网关层以集群的形式存在。在服务网关层之前,可能还需要加上负载均衡层,通过一定的路由策略,将请求转发到网关层。到达网关层后,通过一系列的用户身份验证、权限验证,最后转发到具体的服务。
网关还可以实现监控功能,实时日志输出,对请求进行记录。
还可以用来做流量监控,在高流量的情况下,对服务进行降级。

在这里插入图片描述

(5)服务配置的统一管理
在实际开发的过程中,每个服务都有大量的配置文件,例如数据库配置、日志级别配置等等,对于大量的服务,配置文件的管理也是很复杂的一件事情。
服务配置的统一管理过程如下:
首先,配置服务读取配置文件仓库的配置信息。
配置服务启动后,读取配置文件信息,读取完成的配置信息存放在配置服务的内存中。
当启动服务A、B时,由于服务A、B指定了向配置服务读取配置信息,服务A、B则向配置服务读取自己的配置信息。
当服务的配置信息需要修改且修改完成后,向配置服务发送Post请求进行刷新,这时服务A、B会向配置服务重新读取配置文件。

(6)服务链路追踪
微服务系统往往有众多的服务,服务与服务之间相互调用,关系错综复杂,一旦出现了异常,问题就难于去定位。而链路追踪会跟进请求有哪些服务参加,参与的顺序又是怎样,从而使请求链路清晰可见,准确地定位到相关问题。

版本说明

Spring Cloud是一个拥有诸多子项目的大型综合项目,其包含的各个子项目也都独立进行着内容更新和迭代,各自维护着自己的发布版本号。为了避免Spring Cloud的版本号和其子项目混淆,Spring Cloud通过命名的方式来区分版本。
版本的名字采用伦敦地铁站的名字,根据字母表的顺序来对应版本时间顺序,例如最早的Release版本为Angel,第二个Release版本为Brixton。
当一个版本的发布内容积累到临界点或者一个严重bug被解决后,就会发布一个"service release" 版本,简称SRX版本,X为递增的数字。
我们在后面的学习中就使用Finchley版本。

在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值