简介
# 过去和未来
学完Spring Boot之后,我们有了这么一个疑问:当公司的服务器撑不住了怎么办?
以前有一个简单的解决方法:加服务器,实现负载均衡。
这样做十分简单粗暴,属于横向解决问题。
负载均衡就是将一个项目完整的复制一份,到另一台服务器上
努力实现两台服务器的负载均衡
但是假如一个公司有很多业务:签到,订单,支付,物流....
假如签到用的资源非常少,而其他资源用的非常多,那么虽然加服务器实现负载均衡可以解决这个问题,但是有非常多的资源会被浪费
我们想给签到少一点资源,给其他业务多一点资源
在这种情况下,出现了微服务架构体系,但是微服务架构存在一些问题:
分布式架构会遇到的问题:
1、这么多服务分布在不同的服务器上,用户该如何去访问?
解决:给用户一个相同的接口,一个共同的网关。然后用这个接口去分发到具体的服务器上
2、这么多服务,如何进行通信?
3、这么多服务,如何进行统一的管理?
只要一个统一的管理平台即可
4、服务器崩了怎么办?
熔断机制
解决方案:Spring Cloud
Spring Cloud是一套生态,而不是一个具体的解决方案
生态中的解决方案用来解决分布式的这些问题
1、Spring Cloud NetFlix
:一站式解决方案
- 用户访问:
Api
网关,zuul
组件 - 服务通信:
Feign
Feign
基于HttpClient
HttpClient
基于Http
Http
,同步并阻塞
- 统一管理:服务注册与发现:
Eureka
- 服务器崩了:熔断机制:
Hystrix
虽然这个解决方案很好,但是在2018年年底,
NetFlix
宣布无限期停止维护但是虽然不维护了,还是有很多东西还在用,比如熔断机制
2、Apache Dubbo zookeeper:半自动,需要整合别人
- Api网关,没有!所以要么找第三方,要么自己写
- 服务通信:
RPC
框架:Dubbo
- 服务注册与发现:Zookeeper(包含
Hadoop
,Hive
)等 - 熔断机制:没有,借助了Hystrix
这个解决方案不太完善,但是正在完善
比如
Dubbo3.0
,正在进行升级,将会成为Apache
的顶级项目,是一种碾压性的有事
3、Spring Cloud Alibaba:一站式解决方案
还没有孵化完成
比Spring Cloud更新一代的解决方案:服务网格
下一代微服务标准,Server Mess
代表解决方案:istio
# 常见面试题
1、什么是微服务?
2、微服务之间是如何进行通信的?
3、Spring Cloud和Dubbo的区别?
4、Spring Boot和Spring Cloud的理解?
5、什么是服务熔断?什么是服务降级?
6、微服务的优缺点?微服务有什么缺点?
7、微服务的技术栈?
8、Eureak和zookeeper都可以进行注册与发现,他们的区别?
........
# 微服务概述
# 什么是微服务
微服务是近几年流行的一种服务器架构风格。
他提倡将单一的应用程序划分为一组组小的服务,每个服务运行在单独的进程内,相互协调,提供最终价值。
服务之间采用轻量级的通信机制进行互通,每个服务围绕着具体的业务进行构建。
避免统一的,集中式的管理机制。
可以选择不同的语言编写服务,也可以使用不同的数据存储。
# 微服务与微服务架构
微服务
强调的是一个服务的大小,它关注的是某一个点,解决某一个问题的服务应用
一个小小的组件
微服务架构
一种架构模式,一种思想
# 微服务优缺点
优点:
1、单一职责
2、每个服务足够内聚,足够小,代码容易理解,能够聚焦一个指定的业务或者需求
3、开发简单,效率高,一个服务可能只做一件事
4、可以被小团队开发,比如2~5个人
5、松耦合,有功能意义的服务,无论是开发阶段还是部署阶段都是独立的
6、可以使用不同语言进行开发
7、容易和第三方进行集成,允许容易且灵活地方式集成自动部署,通过持续继承工具,比如jenkins
,Hudson
,bamboo
8、容易被一个开发人员理解,修改和维护。
9、允许融合最新技术
10、只是纯业务逻辑代码,不用和html
,css
或者其他界面混合
11、每个服务都有自己的存储能力,可以有自己的数据库,也可以有统一数据库
缺点:
1、开发人员要处理分布式系统复杂性
2、多服务运维难度随着服务的增加而增加
3、系统部署依赖
4、服务通信成本
5、数据一致性
6、系统集成测试
7、性能监控
# 微服务条目
从上面我们知道了微服务的一些基本概念,现在我们来介绍另外的微服务的一些概念
1、注册中心
现在有两个完全独立的模块A和B,但是现在有一个需求,模块A需要模块B中的某些方法,但是因为这两个模块是完全独立的,所以普通的方式是不能够让A去调用B中的方法的。
现在我们有一个方式,就是将所有的模块信息都放到一个中间平台去,这样的话我们所有模块的信息都在这个中间平台上,以后只需要去这个平台上寻找自己需要的部分即可
我们将这个中间平台称为:注册中心
注册中心以前是Eureka,但是现在出现了一个新的趋势是阿里巴巴的Nacos,它的性能更强,但是我们现在先看Eureka,以后再说Nacos
2、服务调用
现在我们有了注册中心,那么就需要去调用注册中心的方法,进行服务调用就要去寻找对应的方法
典型技术就是Feign
3、寻找到对应的方法之后,我们还需要进行服务的熔断
这个意思是说,假如服务的提供者那一段忽然宕机了,那么我们就应该断开连接不应该继续调用了,假如服务继续执行,那么就进行下一步。这个过程就叫做服务的熔断
4、服务的负载均衡
一个微服务项目有很多模块,而这些模块根据需求可以部署多次,每一个模块都是一个服务。
现在服务A被部署了多次,也就意味这个服务是一个集群效果。
那么我们要定位到具体的位置,就要进行服务的负载均衡,分摊到每个具体的服务上去。
5、服务的调用
最后一步就是进行服务的调用,这个过程叫做HttpClient
微服务的基本调用过程
# 微服务技术栈
微服务条目 | 落地技术 |
---|---|
服务开发 | SpringBoot,Spring,SpringMVC |
服务配置与管理 | Neflix的Archaius,Alibaba的Diamond等,Nacos |
服务注册与发现 | Eureka,Nacos,Consul,Zookeeper等 |
服务调用 | Rest,RPC,gRPC(Google) |
服务熔断器 | Hystrix,Envoy等 |
负载均衡 | Ribbon,Nginx等 |
服务接口调用(客户端调用服务的简化工具) | Feign等 |
消息队列 | Kafka,RabbitMQ,ActiveMQ等 |
服务配置中心管理 | Nacos,SpringCloud Config,Chef等 |
服务路由(API网关) | Zuul等 |
服务监控 | Zabbix,Nagios,Metrics,Specatator等 |
全链路追踪 | Zipkin,Brave,Dapper等 |
服务部署 | Docker,OpenStack,Kubernetes等 |
数据流操作开发包 | Steam(封装Redis,Rabbit,Kafka等发送接收消息) |
事件消息总线 | Nacos,SpringCloud Bus |
# 什么是Spring Cloud
Spring Cloud,基于Spring Boot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负载均衡,熔断器等组件,除了基于NetFlix的开源组件之外,还有一些选型中立的开源组建。
Spring Cloud利用SpringBoot的开发便利性,巧妙地简化了分布式系统基础设施的开发,SpringCloud为开发人员提供了快速构建分布式系统的一系列工具,包括配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞选,分布式会话等。他们都可以使用SpringBoot的开发风格做到一键启动和部署。
SpringCloud是分布式微服务架构下的一站式解决方案,是各个微服务架构落地技术的结合体,俗称微服务全家桶。
# SpringCloud和SpringBoot的关系
- SpringBoot专注于快速开发单个个体服务
- SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,为各个微服务提供:配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞选,分布式会话等集成服务
- SpringBoot可以离开SpringCloud独立使用,但是SpringCloud离不开Springboot
- SpringBoot专注于快速开发,方便的开发单体微服务,SpringCloud关注全局的服务之力框架
# Dubbo和SpringCloud的选择
Dubbo和SpringCloud的对比
Dubbo | SpringCloud | |
---|---|---|
服务注册中心 | Zookeeper | SpringCloud Netflix Eureka |
服务调用方式 | RPC | REST API |
服务监控 | Dubbo-monitor | Spring Boot 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,SpringBatch等其他Spring项目相结合。
使用SpringCloud就像是使用品牌机,简单易上手。
使用Dubbo就像是使用组装机,更加灵活,对于新手更难。
社区支持与更新力度
Dubbo停止了5年左右的更新,虽然2017.7重启了,但是对于新技术的发展需要开发者自己拓展升级。比如当当网的DubboX。
但是这明显不现实,中小型企业没有能力去修改Dubbo的源码+一整套生态结构。
解决的问题不同
Dubbo的定位是一款RPC框架,而SpringCloud是微服务架构下的一站式解决方案
# SpringCloud的版本号
上面的文档命名看起来很奇怪,所以我们需要了解:
SpringCloud是由众多独立子项目组成的大型综合项目,每一个子项目都有着不同的发行节奏,都有自己的版本号。
所以为了避免混淆,没有通过版本号的方式,而是通过命名的方式来进行。
这些版本的命名方式使用了伦敦地铁站的名称,同时根据字母的顺序来进行版本时间排序。
比如最早的Release版本:Angel。第二个Release版本:Brixton。然后是:Camden、Dalston、Edgware。
现在已经到了H版本了
除了上面的大版本之外,在大版本下面还有小版本,分为:
- SNAPSHOT:快照版本,随时可能修改。绝对不要使用这个版本
- M : MileStone:里程碑版,比如M1表示第1个里程碑版本,一般同时标注PRE,表示预览版。M2表示增加了新的功能,M3...
- SR:Service Release , SR1表示第1个正式版本,一般同时标注GA : (GenerallyAvailable),表示稳定版本
# 参考书
SpringCloudNetflix中文文档:https://www.springcloud.cc/spring-cloud-netflix.html (opens new window)
SpringCloud中文API:https://www.springcloud.cc/spring-cloud-dalston.html (opens new window)
SpringCloud中国社区:http://springcloud.cn/ (opens new window)
SpringCloud中文网:https://www.springcloud.cc/ (opens new window)