Spring-Cloud-Introduction

Spring Cloud入门


Spring Cloud常见问题

微服务定义

关于微服务是什么,该怎么去构建,现在还没有统一的说法,根据微服务提出者Martin Fowler的一篇关于微服务的文章。我提出自己的理解。

微服务是通过业务将某一个应用划分成一个个独立的小服务,每一个服务都能独立工作,可以有自己独立的数据库,服务之间通过轻量的方式进行通信,通常是一个HTTP API接口。通过将这些服务部署到生产环境,联合工作来完成一个应用。

以往我们做一个应用要把整个应用做完,既不利于重用,也难以维护。整个应用有可能只是一部分功能被使用得比较多,但是添加服务器的话得在所有服务器上添加整个应用的副本。但如果使用微服务架构,我就可以只给经常被使用的服务分配更多的资源有利于管理。

采用微服务架构意味着我们要把一个应用分割成一个个专门负责某一部分业务的小服务,将专业的事情交给这些专业的服务去处理

微服务之间如何独立通信

Spring Cloud 与 Dubbo 的区别

Dubbo是SOA时代的产物,而Spring Cloud是微服务架构时代的产物,两者在诞生时的目标和背景就不一样。Dubbo专注于服务治理,而Spring Cloud看到的时整个微服务的生态。

由于Dubbo采用RPC传输而Spring Cloud采用HTTP传输,一般而言Dubbo更快,但是Dubbo的开发难度比Spring Cloud大。现在Dubbo的发展方向除了提升自己的性能外,还将自身整合到Spring中,我认为在未来,Dubbo可能成为Spring Cloud的一部分。

微服务条目 Dubbo Spring Cloud
服务注册中心 Zookeeper Spring Cloud Netflix Eureka
服务调用方式 RPC REST API
服务监控 Dubbo-monitor Spring Boot Admin
断路器 不完善 Spring Cloud Netflix Hystrix
服务网关 Spring Cloud Netflix Zuul
分布式配置 Spring Cloud Config
服务跟踪 Spring Cloud Sleuth
消息总线 Spring Cloud Bus
数据流 Spring Cloud Stream
批量任务 Spring Cloud Task
…… …… ……

服务间通信方式不同

Spring Cloud采用Restful方式进行通信,而Dubbo使用RPC远程过程调用来调用服务的功能。

服务熔断

服务降级

微服务的优缺点

优点

  1. 每个服务足够内聚,足够小,我们不用关心整个应用整体的状况。只需专注与这个微服务的业务功能和需求,提高开发效率。
  2. 小团队开发,小团队一般很难做出一个完善的应用,但是可以做出一些微服务给他人使用。
  3. 松耦合,某一个微服务出现问题不会影响整个应用。
  4. 不必使用同一门语言。
  5. 易于集成。
  6. 可以有自己独立的数据库,也可以用统一数据库。

缺点

  1. 要处理分布式系统的复杂性
  2. 运维难度增大,从以前维护一两个应用变成维护几百个微服务
  3. 服务间通信成本
  4. 性能监控难

微服务技术栈

微服务条目 相关技术
服务开发 Spring boot、Spring、Spring MVC
服务配置与管理 Archaius、Diamond
服务注册与发现 Eureka、Consul、Zookeeper
服务调用 Rest、RPC、gRPC
负载均衡 Ribbon、Nginx
消息队列 Kafka、RabbitMQ、ActiveMQ
服务配置中心管理 Spring Cloud Config
…… ……

Eureka 与 Zookeeper 的区别

要理解Eureka和Zookeeper的区别需要先了解什么是CAP定理。

CAP定理

CAP定理指对于一个分布式计算系统,不可能同时满足

  • Consistency(一致性):所有节点访问同一份最新的数据副本
  • Availability(可用性):每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据
  • Partition tolerance(分区容错性):不同区之间的节点的通信可能失败,既必须假设节点之间无法通信

为什么这三者无法同时实现呢?

  • 假设实现了CA,即客户端向节点一发送修改请求时,节点一也向节点二发送修改请求,那么就必须保证节点之间可以通信,则无法满足P。
  • 如果实现了CP,即客户端向节点一发送修改请求时,因为要做写操作,所以要对节点一加锁,又因为要保证C,则要同时加锁节点二来避免被其他客户端读,这时无法满足A,因为所有节点都被加锁而无法访问,所有节点不可用。
  • 如果实现了AP,即写节点一时不能锁节点二,自然也就无法满足C。

一般而言,分布式系统都必须满足分区容错性,所以在设计时需要在一致性和可用性之间做抉择。

而Eureka和Zookeeper的区别就是Eureka实现了AP,而Zookeeper实现了CP。