文章目录
1. 常见面试题
- 什么是微服务?
- 微服务之间是如何独立通信的?
- SpringCloud 和 Dubbo 有哪些区别?
- SpringBoot 和 SpringCloud ,请谈谈对它们的理解。
- 什么是服务熔断?什么是服务降级?
- 微服务的优缺点分别是什么?说说你在项目中遇到的坑。
- 你所知道的微服务技术栈有哪些?请列举。
- Eureka 和 Zookeeper 都可以提供服务注册与发现,请说说两者区别。
- ……
- 下面学习,带着思考
2. 微服务
最开始开发使用的是 MVC 三层架构
后来为了简化代码就升级为了 Spring —— 轻量级的 Java 的开发框架
因为 Spring 的配置过多,就升级为了 SpringBoot —— 新一代的 JavaEE 开发标准
再往后用户量越来越多,服务越来越多,单纯的 SpringBoot 就支撑不住了,就需要使用微服务来解决
微服务就是把原来 所以功能集成再一个项目 转变成 一台服务器放一种服务,也即把原来的一整个系统模块化
- 新概念:服务网格(Service Mesh),新一代的微服务标准
具体内容 : Martin Flower关于微服务的论文
3. 微服务框架的核心问题
3.1. 核心问题
- 服务很多,客户端怎么访问?
- 这么多服务,服务之间如何通信?
- 这么多服务,如何治理?
- 服务挂了怎么办?
3.2. 解决上述问题
- SpringCloud 就是一个解决上述问题的生态
- 三套常见的方案
-
SpringCloud + Netflix (一站式解决方案,解决上述四个问题)
-访问 : API 网关,
zuu1
组件-通信 :
Feign
—— 基于 HTTP 的通信方式(同步,阻塞)-治理 :服务注册发现,
Eureka
-服务挂了 :熔断机制 ,
Hystrix
-
Dubbo + Zookeeper(半自动,需要整合别人的)
-访问 :本身没有,需要找第三方组件,或者自己实现
-通信 :
Dubbo
—— 基于 Java 开发的 RPC 框架-治理 :
Zookeeper
-服务挂了 :没有熔断机制
-
SpringCloud + Alibaba (新的一站式解决方案)
和方案1 类似,不过方案一已经停止维护了
而这个是很新的才出的方案
4. 微服务优缺点
4.1. 优点
- 单一职责原则
- 每个服务足够内聚、足够小,代码容易理解,这样能聚焦一个指定的业务功能或业务需求
- 开发简单,提高开发效率,一个服务可能就是专一的只干一件事
- 微服务能够被小团队独立开发,这个小团队是 2~5 人的开发人员组成
- 微服务是松耦合的,有功能意义的服务,无论是在开发阶段或是部署阶段都是独立的
- 微服务能使用不同的语言开发
- 易于和第三方集成,微服务允许容易且灵活的方式集成自动部署,通过持续集成工具,如 Jenkins、Hudson、Bamboo
- 微服务易于被一个开发人员理解、修改和维护,这样小团队能够跟关注自己的工作成果,无需通过合作才能体现价值
- 微服务允许利用融合新技术
- 微服务只是业务逻辑的代码,不会和HTML、CSS或其他界面混合
- 每个人微服务都有自己的存储能力,可以有自己的数据库,也可以有统一的数据库
4.2. 缺点
- 开发人员要处理分布式系统的复杂性
- 多服务运维的难度,随着服务的增加而增加
- 系统部署依赖
- 服务间通信成本
- 数据一致性
- 系统集成测试
- 性能监控
- ……
5. 微服务技术栈
微服务条目 | 落地技术 |
---|---|
服务开发 | SpringBoot 、Spring、SpringMVC |
服务配置与管理 | Netflix 公司的 Archaius、阿里的 Diamond…… |
服务注册与发现 | Eureka、Consul、Zookeeper…… |
服务调用 | Rest、RPC、gRPC |
服务熔断器 | Ribbon、Nginx…… |
服务接口调用(客户端调用服务的简化工具) | Feign…… |
消息队列 | Kafka、RabbitMQ、ActiveMQ…… |
服务配置中心管理 | SpringCloudConfig、Chef…… |
服务路由(API网关) | Zuul…… |
服务监控 | Zabbix、Nagios、Metrics、Specatator…… |
全链路追踪 | Zipkin、Brave、Dapper…… |
服务部署 | Docker、OpenStack、Kubernetes…… |
数据流操作开发包 | SpringCloud Stream(封装与Redis、Rabbit、Kafka等收发消息) |
事件消息总线 | SpringCloud Bus |
…… | …… |
更多技术栈:Spring 官网
6. 常见微服务框架对比
功能点/服务框架 | Netflix/SpringCloud | Motan | gRPC | Thrift | Dubbo/DubboX |
---|---|---|---|---|---|
功能定位 | 完整的微服务框架 | RPC框架,但整合了ZK或Consul实现集群环境的基本服务注册、发现 | RPC框架 | RPC框架 | 服务框架 |
支持Rest | Y,Ribbon支持多种可插拔的序列化选择 | N | N | N | N |
支持RPC | N | Y,Hession2 | Y | Y | Y |
支持多语言 | Y,Rest形式 | N | Y | Y | N |
负载均衡 | Y,服务端Zuul(动态路由,云端负载均衡) + 客户端Ribbon | Y,客户端 | N | N | Y,客户端 |
配置服务 | Y,Netflix Archaius,SpringCloudConfig Service集中配置 | Y,ZK | N | N | N |
服务调用链监控 | Y,Zuul | N | N | N | N |
高可用/容错 | Y,服务端 Hystrix + 客户端 Ribbon | Y,客户端 | N | N | Y,客户端 |
社区活跃度 | 高 | 一般 | 高 | 一般 | - |
学习难度 | 一般 | 低 | 高 | 高 | 低 |
文档丰富程度 | 高 | 一般 | 一般 | 一般 | 高 |
其他 | SpringCloud Bus 为我们的应用程序带来了更多管理端点 | 支持降级 | Netflix 在开发集成 gRPC | IDL定义 | 实践的公司较多 |
7. SpringCloud
7.1. 概述
SpringCloud 架构图
SpringCloud 基于 SpringBoot 提供了一套微服务解决方案,包括服务注册与发现、配置中心、全链路监控、服务网关、负载均衡、熔断器等组件。
SpringCloud 利用 SpringBoot 的开发便利性,简化了分布式系统的基础设施开发,为开发人员提供了快捷构建分布式系统的一些工具,可以用SpringBoot的开发风格做到一键启动和部署。
SpringBoot将目前各家公司开发的比较成熟的服务框架组合起来,通过SpringBoot风格再封装,屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署、易维护的分布式系统开发包。
7.2. SpringCloud 和 SpringBoot 的关系
- SpringBoot 专注于快速便捷的开发单个个体微服务
- SpringCloud 是关注全局的微服务协调整理治理的框架,它将SpringBoot 开发的一个个单体微服务整合并管理起来,为各个微服务之间提供:配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等集成服务。
- SpringBoot 可以离开 SpringCloud 独立使用,开发项目,单数 SpringCloud 离不开 SpringBoot,属于依赖关系
7.3. SpringCloud 和 Dubbo 对比
Dubbo | SpringCloud | |
---|---|---|
服务注册中心 | Zookeeper | SpringCloud Netflix Eureka |
服务调用方式 | RPC | REST API |
服务监控 | Dubbo-monitor | SpringBoot Admin |
断路器 | 不完善 | SpringCloud Netflix Hystrix |
服务网关 | 无 | SpringCloud Netflix Zuul |
分布式配置 | 无 | SpringCloud Config |
服务跟踪 | 无 | SpringCloud Sleuth |
消息总线 | 无 | SpringCloud Bus |
数据流 | 无 | SpringCloud Stream |
批量任务 | 无 | SpringCloud Task |
-
最大区别:SpringCloud 抛弃了 Dubbo 的 RPC 通信,采用了基于 HTTP 的 REST 方式
两种方式各有优劣。从一定程度上来说,后者牺牲了服务调用的性能,但是避免了原生 RPC 的问题,且 REST 比 RPC 更加灵活,不存在代码级别是强依赖,更加适合当下强调微服务的环境。 -
类似品牌机和组装机的区别
SpringCloud 就像品牌机,它的功能比 Dubbo 更强大,涵盖面更广,而且作为 Spring 的拳头项目,能够与 SpringFramework、SpringBoot、SpringData 等其他项目完美融合。在 SpringSource 的整合下,做了大量的测试,保证了及其有更高的稳定性,但是如果需要使用组件外的东西,就要对其基础有足够的了解。Dubbo 就像组装机,各个环节的选择的自由度很高,但是最终结果可能因为其中一个小件的质量不过关而出问题,让人不放心。除非是一名高手。
-
解决的问题域不一样
Dubbo 定位是一个 RPC 框架。Spring Cloud 定位是微服务架构下的一站式解决方案。
7.4. 参考资料
Netflix : https://www.springcloud.cc/spring-cloud-netflix.html
中文 API 文档 :https://www.springcloud.cc/spring-cloud-dalston.html
SpringCloud 中国社区 : http://springcloud.cn/
SpringCloud 中文网 : https://www.springcloud.cc/