SpringCloud(2)之SpringCloud简介

SpringCloud作为Java语言的微服务框架,它依赖于Spring Boot,有快速开发、持续交付和容易部署等特点。SpringCloud的组件非常多,设计微服务的方方面面,并在开源社区Spring和Netflix、Pivotal两大公司的推动 下越来越完善。我们这里主要介绍SpringCloud的一下几点:

  • 微服务应该具备的功能
  • SpringCloud介绍
  • Dubbo介绍
  • SpringCloud与Dubbo介绍

一、微服务应该具备的功能

微服务的概念源于 2014 年 3 月 Martin Fowler 所写的一篇文章“Microservices”。文中内容提到:微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。服务是一个独立运行的单元组件,每个单元组件运行在独立的进程中,组件与组件之间通常使用HTTP这种轻量级的通信机制进行通信。

微服务具有以下特点:

  1. 按照业务划分服务,每个服务代码量小,业务单一,易于维护。
  2. 每个微服务都有自己独立的基础组件,例如数据库、缓存等,且运行在独立的进程中。
  3. 微服务之间的通信都是通过HTTP协议,且具有容错能力。
  4. 微服务有一套服务治理的解决方案,服务之间不耦合,可以随时加入和剔除服务。
  5. 单个微服务能够集群化部署,并且具有负载均衡能力。
  6. 整个微服务系统应该有一个完整的安全机制,包括用户验证、权限验证、资源保护等。
  7. 整个微服务系统有链路追踪能力。
  8. 有一套完整的日志系统。

那么,微服务已经具有以上这些特点,那么微服务需要具备一些什么功能呢?微服务的功能主要体现在以下几个方面:

  • 服务的注册以发现。
  • 服务的负载均衡。
  • 服务的容错。
  • 服务网关。
  • 服务配置的统一管理。
  • 链路追踪。
  • 实时日志。

二、服务的注册以发现

微服务系统有很多个单一职责的服务单元组成,而每一个服务又有众多的实例,服务数量众多,服务之间的相互依赖成网状,所以该系统需要服务注册中心来统一管理微服务实例。

服务注册指向服务注册中心注册一个实例,服务提供者将自己的服务信息(如服务名、IP地址等)告知服务注册中心。服务发现是指当服务消费者需要消费另外一个服务时,服务注册中心能够告知服务消费者的实例信息(服务名、IP地址等)。通常情况下,一个服务既是服务提供者,也是服务消费者。服务消费者一般使用HTTP协议或者消费。

服务注册中心会提供服务的健康检查方案,检查被注册的服务时候可用。通常一个服务实例注册后,会定时向服务注册中心提供心跳,以表明自己还处于可用的状态,单一个服务实例停止向服务注册中心提供心跳一段时间后,服务注册中心会认为该 服务实例不可用,会将该服务注册从服务注册列表中剔除。如果这个被剔除的服务实例过一段时间后继续向该注册中心提供心跳,那么服务注册中心会将该服务实例重新加入服务注册中心的列表。

三、服务的负载均衡

在微服务架构中,服务之间的相互调用一般是通过HTTP通信协议来实现的。网络往往具有不可靠性,为了保证服务的高可用,服务单元往往是集群化部署。例如将服务提供者进行集群化部署,那么服务消费者该调用哪个服务提供者的实例呢,这就涉及到了服务的负载均衡。

服务的负载均衡一般最流行的做法如下图,所有的服务都像注册服务中心注册,服务注册中心持有每个服务持有每个服务的应用名和IP地址信息,同时每个服务也会获取所有服务注册列表信息。服务消费者集成负载均衡组件,该组件会向服务消费者获取服务注册列表信息,并每隔一段时间重新获取该列表。当服务消费者消费服务时,负载均衡组件获取服务提供者所有实例的注册信息,并通过一定的负载均衡策略,选择一个服务提供者的实例,向该实例进行服务消费,这样就实现了负载均衡。

 

四、服务的容错

微服务落地到实际项目中,服务的数量往往非常多,服务之间项目依赖性也是错综复杂的,一个网络请求通常需要调用多个服务才能完成。如果一个服务不可用,例如网络延迟或者故障,会影响到依赖这个不可用的其他服务。一个微服务系统有很多个服务,当服务F因某些原因导致了服务的不可用,来自于用户的网络请求需要调用服务F。由于服务F无响应,用户的请求都处于阻塞状态,在高并发的场景下,短时间会导致服务器的线程资源耗尽。另外就会导致依赖于F的其他服务的不可用,最终导致整个系统瘫痪。

为了解决分布式系统的雪崩效应,分布式系统引进了熔断器机制。熔断器(Circuit Breaker),他的作用是当电路中出现了故障时切断电路,熔断器的机制为:当一个服务的处理用户请求的失败此时在一定时间内小于设定的阈值时,说明法务出现了故障,打开熔断器,这时所有的请求会执行快速失败,不执行业务逻辑。当处于打开状态的熔断器时,一段时间后会处于半打开状态,并执行一定数量的请求,剩余的请求会执行快速失败,若失败的请求失败了,则继续打开熔断器;若成功了,则将熔断器关闭。总的来说熔断器具有以下作用:

  1. 将资源隔离,如果某个API接口出现了故障,只会隔离该API接口,不会影响到其他API接口。
  2. 服务降级的功能。当服务处于正常的状态时,大量的请求在短时间内同时涌入,超过了服务的处理能力,这时熔断器会被打开,将服务进行降级,以免服务器因负载过高而出现了异常。
  3. 自我修复能力。

五、服务网关

微服务系统通过将资源以API接口的形式暴露给外界提供服务。在微服务系统中,API接口资源通常是由服务网关(也称API网关)统一暴露,内部服务不直接对外界提供API资源。

