微服务技术栈
服务开发:spring,springboot,springmvc
服务配置与管理:Netfix公司的Archaiusm,阿里的Diamond
服务注册与发现:Eureka,ZOOkeeper
服务调用:Rest,RPC,gRpc
服务熔断:Hystrix
服务负载均衡:Ribbon,Nginx
服务接口调用:Feign
消息队列:Kafka,Rabbitmq,activeMq,Qmq
服务配置中心管理:SpringCloudConfig,Qconfig,Apollo,Zookeeper
服务路由(API网关)Zuul
事件消息总线:SpringCloud Bus
(一)、什么是微服务架构
微服务架构就是将单体的应用程序拆分为多个应用程序,这多个应用程序就称为微服务,每个微服务运行在自己的环境中,并使用轻量级的机制通信。这些微服务围绕业务能力划分,并独立部署。
1、为什么学习SpringCloud
2、什么是Springcloud
Springcloud是一系列有序框架的集合。它利用Springboot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册,配置中心,智能路由,消息总线,负载均衡,断路器,数据监控等,都可以用Springboot的开发风格做到一键启动和部署。
Springcloud并没有重复造轮子,它只是将各家公司开发的比较成熟,经得起实际考验的服务框架组合起来,通过Springboot风格进行了在封装,最终实现的简单易懂,易部署,和易维护的分手不是系统工具开发包。
3、Springcloud优缺点
优点:
耦合度比较低。不会影响其他模块的开发
减轻团队成本,可以并行开发,不用在关注其他人怎么开发,先关注自己开发。
配置简单,基本用注解就能实现,不用使用过多的配置文件。
微服务跨平台,可以用任何一种语言开发。
每个微服务可以有自己独立的数据库也有用公共的数据库。
直接写的后端代码,不用关注前端怎么开发,接口暴露,通过组件进行服务通信。
缺点:
部署麻烦,给运维带来一定麻烦
针对数据的管理比较麻烦,因为微服务可以每个服务使用一个数据库。
系统集成测试比较麻烦
性能监控比较麻烦
总的来说优点大于,目前看来Spring Cloud是一套非常完善的分布式框架。
4、SpringBoot和SpringCloud区别
Springboot专注于快速方便的开发单个个体微服务。
Springcloud是关注全局微服务协调整理治理框架,它将Springboot开发的一个个单体微服务整合并管理起来。为各个微服务之间提供,配置管理,服务发现,断路器,路由,为代理,事件总线,全局锁,决策竞选,分布式会话等集成服务。
SpringBoot可以离开SpringCloud独立使用开发项目,但是Springcloud离不开Springboot,属于依赖的关系。
5、Springcloud组成部分
Springcloud EureKa:服务注册与发现
Springcloud Zuul:服务网关
Springcloud Ribbon:客户端负载均衡
Springcloud Feign:声明性的Web服务客户端/服务接口调用
Springcloud Hystrix:服务熔断器
Springcloud Config:分布式统一配置管理
Springcloud Bus:事件消息总线
等20几个框架
6、使用Springboot开发分布式微服务,会有什么问题
(1)与分布式系统相关的复杂性-包括网络问题,延迟开销,宽带问题,安全问题。
(2)服务发现-服务发现工具管理集群中的流程和服务如何查找和互相通信。
(3)冗余-分布式系统的冗余问题
(4)负载均衡-负载均衡改善跨多个计算机资源的工作符合,诸如计算机集群,网络链路,中央处理单元
(5)性能-各种运营开线导致的性能问题。
7、SpringCloud和dubbo区别
服务调用方式:Dubbo是RPC,Springcloud是RestAPI
注册中心:dubbo是zookeeper,springcloud是eureka,也可以是zookeeper
服务网关:dubbo本身没有实现,只能通过第三方技术,springcloud有zuul路由网关,作为路由服务器。进行消费者的请求分发,springcloud支持断路器。
8、 REST和RPC对比
RPC主要的却显示服务提供方与调用方之间的依赖太强,需要对每个微服务进行接口的定义,并通过持续集成发布,严格版本控制才不会出现版本冲突。
REST是轻量级接口,服务的提供和调用不存在代码之间耦合,只需要一个约定进行规范。
9。微服务的优缺点
优点:
每个服务直接足够内聚,代码容易理解
开发效率高,一个服务只做一件事情,适合小团队开发。
松耦合,有功能意义的服务
可以用不同语言开发,面向接口编程
易于第三方集成
可以灵活搭配,链接公共库/独立库
缺点:
分布式系统的责任性
多服务运维难度增大
系统部署依赖,服务间通信成本,数据一致,系统集成测试,性能监控。
(二)、EureKa
1、服务注册和发现是什么,Springcloud如何实现
2、什么是Eureka
Eureka作为springcloud的服务注册功能服务器,是服务注册中心,系统中的其他服务使用eureka的客户端将其连接到eureka service中,并保持心跳,这样运维人员可以通过eureka service
来监控各个微服务是否正常运行。
3、Eureka怎么实现高可用
通过集群,注册多台Eureka,然后把Springcloud服务互相注册,客户端从Eurek获取信息时,按照Eureka的顺序访问。
4、什么是Eureka的自我保护模式
默认情况下,EurekaService在一定时间段内没有接收到某个微服务的心跳,Eureka会进入到自我保护模式,在该模式下EurekaService会保护服务注册表中的信息,不在删除注册表中的数据,
当网络故障回复后,EurekaService会自动退出自我保护模式。
5、DicoveryClient的作用
可以从注册中心根据服务别名获取注册的服务器信息。
6、Eureka和zookeeper都可以注册和发现服务,两者区别
(1)Zookeeper中的节点服务挂了就要选举,在选举期间注册服务瘫痪,虽然最终会恢复,但是选举期间不可用(选举就是重新分配主从服务器)
(2)Eureka各个节点是平等关系,只要有一台eureka就可以保证服务可用,数据都是最新的新的。如果查询到的数据不是最新的,就是因为Eureka的自我保护模式导致的。
(3)Eureka本身是一个工程,zookeeper是一个进程。
(4)Eureka可以很好应对网络故障导致部分节点失去联系的情况,而不会像zookeeper一样使整个注册服务瘫痪
(5)Zookeeper保证的是CP,Eureka保证的是AP
CAP;C(Consistency)一致性(强一致性,单调一致性,会话一致性,最终一致性,弱一致性);A(Availability)可用性;P(Partition tolerance)分区容错性;
RPC的主要缺陷是
7、Springcloud如何实现服务的注册
服务发布时,指定对应的服务名,将服务注册到注册中心(eureka,zookeeper )
注册中心加@EnableEurekaServer,服务用@EnableDicoverryClient,然后用ribbon或feign进行服务直接的调用发现。
(三)、Zuul
1、什么是网关
网关相当于一个网络服务架构的入口,所有网络请求都要通过网关转发到具体的服务。
2、网关的作用
统一管理微服务请求,权限控制,负载均衡,路由转发,监控,安全控制黑名单和白名单等。
3、什么是Springcloud zuul(服务网关)
zuul是对springcloud提供的成熟的路由方案,它会根据请求的路径不同,网关会定位到指定的微服务,并代理请求到不同的微服务接口,它对外隐藏了微服务的真正接口地址。
三个重要概念:动态路由表,路由定位,反向代理:
动态路由表:zuul支持eureka路由,手动配置路由,这两种都支持自动更新。
路由定位:根据请求路径,zuul有一套自己的服务定位规则及路由表达式匹配。
反向代理:客户端请求到路由网关,网关受理后,在对目标服务发送请求,拿到响应之后再给客户端。
它可以和Eureka,Ribbon,Hystrix等组件配合使用
zuul的使用场景:对外暴露,权限校验,服务聚合,日志审计等。
4、网关与过滤器区别,常用网关框架
网关是对所有服务的请求进行分析过滤,过滤器是对单个服务而言。常用的有Nginx,Zuul,Gateway
5、Zuul和Nginx区别
Zuul是java语言实现的,主要为java服务提供网关服务。尤其是在微服务的框架中更加灵活的对网关进行操作。Nginx是C语言实现的,性能高于Zuul,但是实现自定义操作需要熟悉lua语言。
对程序员要求比较高,可以使用Nginx做Zuul集群。
Zuul是springcloud集成的网关,可以对springcloud框架提供更为灵活的服务
6、如何设计一套API接口
考虑到API接口的分类,可以将API接口分为开放API接口和内网API接口,内网API接口用于局域网,为内部服务器提供服务。开放API接口用于对外部合作单位提供服务,需遵循Oauth2.0权限
认证协议。同时还要考虑安全性,幂等性等问题。
7、ZuulFilter常用方法
Run():过滤器的具体业务逻辑
shouldFilter():判断过滤器是否有效
filterOrder():过滤器执行顺序
filterType():过滤器拦截位置
8、如何实现动态zuul网关路由转发
通过path配置拦截请求,通过serviceId到配置中心获取转发的服务列表,zuul内部使用ribbon是实线本地负载均衡和转发
9、zuul网关如何搭建
使用nginx的upstream设置zuul服务集群,通过location拦截请求并转发到upstream,默认使用轮询机制对zuul集群发送请求。
(四)、Ribbon
1、负载均衡的意义是什么
在计算机中,负载均衡可以改善跨计算机,计算机集群,网络连接,中央处理单元或磁盘驱动器等多种计算机资源的工作负载分布。负载均衡旨在优化资源使用,最大化吞吐量,最小化响应时间并避免任何单一资源的过载。
使用多个组件负载均衡而不是单个组件可能会通过冗余来提高可靠性和可用性。负载均衡通常涉及专用软件或硬件,例如多层交换机或域名系统服务器进程。
2、负载均衡算法/策略
轮询均衡:每一次请求轮流分配给内部服务器,从1至N后重新开始。适合服务器组中的所有服务器都有相同的软硬件配置并且服务请求相对均衡的情况。
权重轮询均衡:根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权数的服务请求。此种均衡算法确保高性能的服务器得到更多的使用率,避免低性能服务器过载。
随机轮询均衡:把请求随机分配个多个服务器
权重随机均衡:类似于权重轮询,不过在处理请求分担时是个随机选择的过程
响应速度均衡:响应速度负载均衡对内部服务器发出一种探测请求,然后根据各服务器对探测服务的响应时间来决定哪一台服务器来响应客户端的请求。此种算法能较好的反映服务器的当前运行状态,但这最快时间是负载均衡设备和服务器的时间
不是客户端和服务器的响应时间。
最少连接数均衡:最少链接负载均衡对内部中每个服务器都有一个数据记录,记录当前服务器正在处理的链接数量,当有新的服务请求时,将把请求分配给连接数最少的服务器,使均衡更加符合实际情况,负载更加均衡
此种适合长时间处理的请求服务,服FTP。
处理能力均衡:处理能力均衡算法把服务请求分配给处理负荷(根据CPU型号,CPU数量,内存大小以及当前连接数等换算)最轻的服务器,由于考虑了内部服务器的处理能力以及当前网络运行状况,所以此种均衡算法更加准确。
DNS响应均衡:全局负载均衡
哈希算法:一致性hash算法,相同参数的请求总在同一台服务器
IP地址散列:保证来自想通客户端的通信能够一直在同一服务器中进行处理。
URL散列:
LVS原理
3、Ribbon是什么
Ribbon是Netfix发布的开源项目,是一个负载均衡客户端,主要功能是提供客户端的软件负载均衡算法。Ribbon客户端提供一系列的配置项,如链接超时,重试等。
Ribbon使用discoveryClient从注册中心读取目标服务信息,同一接口请求进行计数,使用%取余算法获取目标服务集群索引,返回取到的目标服务信息。
4、Nginx与Ribbon的区别
Nginx是反向代理同时可以实现负载均衡,nginx拦截客户端请求采用负载均衡策略根据upstream配置进行转发,相当于请求通过nginx进行转发。
Ribbon是客户端负载均衡,从注册中心读取目标服务器信息,然后客户端采用轮询策略对服务直接访问,全程在客户端操作。
5、@LoadBalanced 作用,开启客户端负载均衡。
(五)Hystrix
1、什么是断路器
当一个服务调用另一个服务由于网络原因或者自身原因出现问题,调用者就会等待被调用的响应,当更多的的请求到达这些资源导致更多的响应等待,发生连锁效应(雪崩效应)
断路器有三种状态
打开状态:一段时间达到一定的次数无法调用访问,并且多次检测没有恢复的迹象,断路器完全打开,那么下次请求就不会请求到该服务器。
半开状态:短时间内有恢复迹象,断路器会将部分请求发给该服务,正常调用时断路器关闭。
关闭状态:当服务一直处于正常状态,可以正常调用。
2、什么是Hystrix
在分布式系统中,一定会依赖各种服务,那么这些服务一定会出现失败的情况,就会导致雪崩,Hystrix就是这样一个工具,防止雪崩利器,它具有服务降级,服务熔断,服务隔离,监控等一些防止雪崩的技术。
服务降级:接口调用失败就调用本地的一个方法返回空
服务熔断:接口调用失败就会进入到调用接口之前定义好的一个熔断方法,返回错误信息。
服务隔离:隔离服务之间相互影响
服务监控:在服务发生调用时,会将每秒请求数(QPS),成功请求数等运行指标记录下来。
3、谈谈服务雪崩效应
雪崩效应是在大型互联网项目中,当某个服务发生宕机时,调用这个服务的其他服务也会发生宕机,大型项目的微服务之间调用是互通的,这样就会将服务的不可用逐步扩大到各个其他服务中,从而使整个项目的服务宕机
发生雪崩,一般原因有以下几点。单个服务的代码存在bug;服务请求量递增导致服务发生崩溃(抢红包,秒杀);服务的硬件故障也会导致部分服务不可用。
4、在微服务中,如何保护服务
一般使用Hystrix框架,实现服务隔离避免出现服务的雪崩效应,从而达到保护服务的效果。当微服务中,高并发的服务导致服务线程阻塞,使单个服务宕机,服务的不可用会蔓延到其他服务,引起整个服务灾难性后果,使用
服务降级能有效为不同的服务分配资源,一但服务不可用,则返回友好提示,不占用其他服务资源,从而避免丹哥服务崩溃引起整个服务的不可用。
5、服务雪崩效应产生的原因
Tomcat默认情况下只会有一个线程池来维护客户端发送的所有请求,这时如果某一个接口在某一时刻被大量访问就会占用tomcat线程池所有线程,其他请求处于等待装填,无法连接到服务接口。
6、谈谈服务降级,熔断,服务隔离
服务降级:当客户端请求服务器的时候,防止客户端一直等待,不会处理业务逻辑代码,直接返回一个友好的提示给客户端。
Hystrix实现服务降级的功能主要是通过重写HystrixCommand中的getFallback方法,当Hystrix的run方法或construct执行错误的时候转而执行getFallback方法。
服务熔断:在服务降级的基础上更直接的一种保护方式,当在一个时间范围内的失败请求数达到一个设定值(requestVolumeThreshold)或当前请求的错误率达到设定的错误阈值(errorThresholdPercentage)时开启断路,之后的
请求直接走fallback方法,在设定时间(sleepWindowInMIllisconds)后尝试恢复。
服务隔离:隔离就是Hystrix为服务开启一个独立的线程池,这样在高并发的情况下不会影响其他服务。服务隔离有线程池和信号量两种实现方式,一般使用线程池。
(六)Feign
1、什么是Feign,它的优点
feign才用的是基于接口的注解,feign整合了Ribbon,具有负载均衡的能力,整合了Hystrix,具有熔断的能力。
使用:添加pom依赖,启动类添加@EnableFeignClients,定义一个接口@FeignClient(name="xxx")指定调用哪个服务。、
2、Ribbon和Feign的区别
启动类不同:Ribbon是@RibbonClient,Feign是@EnableFeignClients。
服务指定位置不同:Ribbon是在@RibbonClient注解上声明,Feig则是在定义抽象方法的接口中使用@FeignClient声明。
调用方式不同:Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤繁琐。Feign则是在Ribbon的基础上进行了一次改进,采用接口的形式,将需要调用的服务方法定义成抽象方法保存在本地就可以了,
不需要构建http请求了,直接用接口就行。
(七)Bus
什么是SPring cloud Bus
spring cloud bus将分布式的节点用轻量级的消息代理链接起来,可以用于广播配置文件的更改或者服务直接的通讯。
spring cloud bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改,时间推送,也可以当做微服务之间的通讯。它不能单独完成通信,需要配合MQ支持。一般是配合Springcloud config做配置中心的。
(八)Config
什么是Spring Cloud Config
Spring cloud Config为分布式系统中的外部配置提供服务器和客户端支持,可以方便的对微服务各个环境下的配置进行集中式管理。分为Config Server和Config Client两部分。Config Server负责读取配置文件,并且暴露httpAPI接口,
Config Client通过调用ConfigServer的接口来读取配置文件。
实时刷新采用SpringCloud Bus消息总线。
(九)Gateway
什么是SpringCloud Gateway
SpringCloud Gateway是SpringCloud官方推出的第二代网关框架,取到zuul网关。网关常见的功能有,路由转发,权限校验,限流控制等作用。
常见的限流算法有:固定窗口算法,滑动窗口算法,漏斗算法,和令牌通算法。
限流分类:合法性验证限流,恶意限流(验证码,IP黑名单),正常限流(接口限流(服务端接口),ServiceId限流(客户端serviceId),服务限流(整个服务端))。容器限流(tomcat(最大线程数)),nginx(控诉限流,并发连接数))。
(十)SpringCloud主要项目
1、Spring Cloud Config
Config能够管理所有微服务的配置文件,集中配置管理工具,分布式系统中统一的外部配置管理,默认使用Git来存储配置,可以支持客户端配置的刷新及加密、解密操作。
2、Spring Cloud Netflix(重点,这些组件用的最多)
Netflix OSS 开源组件集成,包括Eureka、Hystrix、Ribbon、Feign、Zuul等核心组件。
Eureka:服务治理组件,包括服务端的注册中心和客户端的服务发现机制;
Ribbon:负载均衡的服务调用组件,具有多种负载均衡调用策略;
Hystrix:服务容错组件,实现了断路器模式,为依赖服务的出错和延迟提供了容错能力;
Feign:基于Ribbon和Hystrix的声明式服务调用组件;
Zuul:API网关组件,对请求提供路由及过滤功能。
3、Spring Cloud Bus
用于传播集群状态变化的消息总线,使用轻量级消息代理链接分布式系统中的节点,可以用来动态刷新集群中的服务配置信息。
简单来说就是修改了配置文件,发送一次请求,所有客户端便会重新读取配置文件。需要利用中间插件MQ