SpringCloud-面试题(一)

SpringCloud 专栏收录该内容
0 篇文章 0 订阅

介绍一下SpringCloud
SpringCloud是一系列框架的集合,提供了微服务的一些列解决方案,他将一系列优秀的框架 基于 SpringBoot进行了整合,所以对于我们用过Springboot的程序员来说上手比较简单,通过一些简单注解我们就可以在应用中配置一下常用的模块并构建庞大的分布式系统

SpringCloud的常用组件
服务注册发现中心 Eureka / nacos
负载均衡 ribbon
断路器 hystrix
服务网管 zuul / gateway
分布式配置 config
服务调用 Feign

SpringCloud有哪些版本
版本命名方式 是以英文单词命名版本 (据说都是伦敦地铁站名称)
A版本 - H版本 我们主要用的是 Finchley.SR3 版本
不同的版本基于不同的SpringBoot

说下微服务中你知道哪些服务注册中心
Eureka,nacos

Eureka的服务续约,失效剔除,和自我保护
失效剔除
有些时候, 我们的服务实例并不一定会正常下线, 可能由于内存溢出、 网络故障等原因使得服务不能正常工作, 而服务注册中心并未收到 “服务下线” 的请求。 为了从服务列表中将这些无法提供服务的实例剔除, Eureka Server在启动的时候会创建一个定时任务,默认每隔一段时间(默认为60秒) 将当前清单中超时(默认为90秒)没有续约的服务剔除出去

服务续约
在注册完服务之后,服务提供者会维护一个心跳用来持续告诉EurekaServer: "我还活着”, 以防止Eureka Server的“剔除任务 ” 将该服务实例从服务列表中排除出去,我们称该操作为服务续约(Renew)。
关千服务续约有两个重要属性,我们可以关注并根据需要来进行调整:

eureka.instance.lease-renewal-interval-in-seconds=30
eureka.instance.lease-expiration-duration-in-seconds=90
eureka.instance.lease-renewal-interval-in-seconds 参数用于定义服务续约任务的调用间隔时间,默认为30秒。
eureka.instance.lease-expiration-duration-in-seconds参数用于定义服务失效的时间,默认为90秒

自我保护
服务注册到EurekaServer之后,会维护一个心跳连接,告诉EurekaServer自己还活着。EurekaServer 在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%, 如果出现低于的情况(在单机调试的时候很容易满足, 实际在生产环境上通常是由于网络不稳定导致), Eureka Server会将当前的实例注册信息保护起来, 让这些实例不会过期, 尽可能保护这些注册信息。

但是, 在这段保护期间内实例若出现问题, 那么客户端很容易拿到实际已经不存在的服务实例, 会出现调用失败的清况, 所以客户端必须要有容错机制, 比如可以使用请求重试、 断路器等机制。

由于本地调试很容易触发注册中心的保护机制, 这会使得注册中心维护的服务实例不那么准确。 所以, 我们在本地进行开发的时候, 可以使用eureka.server.enable-self-preservaon = false参数来关闭保护机制, 以确保注册中心可以将不可用的实例正确剔除。

如何实现两个微服务间的通信(Feign的具体使用)
Feign可以作为Http客户端来实现两个服务间的通信
如: 有服务A 和 服务B
服务B的Controller中 提供了 @RequestMapping(value=“hello”,method=RequestMethod.GET) 方法

 如果服务A 如果想调用该方法
 那么A 和 B 都需要注册到一个Eureka服务中心中

 在服务A中 就可以写一个接口
 接口上面标注 @FeignClients("服务名称")

接口的方法定义中 也要加上  @RequestMapping(value="hello",method=RequestMethod.GET)  注解,这样Feign就能通过你提供的服务名称 和 提供的请求映射 去服务中心找到对应的方法进行调用,并将返回结果进行返回。

在负载均衡和错误处理是Feign是如何实现的(断路器,Feign如何实现断路保护)
Feign的底层 提供封装了 HttpClient 进行通信请求的处理

并且整合了Ribbon实现了负载均衡

并且整合了Hystrix实现了断路器模式
(
断路器的使用  需要的配置文件中 开启断路器模式   feign.hystrix.enable=true
在@FeignClient注解中   指定fallback = 类.class

这个类呢  要求实现FeignClient的接口,  所实现的方法就是  断路的处理方法
)    
具体代码:

开启断路器
feign:
hystrix:
enabled: true

@FeignClient(value = “aisile-base”,fallback = LabelClientImpl.class) // 要使用feign 调用 哪个服务 ribbon hystrix
public interface LabelClient {

// 映射服务接口
@RequestMapping(value = “/label”,method = RequestMethod.GET)
public Result findAll();

}
熔断器实现类

@Component
public class LabelClientImpl implements LabelClient {
@Override
public Result findAll() {
return new Result(false, StatusCode.ERROR,“查询标签数据失败”);
}
}
微服务是如何对外提供统一接口的(zuul具体使用)
因为每一个微服务都是独立运行的,都有自己独立的IP和端口,而当他们需要统一对外提供服务这时候就需要
SpringCloud网关 zuul网关也是netflix公司旗下的项目

使用它也很简单
在pom依赖中 引入 Spring-cloud-starter-netflix-zuul

在SpringBoot启动类中 开启 @EnableZuulProxy

然后在配置文件中定义 路由规则:

routes:
路由名称:
path: /映射路径/**
serviceId: Eureka中的服务名称

zuul也提供了过滤器功能,如果要做一些token检查 或者 过滤时可以使用
用法 就是写一个类 继承 ZuulFilter类
会要求我们实现几个方法
filterType: 过滤器什么时候执行 pre 前置 post 过程中 after 之后
shouldFilter: 过滤器是否执行 可以写判断方法 返回boolean值 true执行,false不执行此过滤器
filterOrder: 过滤器的执行顺序 排序号
run: 具体过滤器的方法

如何实现配置管理的(config介绍及bus配置自动更新介绍)
SpringCloudConfig 分为 Server端 和 client端 , 我们会单独启动一个SpringBoot项目作为Server端,需要如下依赖:

org.springframework.cloud spring-cloud-config-server org.springframework.cloud spring-cloud-bus org.springframework.cloud spring-cloud-stream-binder-rabbit 在yml文件中 进行配置,通常我们会把配置存入git中,我们的config server配置中心 也会和git进行相连 配置如下

spring:
application:
name: aisile-config # 给配置中心起个服务名
cloud:
config:
server:
git:
uri: https://gitee.com/bw_school_admin/aisile_sns_config.git # 配置的读取地址
rabbitmq:
host: 192.168.152.146 # mq的地址
server:
port: 12000 #端口号
management: #暴露触发消息总线的地址
endpoints:
web:
exposure:
include: bus-refresh # 配置改变的通知方法

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值