通常情况下,网关层是以集群的方式存在。在服务网关层之前,有可能需要加上负载均衡层,通常为Nginx双机热备,通过一定的路由策略,将请求转发到网关层。到达网关层之后,经过一系列的用户身份验证、权限验证、权限判断,最终转发到具体的服务。具体的服务经过一系列的逻辑运算和数据操作后,最终将结果返回给用户。

网关层具有很重要的意义,具体表现为:

  1. 网关将所有服务的API接口资源统一聚合,对外统一暴露,外界系统调用的API都是网关对外暴露的API接口,外界系统不需要知道微服务架构中各服务相互调用的复杂性,微服务系统也保护了其内部微服务单元的API接口,防止被外界直接调用以及服务的敏感信息对外暴露。
  2. 网关可以做一些用户信心认证、权限认证,防止非法请求操作API接口,对内部服务起到保护作用。
  3. 网关可以用来做流量监控,实时日志输出,对请求进行记录。
  4. API接口从内部分离出来,方便做测试

网关实现这些功能,需要高可用,否则网关可能成为架构中的瓶颈。最常用的网关组件有Zuul、Nginx等。

六、服务配置的统一管理

在实际开发过程中,每个服务都有大量的配置文件,例如数据库的配置,日志输出级别的配置等,而往往这些【位置在不同的环境也是不一样的,随着服务数量的增加,配置文件的管理也是一件非常复杂的事情。

在微服务架构中,需要由统一管理配置文件的组件,例如Spring Cloud的Spring Cloud Config组件、阿里的Diamonod、百度的Disconf等这些配置组件所实现的功能大体相同,这里介绍Spring Cloud Config为例来阐述服务配置的统一管理。

  1. 首先,Config Server(配置服务)读取配置文件仓库的配置信息,其中的配置文件仓库可以存放发配置配置服务的本地仓库,也可以放在git仓库。
  2. 配置服务启动后,读取配置文件信息,读取完成的配置信息存放在配置服务的内存中。
  3. 当启动服务A/B时,由于服务A、B指定了向配置服务读取配置信息,服务A、B想配置服务读取配置信息
  4. 当服务的配置信息需要修改且修改完成后,想配置服务发送Post请求刷新,这时服务A、B回向配置服务重写读取配置文件信息。

七、Spring Cloud

SpringCloud是基于SpringBoot的。Spring他最要的特点就是为了简化开发和部署的过程,简化了Spring复杂的配置和依赖管理,通过起步依赖和内置Servlet容器能够使开发者迅速搭建起一个Web工程。

SpringCloud的首要目标就是通过提供一系列的开发组件和框架,帮助开发者迅速搭建起一个分布式的微服务系统。SpringCloud是通过包装其他技术框架来实现的,例如包装开源的Netflix OSS组件,实现了一套通过基于注解、Java配置和基于模板开发的微服务框架。

SpringCloud常用的组件有:

  1. 服务注册和发现组件Eureka,利用Eureka组件开源很轻松实现服务的注册和发现功能,Eureka组件听了服务的健康监测,以及友好的UI界面。
  2. 熔断组件Hystrix,这是一个熔断组件,他除了有一些基本的熔断器功能外,还能够实现服务降级、服务限流的功能,另外还提供了熔断器的健康监测。
  3. 负载均衡组件Ribbon,这是一个负载均衡组件,它通常和Eureka、Zuul、RestTemplate、Feign配合使用。Ribbon和Zuul配合,很容易做到负载均衡,将请求根据负载均衡策略分配到不同的服务实例中。
  4. 路由网关Zuul,他有智能路由和过滤的功能。内部服务的API接口通过Zuul网关统一对外暴露,内部服务的API接口不直接对外暴露,防止了北部服务敏感信息对外暴露。
  5. Spring Cloud Config,它提供了配置文件统一管理的功能,Spring Cloud Config包括Server端和client端,Server端读取本地仓库获取远程仓库的配置文件,所有的Client向Server读取配置信息,从而达到了配置文件统一管理的目的。
  6. Spring Cloud Security,这组件是对Spring Security的疯转,他想服务提供了用户验证和权限验证,一般来说,单独在微服务系统中使用Spring Cloud Security是很少见的,他一般要配合着Spring Security OAuth2一起使用,通过搭建授权服务,验证Token或者JWT这种形式对整个微服务系统进行安全检验。
  7. Spring Cloud Sleuth,分布式链路追踪组件,通过他可以知道服务之间的相互依赖关系,并实时观察链路的调用情况。
  8. Spring Cloud Stream,是Spring Cloud框架的数据流操作包。

八、SpringCloud与Dubbo的比较

首先我们从微服务的关注点来比较两大服务框架。

微服务的关注点 SpringCloud Dubbo
配置管理 Config -
服务发现 Eureka Zookeeper
负载均衡 Ribbon 自带
网关 Zuul -
分布式链路追踪 SpringCloud Sleuth -
容错 Hystrix 不完善
通信方式 Http、Message RPC
安全模块 SpringCloud Security -

SpringCloud拥有很多项目的模块,包括了微服务系统的方方面面。Dubbo是一个非常优秀的服务治理和服务调用的框架,但是缺少很多功能模块,例如网关、链路追踪等。在项目模块上,SpringCloud占有非常大的优势。

从学习成本上看,Dubbo的版本趋于稳定,文档完善,可以即学即用,没有太大的难度。SpringCloud基于SpringBoot,需要开发者先学会SpringBoot,另外SpringCloud的版本迭代快,需要快速更近学习。

好了,对于SpringCloud的简介到这里就要结束了,加油!

猜你喜欢

转载自blog.csdn.net/jokeMqc/article/details/94122843
今日推荐