1. SpringCloud
SpringCloud 是⼀个微服务框架,相⽐ Dubbo 等 RPC 框架,SpringCloud 提供的全套的分布式 系统解决⽅案。SpringCloud 对微服务基础框架 Netflix 的多个开源组件进⾏了封装, 同时⼜实 现了和云端平台以及和 SpringBoot 开发框架的集成。SpringCloud 为微服务架构开 发涉及的配 置管理,服务管理,熔断机制,智能路由,微代理,控制总线,⼀次性 token, 全局⼀致性锁, leader 选举,分布式 session,集群状态管理等操作提供了⼀种简单的开发 式。SpringCloud 为 开发者提供了快速构建分布式系统的⼯具,开发者可以快速的启动服务 器或构建应⽤,同时能 够快速和云平台资源进⾏对接。
2. 什么是微服务?
微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成。系统中的各个微服务 可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注于完成一件任务并很好地完成该 任务。在所有情况下,每个任务代表着一个小的业务能力。 可以在“自己的程序”中运行,并通过“轻量级设备与 HTTP 型 API 进行沟通”。关键在于该服务可 以在自己的程序中运行。通过这一点我们就可以将服务公开与微服务架构(在现有系统中分布一 个 API)区分开来。在服务公开中,许多服务都可以被内部独立进程所限制。如果其中任何一个 服务需要增加某种功能,那么就必须缩小进程范围。在微服务架构中,只需要在特定的某种服务 中增加所需功能,而不影响整体进程。
3. 使用 SpringCloud 有什么优势?
SpringCloud 来源于 Spring,质量、稳定性、持续性都可以得到保证。 SpirngCloud 天然支持 SpringBoot,更加便于业务落地。 SpringCloud 发展非常的快,从 2016 年开始接触的时候相关组件版本为 1.x,到现在将要发布 2.x 系列。 SpringCloud 是 Java 领域最适合做微服务的框架。 相比于其它框架,SpringCloud 对微服务周边环境的支持力度最大。 对于中小企业来讲,使用门槛较低。 SpringCloud 是微服务架构的最佳落地方案。
4. SpringCloud 如何实现服务的注册和发现
服务在发布时指定对应的服务名(服务名包括了 IP 地址和端⼝)将服务注册到注册中⼼ (eureka 或 者 zookeeper) 。 这 ⼀ 过 程 是 SpringCloud ⾃ 动 实 现 只 需 要 在 main ⽅ 法 添 加 EnableDisscoveryClient 同⼀ 服务修改端⼝就可以启动多个实例。 调⽤⽅法:传递服务名称通过注册中⼼获取所有的可⽤实例,通过负载均衡策略调⽤ (ribbon 和 feign)对应的服务。
5. Ribbon 和 Feign 的区别
Ribbon 添加 Maven 依赖 spring-starter-ribbon 使⽤@RibbonClient(value=”服务名称”)使 RestTemplate 调⽤远程服务对应的⽅法。 Feign 添加 Maven 依赖 spring-starter-feign 服务提供⽅提供对外接⼝,调⽤⽅接⼝在接 ⼝上使 ⽤@FeignClient(“指定服务名”)。 Ribbon 和 Feign 都是⽤于调⽤其他服务的,不过⽅法不同。 1. 启 动 类 使 ⽤ 的 注 解 不 同 , Ribbon ⽤ 的 是 @RibbonClient , Feign ⽤ 的 @EnableFeignClients。 2. 服务的指定位置不同,Ribbon 是在@RibbonClient 注解上声明,Feign 则是在定义 抽象⽅法 的接⼝中使⽤@FeignClient 声明。 3. 调⽤⽅法不同,Ribbon 需要⾃⼰构建 HTTP 请求,模拟 HTTP 请求然后使⽤ RestTemplate 发送给其他服务,步骤相当繁琐。Feign 则是在 Ribbon 的基础上进⾏了⼀次 进,采⽤接⼝的 ⽅式,将需要调⽤的其他服务的⽅法定义成抽象⽅法即可。不需要⾃⼰构建 HTTP 请求。不过 抽象⽅法的注解、⽅法签名要和提供服务的⽅法完全⼀致。
6. SpringCloud 的特性
分布式/版本化配置。 服务注册和发现。 路由。 服务和服务之间的调用。 负载均衡。 断路器。 分布式消息传递。
7. 什么是 SpringCloudEureka?
Spring Cloud Eureka 是基于 Spring Cloud Netflix 微服务套件的一部分,它基于 Eureak 做了 二次封装,主要负责完成微服务构架中的服务治理功能。Spring Cloud 为 Eureka 增加了 Spring Boot 风格的自动化配置,我们只需通过简单引入依赖和注解配置就能让 Spring Bootg 构建的微 服务应用轻松地与 Eureka 服务治理体系进行整合。服务治理是微服务构架中最为核心和基础的 模块,它主要用来实现各个微服务实例的自动化注册与发现。
8. 什么是负载均衡?
负载均衡分为服务端负载均衡和客户端负载均衡。 服务端负载均衡:当浏览器向后台发出请求的时候,会首先向反向代理服务器发送请求, 反向代理服务器会根据客户端部署的 ip:port 映射表以及负载均衡策略,来决定向哪台服务器发 送请求,一般会使用到 nginx 反向代理技术。 客户端负载均衡:当浏览器向后台发出请求的时候,客户端会向服务注册器(例如: EurekaServer), 拉取注册到服务器的可用服务信息,然后根据负载均衡策略,直接命中哪台服务器发送请求。这 整个过程都是在客户端完成的,并不需要反向代理服务器的参与。
AAA 教育软件学院 学术部编辑 QQ:83193980
技术成就梦想 软件创造价值 136
服务端负载均衡:分为两种,一种是硬件负载均衡,还有一种是软件负载均衡。 我们主要讲客户端负载均衡,Springcloud Ribbon 是一个基于 Http 和 TCP 的客服端负载均衡工 具,它是基于 NetflixRibbon 实现。Ribbon 不需要独立部署,但它几乎存在于每个微服务的基础 设施中。Ribbon 可以通过在客户端中配置 ribbonServerList 来设置服务端列表去轮询访问以达到 均衡负载的作用。 当 Ribbon 与 Eureka 联合使用时,ribbonServerList 会被 DiscoveryEnabledNIWSServerList 重写, 扩展成从Eureka注册中心中获取服务实例列表。 同时它也会用NIWSDiscoveryPing来取代IPing, 它将职责委托给 Eureka 来确定服务端是否已经启动。SpringCloud Feign 默认集成了 Ribbon,并 和 Eureka 结合,默认实现了负载均衡的效果,也是客户端使用。
9. 什么是服务容错保护?什么是 SpringCloudHystrix?
SpringCloud Hystrix 是服务容错保护,也是服务熔断器。Hystrix 是 Spring Cloud 提供的一种带有 熔断机制的框架,由于在微服务系统中同一个操作会由多个不同的微服务来共同完成,所以微服 务与微服务之间会由很多相互的调用,由于在分布式环境中经常会出现某个微服务节点故障的情 况,所以会由调用失败发生,而熔断器的作用就是当出现远程调用失败的时候提供一种机制来保 证程序的正常运行而不会卡死在某一次调用,类似 Java 程序中的 try-catch 结构,而只有当异常 发生的时候才会进入 catch 的代码块。
10. 什么是声明式服务调用?
Spring Cloud Feign 是声明式服务调用。Feign 是一个声明式的 WebService 客户端,它的目的就 是让 WebService 调用更加简单。Feign 提供了 HTTP 请求的模板,通过编写简单的接口和插入 注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。而 Feign 则会完全代理 HTTP 请求, 我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。
11. 什么是 api 服务网关?
API 网关是一个服务器,是系统的唯一入口。从面向对象设计的角度看,它与外观模式类似。 API 网关封装了系统内部架构,为每个客户端提供一个定制的 API。它可能还具有其它职责,如 身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。 API 网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处 理所有的非业务功能。通常,网关也是提供 REST/HTTP 的访问 API。服务端通过 API-GW 注册 和管理服务。Spring Cloud Zuul 是 API 网关,Zuul 是 Netflix 开源的微服务网关,他可以和 Eureka,Ribbon,Hystrix 等组件配合使用,Filter 是 Zuul 的核心,用来实现对外服务的控制。Filter 的生命周期有 4 个,分是“PRE”、“ROUTING”、“POST”、“ERROR”。
12. 什么是 SpringCloudConfig?
配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、 Git 以及 svn。 如果微服务架构中没有使用统一配置中心时,所存在的问题: 配置文件分散在各个项目里,不方便维护 配置内容安全与权限,实际开发中,开发人员是不知道线上环境的配置的
更新配置后,项目需要重启 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分 布式配置中心组件。市面上开源的配置中心有很多,BAT 每家都出过,360 的 QConf、淘宝的 diamond、百度的 disconf 都是解决这类问题。国外也有很多开源的配置中心 Apache 的 Apache CommonsConfiguration、 owner、 cfg4j等等。 在Spring Cloud中,有分布式配置中心组件springcloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程 Git 仓库中。在 spring cloud config 组件中,分两个角色,一是 configserver,二是 config client。一个配置中心提供的 核心功能: 提供服务端和客户端支持 集中管理各环境的配置文件 配置文件修改之后,可以快速的生效 可以进行版本管理 支持大的并发查询 支持各种语言
13. 什么是 SpringCloudBus?
在微服务架构的系统中,我们通常会使用轻量级的消息代理来构建一个共用的消息主题让 系统中所有微服务实例都连接上来,由于该主题中产生的消息会被所有实例监听和消费,所以我 们称它为消息总线。 SpringCloudBus 就像一个分布式执行器,用于扩展的 SpringBoot 应用程序, 但也可以用作应用程序之间的通信通道。SpringCloudBus 支持 RabbitMQ 和 Kafka。
14. 什么是 SpringCloudStream?
Spring Cloud Stream 是构建消息驱动的微服务应用程序的框架。Spring Cloud Stream 基于 Spring Boot 建立独立的生产级 Spring 应用程序,并使用 Spring Integration 提供与消息代理的连接。它 提供了来自几家供应商的中间件的意见配置,介绍了持久发布订阅语义,消费者组和分区的概念。
15. SpringCloudStream 与 SpringCloudBus 区别?
SpringCloudStream 通过对消息中间件进行抽象封装,提供一个统一的接口供我们发送和监听消 息,而 Bus 则是在 Stream 基础之上再次进行抽象封装,使得我们可以在不用理解消息发送、监 听等概念的基础上使用消息来完成业务逻辑的处理。SpringCloudStream 中,异步调用能让各个 服务充分解耦而且也更加灵活。而 SpringCloudBus 就是借助消息驱动来实现将消息(事件)广 播到各个服务中,然后服务对这些消息进行消费。
16. 什么是 SpringCloudSecurity?
Spring Cloud Security 提供了一组原语,用于构建安全的应用程序和服务,而且操作简便。可以 在外部(或集中)进行大量配置的声明性模型有助于实现大型协作的远程组件系统,通常具有中 央身份管理服务。它也非常易于在 Cloud Foundry 等服务平台中使用。在 Spring Boot 和 Spring Security OAuth2 的基础上,可以快速创建实现常见模式的系统,如单点登录,令牌中继和令牌 交换。有以下功能:
从 Zuul 代理中的前端到后端服务中继 SSO 令牌 资源服务器之间的中继令牌 使 Feign 客户端表现得像 OAuth2RestTemplate(获取令牌等)的拦截器 在 Zuul 代理中配置下游身份验证
17. SpringBoot 和 SpringCloud
SpringBoot 是 Spring 推出用于解决传统框架配置文件冗余,装配组件繁杂的基于 Maven 的解决方 案,旨在快速搭建单个微服务 而 SpringCloud 专注于解决各个微服务之间的协调与配置,服务之间的通信,熔断,负载均衡等 技术维度并相同,并且 SpringCloud 是依赖于 SpringBoot 的,而 SpringBoot 并不是依赖与 SpringCloud,甚至还可以和 Dubbo 进行优秀的整合开发。 总结: SpringBoot 专注于快速方便的开发单个个体的微服务 SpringCloud 是关注全局的微服务协调整理治理框架,整合并管理各个微服务,为各个微服务之间 提供,配置管理,服务发现,断路器,路由,事件总线等集成服务 SpringBoot 不依赖于 SpringCloud,SpringCloud 依赖于 SpringBoot,属于依赖关系 SpringBoot 专注于快速,方便的开发单个的微服务个体,SpringCloud 关注全局的服务治理框架
18. SpringCloud 断路器的作用
当⼀个服务调⽤另⼀个服务由于⽹络原因或者⾃身原因出现问题时,调⽤者就会等待 被调⽤者 的响应,当更多的服务请求到这些资源时。导致更多的请求等待,这样就会发⽣ 锁效应(雪崩效 应),断路器就是解决这⼀问题。 断路器状态: 完全打开状态:⼀定时间内达到⼀定次数⽆法调⽤,并且多次检测没有恢复的迹象, 断路器完 全打开,那么下次请求就不会请求到该服务。 半开状态:段时间内,有恢复迹象断路器会将部分请求发给该服务,当能正常调⽤时 断路器关 闭。 关闭状态:当服务⼀直处于正常状态,能正常调⽤断路器关闭。
19. 什么是服务熔断?什么是服务降级
在复杂的分布式系统中,微服务之间的相互调用,有可能出现各种各样的原因导致服务的阻塞,在 高并发场景下,服务的阻塞意味着线程的阻塞,导致当前线程不可用,服务器的线程全部阻塞,导致 服务器崩溃,由于服务之间的调用关系是同步的,会对整个微服务系统造成服务雪崩 为了解决某个微服务的调用响应时间过长或者不可用进而占用越来越多的系统资源引起雪崩效 应就需要进行服务熔断和服务降级处理。
20. 微服务的优缺点分别是什么?
优点: 每一个服务足够内聚,代码容易理解
开发效率提高,一个服务只做一件事 微服务能够被小团队单独开发 微服务是松耦合的,是有功能意义的服务 可以用不同的语言开发,面向接口编程 易于与第三方集成 微服务只是业务逻辑的代码,不会和 HTML,CSS 或者其他界面组合 开发中,两种开发模式 前后端分离 全栈工程师 可以灵活搭配,连接公共库/连接独立库 缺点 分布式系统的负责性 多服务运维难度,随着服务的增加,运维的压力也在增大 系统部署依赖 服务间通信成本 数据一致性 系统集成测试 性能监控
21. 服务注册和发现是什么意思?SpringCloud 如何实现?
当我们开始一个项目时,我们通常在属性文件中进行所有的配置。随着越来越多的服务开发和部 署,添加和修改这些属性变得更加复杂。有些服务可能会下降,而某些位置可能会发生变化。手 动更改属性可能会产生问题。 Eureka 服务注册和发现可以在这种情况下提供帮助。由于所有服 务都在 Eureka 服务器上注册并通过调用 Eureka 服务器完成查找,因此无需处理服务地点的任何 更改和处理。
22. SpringCloud 核心组件,在微服务架构中,分别扮演的角色:
Eureka:各个服务启动时,EurekaClient 都会将服务注册到 Eureka Server,并且 EurekaClient 还 可以反过来从 EurekaServer 拉取注册表,从而知道其他服务在哪里 Ribbon:服务间发起请求的时候,基于 Ribbon 做负载均衡,从一个服务的多台机器中选择一台 Feign:基于 Feign 的动态代理机制,根据注解和选择的机器,拼接请求 URL 地址,发起请求 Hystrix:发起请求是通过 Hystrix 的线程池来走的,不同的服务走不同的线程池,实现了不同服 务调用的隔离,避免了服务雪崩的问题 Zuul:如果前端、移动端要调用后端系统,统一从 Zuul 网关进入,由 Zuul 网关转发请求给对应 的服务
23. Eureka 和 ZooKeeper 都可以提供服务注册与发现的功能,请说说两个的区别?
1、ZooKeeper 保证的是 CP,Eureka 保证的是 AP ZooKeeper 在选举期间注册服务瘫痪,虽然服务最终会恢复,但是选举期间不可用的 Eureka 各个节点是平等关系,只要有一台 Eureka 就可以保证服务可用,而查询到的数据并不是最
新的 自我保护机制会导致 Eureka 不再从注册列表移除因长时间没收到心跳而应该过期的服务 Eureka 仍然能够接受新服务的注册和查询请求,但是不会被同步到其他节点(高可用) 当网络稳定时,当前实例新的注册信息会被同步到其他节点中(最终一致性) Eureka 可以很好的应对因网络故障导致部分节点失去联系的情况,而不会像 ZooKeeper 一样使得 整个注册系统瘫痪 2、ZooKeeper 有 Leader 和 Follower 角色,Eureka 各个节点平等 3、ZooKeeper 采用过半数存活原则,Eureka 采用自我保护机制解决分区问题 4、Eureka 本质上是一个工程,而 ZooKeeper 只是一个进程
AAA 教育软件学院 学术部编辑 QQ:83193980
技术成就梦想 软件创造价值 141
24. 你所知道的微服务技术栈有哪些?请列举一二
多种技术的集合体
我们在讨论一个分布式的微服务架构的话,需要哪些维度
维度(SpringCloud)
服务开发
SpringBoot
Spring
SpringMVC
服务配置与管理
Netfilx 公司的 Archaiusm,阿里的 Diamond
服务注册与发现
Eureka,ZooKeeper
服务调用
Rest,RPC,gRPC
服务熔断器
Hystrix
服务负载均衡
Ribbon,Nginx
服务接口调用
Feign
消息队列
Kafka,RabbitMq,ActiveMq
服务配置中心管理
SpringCloudConfing
服务路由(API 网关)
Zuul
事件消息总线
SpringCloud Bus