SpringCloud-微服务-1
什么是微服务?
微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个的服务,彻底地去耦合,每一个服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程概念,能够自行单独启动或销毁,拥有自己独立的数据库。
SpringCloud、SpringBoot、微服务关系
与传统的spring mvc相比,通过springboot开发能够简化搭建框架的配置文件数量,从而提升系统的可维护性。在springboot里面,我们还能够更方便的引入springcloud的诸如安全和负载均衡方面的组件。
也可以说springboot是微服务的基础,在这个架构里,我们可以引入springcloud的诸多组件,从而搭建基于微服务的系统。
为什么需要微服务?
单体架构存在的不足
- 业务越来越复杂,单体应用的代码量越来越大,代码的可读性,可维护性和可扩展性下降,新人接手代码所需的时间越来越大,业务扩展的难度也越来越大。
- 随着用户越来越多,程序所要承受的并发也越来越高,单体应用的并发能力有限。
- 测试难度很大,单体应用的业务都在同一个程序里面,随着业务扩张,复杂度增加,单体应用的修改业务可能会影响其他业务,导致测试难度增加。
单体架构使用服务器集群的存在以及不足
使用集群的架构有一定的处理高并发的能力,也能应对一定复杂的业务需求,改善了系统的性能,但是依然没有改变系统为单体架构的事实,它存在的不足:
- 系统仍为单体应用,大量的业务必然会有大量的代码,代码的可读性和可维护性依然很差。
- 持续交付能力差,业务越复杂,代码越多,修改代码时间长,新人熟悉代码时间长,成本高。
微服务的优势
- 将一个复杂的业务分解成若干小的业务,每个业务拆分成一个服务,服务的边界明确,将复杂的问题简单化。服务按照业务拆分,编码也按照业务拆分,代码可读性,可扩展性增加。新人加入团队,不需要了解所有业务代码,只需要了解他所接管的服务的代码。
- 由于微服务是分布式系统,服务与服务之间没有任何耦合。随着业务的增加,可以根据业务在拆分服务,具有极强的横向扩展能力。
- 服务于服务之间通过http网络通信协议来通信,单个微服务内部高度耦合,服务与服务之间完全独立,无耦合。所以开发者可以自由选择合适的业务场景或合适的适合自己的开发语言和技术,提高开发效率,降低开发成本。
- 微服务的每个服务单元都是独立部署,即微服务的修改和部署对其他服务没有影响。
- 微服务在CAP理论中采用AP架构,具有高可用和分区容错的特点,高可用主要体现在系统7*24小时不间断的服务,它要求系统有大量的服务器集群,从而提高了系统的负载能力,另外,分区容错也使得系统更加健壮。
微服务的不足
- 微服务的复杂度
- 构建一个微服务系统是一件复杂的事,微服务系统是分布式系统,构建的复杂度远远超过单体系统,开发人员需要花时间掌握架构知识。
- 分布式事务
- 微服务架构所设计的系统是分布式系统,分布式系统有一个著名的CAP理论,即同时满足”一致性””可用性”和”分区容错”是一件不可能的事。
- 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值,即写操作之后的读操作,必须返回该值。(分为弱一致性、强一致性和最终一致性)
- 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
- 分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。
- CAP三个特性只能满足其中两个,那么取舍的策略就共有三种:
- CA without P:如果不要求P(不允许分区),则C(强一致性)和A(可用性)是可以保证的。但放弃P的同时也就意味着放弃了系统的扩展性,也就是分布式节点受限,没办法部署子节点,这是违背分布式系统设计的初衷的。传统的关系型数据库RDBMS:Oracle、MySQL就是CA。
- CP without A:如果不要求A(可用),相当于每个请求都需要在服务器之间保持强一致,而P(分区)会导致同步时间无限延长(也就是等待数据同步完才能正常访问服务),一旦发生网络故障或者消息丢失等情况,就要牺牲用户的体验,等待所有数据全部一致了之后再让用户访问系统。设计成CP的系统其实不少,最典型的就是分布式数据库,如Redis、HBase等。对于这些分布式数据库来说,数据的一致性是最基本的要求,因为如果连这个标准都达不到,那么直接采用关系型数据库就好,没必要再浪费资源来部署分布式数据库。
- AP wihtout C:要高可用并允许分区,则需放弃一致性。一旦分区发生,节点之间可能会失去联系,为了高可用,每个节点只能用本地数据提供服务,而这样会导致全局数据的不一致性。典型的应用就如某米的抢购手机场景,可能前几秒你浏览商品的时候页面提示是有库存的,当你选择完商品准备下单的时候,系统提示你下单失败,商品已售完。这其实就是先在 A(可用性)方面保证系统可以正常的服务,然后在数据的一致性方面做了些牺牲,虽然多少会影响一些用户体验,但也不至于造成用户购物流程的严重阻塞。
- 服务的划分
- 将一个完整的系统拆分成多个服务,是一个非常困难的事,因为这涉及了具体的业务场景。
- 服务的部署
- 一个简单的单体系统可能只需要将程序集群部署并配置负载均衡即可,而部署一个复杂的微服务架构的系统就复杂的多。因为每一个微服务可能还涉及比较底层的组件,例如数据库,消息中间件等。
微服务与SOA的关系
SOA即面向服务的架构,这种架构在20年前就已经被提出。SOA实施思路是根据ESB模式来整合集成大量单一庞大的系统,这是SOA主要落地方式。然而,SOA并没有取得成功。
微服务相对于和ESB联系在一起的SOA显然轻便敏捷许多,微服务将复杂的业务组件化,实际也是一种面向服务思想的体现。对于微服务来说,它是SOA的一种实现,但是它比ESB实现的SOA更加轻便、敏捷、简单。
微服务应该具备的功能
- 服务的注册和发现。
- 服务的负载均衡
- 服务的容错。
- 服务网关。
- 服务配置的统 管理。
- 链路追踪。
- 实时日志。
springcloud简介
Spring Cloud 是基于 Spring Boot Spring Boot 是由 Pivotal 团队提供的全新 Web 架,
它主要的特点就是简化了开发和部署的过程,简化了 Spring 复杂的配置和依赖管理,通过起
步依赖和内置 Servi et 容器能够使开发者迅速搭 Web 工程。
Spring Cloud 提供了开发分布式微服务系统的一些常用组件,例如服务注册和
发现、配置中心、熔断器、 智能路由 、微代理、控制总线、全局锁、分布式会话等。
springcloud常用组件
- 服务注册和发现组件 Eureka
- 利用 Eureka 组件可以很轻松地实现服务的注册和发现的功能。 Eureka 组件提供了服务的健康监测,以及界面友好的 UI 。通过 Eureka 组件提供的 UI, Eureka 组件可以让开发人员随时了解服务单元的运行情况。
- 熔断组件 Hystrix
- Hystrix 熔断组件,它除了一些基本的熔断器功能外,还能够实现服务降级、服务限流的功能。另外 Hystrix 提供了熔断器的健康监测,以及熔断器健康数据的 API接口。Hystrix Dashboard 组件提供了单个服务熔断器的健康状态数据的界面展示功能 HystrixTurbine 组件提供了多个服务的熔断器的健康状态数据的界面展示功能
- 负载均衡组件 Ribbon
- Ribbon 个负载均衡组件,它通常和 Eureka Zuul RestTemplate Feign 配合使用。Ribbon Zuul配合,很容易做到负载均衡,将请求根据负载均衡策略分配到不同的服务实例中
- 路由网关 Zuul
- 路由网关 Zuul 有智能路由和过滤的功能。内部服务的 API 接口通过 Zuul 网关统 对外暴露,内部服务的 API 接口不直接暴露,防止了内部服务敏感信息对外暴露。Zuul和Ribbon 相结合,能够做到负载均衡 智能路由。 Zuul 过滤功能是通过拦截请求来实现的 可以些用户的角色和权限进行判断,起到安全验证的作用 同时也可以用于输出实时的请求曰志。
- Spring Cloud Config
- Spring Cloud Config 组件提供了配置文件统一管理的功能。 Spring Cloud Config Server端和 Client Server 端读取本地仓库或者远程仓库的配置文件,所有的 Client向Server读取配置信息,从而达到配置文件统一管理的目的。通常情况下, Spring Cloud Config 和SpringCloud Bus 互配合刷新指定 Client 或所有Client 配置文件。
- Spring Cloud Security
- Spring Cloud Security是对 Spring Security 组件的封装,Spring Cloud Security 向服务单元提供了用户验证和权限认证。一般它会配合 Spring Security OAuth2 组件一起使用,通过搭建授权服务,验证 Token或者 JWT 这种形式对整个微服务系统进行安全验证。
- Spring Cloud Sleuth
- Spring Cloud Sleuth 是一个分布式链路追踪组件,它封装了 Dapper Zipkin Kibana 等组件,通过它可以知道服务之间的相互依赖关系,并实时观察链路的调用情况
- Spring Cloud Stream
- Spring Cloud Stream 是Spring Cloud 框架的数据流操作包,,可以封装 RabbitMq ActiveMqKafka Redis 等消息组件,可以实现消息的接收和发送。
简单的由springcloud构建的微服务系统:
参考:深入理解spring cloud与微服务架构