微服务架构中的问题以及解决方案

在单体架构时,项目的部署、修改都很简单,一旦服务器宕机,则整个服务都不可用。而在微服务中,一个服务可能部署在好几百甚至成千上万台节点上,我们如何管理这些节点的服务,调用服务时,该调用用那一台节点机上的服务,如果调用的服务出故障怎么办,如何监控服务的调用链路等等很多的问题,本篇我们会介绍微服务架构下遇到的问题,以及Spring Cloud给出的解决方案。

配置中心

为何需要配置中心,在微服务中,一个服务可能部署N多个节点,如果需要修改服务中的一个配置,难道我们要去手动修改成百上千个节点?我想就算是十几个或者几个节点,我们都不愿意一个一个手动的去修改吧。所以这个时候我们就需要一个配置中心,由配置中心管理所有服务的配置,当配置需要改变时,我们在配置中心修改配置,然后由配置中心将修改的配置推送到具体的服务,或者告诉服务自己去拉取新的配置。在Spring Cloud中提供了多种配置中心的方案:Spring Cloud Config、Spring Cloud Zookeeper、Spring Cloud Consul,Spring Cloud Nacos等。

服务注册与发现中心

前面我们说过,微服务的部署可能是成百上千台节点机,而且可能会动态的上下线,我们如何知道哪些服务已经上线,哪些服务被下线呢?服务注册与发现就是为了解决该问题。如下图为简单的服务发现与注册中心简图:

在上图中,服务提供者将自己的地址注册到服务注册中心,服务调用者从服务注册中心拉取服务提供者的地址,然后通过拉取到的地址,直接调用服务提供者。服务注册与发现中心帮助我们管理所有的服务。如果有新的服务提供者上线,则会注册到服务注册中心,服务注册中心将地址推送给服务调用者,或者由调用者主动拉取;同理服务提供者下线,服务注册中心会去除该服务。Spring Cloud 中的服务注册与发现中心由Eureka、Spring Cloud Zookeeper、Spring Cloud Consul,Spring Cloud Nacos等。

负载均衡

服务调用者从服务注册发现中心拉取所有的服务,储存为服务列表,那么我们应该调用服务列表的哪一个服务呢?如何能保证服务能尽可能保持最大能力,这个就可以通过负载均衡来实现。我们可以通过负载均衡算法来决定每次请求哪一个服务。如下为常见的负载均衡算法:

随机算法:获取服务列表大小范围内的随机数、将该随机数作为列表索引,从服务列表中获取一个服务提供者地址。

加权随机算法:加权随机算法是在随机算法的基础上对权重做了处理。可能有不同的算法实现,比如如果一个服务权重为3我们可以在列表添加3个相同的服务然后再采用随机算法获取地址。

轮询算法:将服务调用者请求按顺序轮流分配到服务听风者后端服务器上,均衡对待每一台服务提供者。

hash算法:利用请求IP的hashCode对服务者列表大小取模,得到服务提供者列表索引进而获取到服务提供者

断路器(熔断)

对于一个庞大的应用集群,部分服务或者机器出现问题不可避免。我们需要保障在出现故障时,减少故障的影响、保障集群的高可用,这就是断路器(熔断要做的事情)目前Spring Cloud集成的断路器有Netflix的Hystrix和Alibaba的Sentinel。断路器这里不详细讲述,只有结合项目才能更好的了解断路的概念。

网关路由

再引入服务注册和发现中心之后,服务调用者可以从服务注册中心获取并且维护一个服务列表,如果服务比较多,则需要维护多个服务的列表,而且每个服务调用者都需要维护一个服务列表。增加系统的复杂性,这时候我们可以将所有服务列表维护在一个网关中,然后通过网关统一路由到对应的服务提供者。如下图我们将服务注册和发现中心修改之后的调用图例如下:

分布式消息传递

服务之间HTTP的RPC保证了服务之间的实时通讯,但是服务之间耦合度相对较高,对于不需要实时性通讯比较高的系统可能会增加通讯时长,因此可以使用消息传递的方式进行服务间通讯。目前比较常用的消息组件有RabbitMQ、kafka。RocketMq等,并且Spring Cloud对这些组件进行了封装,使得使用这些组件更加的简单,Spring Cloud中的消息组件为Spring Cloud Stream,后续我们会详细介绍。

本篇介绍了采用微服务架构中可能会出现的问题,以及解决方案,后续会详细的介绍这些组件的使用以及原理。

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值