谈到 SOA 和微服务的区别, 那咱们先谈谈架构的演变
1. 集中式架构
项目功能简单, 一个项目只需一个应用, 将所有功能部署在一起, 这样的架构好处是减 少了部署节点和成本

缺点: 代码耦合,开发维护困难, 无法水平扩展, 单点容错率低,并发能力差
2. 垂直拆分架构
当访问量逐渐增大,单一应用无法满足需求,此时为了应对更高的并发和业务需求,我 们根据业务功能对系统进行拆分:

优点:
缺点:
系统间相互独立,会有很多重复开发工作,影响开发效率
3. 分布式服务
当垂直应用越来越多, 随着项目业务功能越来越复杂, 并非垂直应用这一条线进行数据调用, 应用和应用之间也会互相调用, 也就是完成某一个功能,需要多个应用互相调用, 这就是将功能拆完来完成的分布式架构.

优点:
将基础服务进行了抽取,系统间相互调用,提高了代码复用和开发效率.
缺点:
系统间耦合度变高,调用关系错综复杂,难以维护.
4. 服务治理架构 SOA
SOA :面向服务的架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键, 而最初的服务治理基石是 Dubbo 服务治理.

以前分布式服务的问题?
SOA 服务治理架构的优点:
SOA 服务治理架构的缺点:
5. 微服务
前面说的 SOA,英文翻译过来是面向服务。微服务,似乎也是服务,都是对系统进行 拆分。因此两者非常容易混淆,但其实缺有一些差别:
微服务的特点:

综上, 无论是 SOA 还是微服务, 都需要进行服务调度, 目前主流的服务调度室 RPC 和 HTTP 两种协议, 而 Dubbo 基于 RPC 的远程调度机构, SpringCloud 是基于 Rest 风格(基于 http 协议实现的)的 Spring 全家桶微服务服务治理框架. 说到这里也可以继续说下 Dubbo 和 SpringCloud 的区别.
SpringCloud 是一系列框架的集合,集成 SpringBoot,提供很多优秀服务:服务发现和注册,统一配置中心, 负载均衡,网关, 熔断器等的一个微服务治理框架.
(1)Eureka
提供服务注册和发现, 是注册中心. 有两个组件: Eureka 服务端和 Eureka 客户端
Eureka 服务端: 作为服务的注册中心, 用来提供服务注册, 支持集群部署.
Eureka 客户端: 是一个 java 客户端, 将服务注册到服务端, 同时将服务端的信息缓存到本地, 客户端和服务端定时交互.

服务下线、失效剔除和自我保护
* 服务的注册和发现都是可控制的,可以关闭也可以开启。默认都是开启
* 注册后需要心跳,心跳周期默认 30 秒一次,超过 90 秒没发心跳认为宕机
* 服务拉取默认 30 秒拉取一次.
* Eureka 每个 60 秒会剔除标记为宕机的服务
* Eureka 会有自我保护,当心跳失败比例超过阈值(默认 85%),那么开启自我保护,不再剔除服务。
* Eureka 高可用就是多台 Eureka 互相注册在对方上.
(2)Ribbon
* Ribbon 是 Netflix 发布的云中服务开源项目. 给客户端提供负载均衡, 也就是说 Ribbon 是作用在消费者方的.
* 简单来说, 它是一个客户端负载均衡器, 它会自动通过某种算法去分配你要连接的机器.
* SpringCloud 认为 Ribbon 这种功能很好, 就对它进行了封装, 从而完成负载均衡.
* Ribbon 默认负责均衡策略是轮询策略.
(3)Hystrix 熔断器
有时候可能是网络问题, 一些其它问题, 导致代码无法正常运行, 这是服务就挂了, 崩溃了. 熔断器就是为了解决无法正常访问服务的时, 提供的一种解决方案.
解决因为一个服务崩溃而引起的一系列问题, 使问题只局限于这个服务中,不会影响其他服务.
Hystrix 提供了两种功能, 一种是服务降级, 一种是服务熔断.
服务降级原理:
服务熔断原理:

状态机有 3 个状态:
(4)Feign: 远程调用组件
(5)Gateway: 路由/网关
对于项目后台的微服务系统, 每一个微服务都不会直接暴露给用户来调用的, 但是如果用户知道了某一个服务的 ip:端口号:url:访问参数, 就能直接访问你. 如果再是恶意访问, 恶意攻击, 就会击垮后台微服务系统.因此, 需要一个看大门的大 boss, 来保护我们的 后台系统.
Gateway 支持过滤器功能,对请求或响应进行拦截,完成一些通用操作。
Gateway 提供两种过滤器方式:“pre”和“post” .
Gateway 还提供了两种类型过滤器
(一) GatewayFilter:局部过滤器,针对单个路由
(二) GlobalFilter :全局过滤器,针对所有路由.
1.GlobalFilter 全局过滤器,不需要在配置文件中配置,系统初始化时加载,并作用在每个路由上。
2.Spring Cloud Gateway 核心的功能也是通过内置的全局过滤器来完成。
3.自定义全局过滤器步骤:
(6)Spring Cloud Config
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。
在 Spring Cloud 中,有分布式配置中心组件 spring Cloud Config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程 Git 仓库中.
SpringCloud 和 Dubbo 都是主流的微服务架构.
技术方面对比
性能方面对比
刚才有提到注册中心不一样,那么 Eureka 和 Zookeeper 有什么区别? 我们继续往 下说~
在谈这个问题前我们先看下 CAP 原则: C(Consistency)-数据一致性; A(Availability)- 服务可用性; P(Partition tolerance)-服务对网络分区故障的容错性, 这三个特性在任何分布式系统中不能同时满足, 最多同时满足两个, 而且 P(分区容错性)是一定要满足的.
Eureka 满足 AP(服务可用性和容错性), Zookeeper 满足 CP(数据一致性和容错性)
Zookeeper 满足 CP, 数据一致性, 服务的容错性. 数据在各个服务间同步完成后才能回用户结果, 而且如果服务出现网络波动导致监听不到服务心跳, 会立即从服务列表中剔除, 服务不可用.
Eureka 满足 AP, 可用性, 容错性. 当因网络故障时, Eureka 的自我保护机制不会立即 剔除服务, 虽然用户获取到的服务不一定是可用的, 但至少能够获取到服务列表. 用户访问服务列表时还可以利用重试机制, 找到正确的服务. 更服务分布式服务的高可用需求.
Eureka 集群各节点平等, Zookeeper 集群有主从之分.
- 如果 Zk 集群中有服务宕机,会重新进行选举机制,选择出主节点, 因此可能会导致整个集群因为选主而阻塞, 服务不可用.
- Eureka 集群中有服务宕机,因为是平等的各个服务器,所以其他服务器不受影响.
Eureka 的服务发现者会主动拉取服务, ZK 服务发现者是监听机制
- Eureka 中获取服务列表后会缓存起来, 每隔 30 秒重新拉取服务列表.
- Zk 则是监听节点信息变化, 当服务节点信息变化时, 客户端立即就得到通知.