Gateway
1在你们的顶目中用到了网关的娜些功能?
路由
跨域
鉴权
限流
2你在开发过程中经常使用的路由断言有哪些
Path : 根据请求路径匹配
Before/After : 根据时间路由 , 一般用于新版本上线
Header : 根据请求头路由, 一般用户灰度发布
3你们在开发中经常用到的过滤器有哪些?
AddRequestHeader : 添加请求头 , 用户sentinel黑白名单
RequestRateLimiter : 限流配置
StripPrefix : 取消路径前缀
4有没有使用过网关的全局过滤器?
使用过, 主要通过自定义全局过滤器实现对请求的统一权限校验
客户端发送请求携带token到网关, 由网关负责统一的token解析,
解析完毕之后获取token中的用户信息, 保存到请求头中, 路由到微服务
Feign
1什么是Feign?
1 Feign 是一个声明web服务客户端,这使得编写web服务客户端更容易
2 他将我们需要调用的服务方法定义成抽象方法保存在本地就可以了,
不需要自己构建Http请求了,直接调用接口就行了,
调用方法要和本地抽象方法的映射路径 , 参数和返回类型一致。
2 Feign的服务调用和Dubbo有什么区别?
feign是基于HTTP协议的远程调用
Dubbo是基于RPC的远程调用
3使用Feigni调用服务过程中超时怎么办?
- 可以调整feign的超时时间
ConnectTimeout
ReadTimeout
4使用Feign进行远程调用,如问实现负载均衡
Ribbon
5如问提高Feign的服务调用效率?
Feign底层采用URLConnection发起远程调用, 默认不支持连接池
我们可以修改底层实现使用OkHttp , HttpClient 实现远程调用 , 这样连接可以回收 , 提升了效率
具体做法就是
1 添加feign-httpclient依赖
2 配置使用HttpClient
Nacos
1 Nacos作为配置中心的原理
1 服务提供者在nacos上注册服务信息,然后发送数据到服务端
2 服务消费者主动去服务端上拉取数据
2 Nacos如何实现环境隔离,namespace?知道嘛?
Nacos提供了namespace来实现环境隔离功能。
nacos中可以有多个namespace
namespace下可以有group、service等
不同namespace之间相互隔离,例如不同namespace的服务互相不可见
namespace 命名空间
可以自己指定也可以默认产生UUID , 在application.yml配置文件中配置
3什么是Nacos.服务分级存储模型?
一个服务可以有多个实例 , 假如这些实例分布于全国各地的不同机房 ,
Nacos就将同一机房内的实例 划分为一个集群 , 一个服务可以包含多个集群,形成分级模型
配置 discovery:
cluster-name: HZ # 集群名称即可实现
配置之后微服务互相访问时,会尽可能访问同集群实例,因为本地访问速度更快。当本集群内不可用时,才访问其它集群
4 Nacos中注册的服务实例类型有哪些?
Nacos的服务实例分为两种l类型:
临时实例:如果实例宕机超过一定时间,会从服务列表剔除,默认的类型。
非临时实例:如果实例宕机,不会从服务列表剔除,也可以叫永久实例。
5 Nacos:和Eureka有什么区别?
Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
临时实例心跳不正常会被剔除,非临时实例则不会被剔除
Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;
Eureka采用AP方式
6项目启动的时候是先加载本地文件还是Nacos中的文件?
在本地文件中会配置Nacos配置中心地址, 所以肯定是先加载本地配置文件, 连接上Nacos再加载配置中心中的文件
7如何实现配置的热更新,配置改变的情况下
不修改源码即可实现配置的更新?
我们使用Nacos作为配置中心, 实现热更新非常简单, 有二种方式 ;
1 在需要热更新的类上添加@RefreshScope注解, 使用@Value注解读取需要更新的配置
2 使用@ConfigurationProperties注解代替@Value注解 , 可以直接实现热更新
当配置方式改变的时候, Nacos会主动向服务推送改变的内容
Ribbon
1 Ribbonz是如何实现负载均衡的?
1 发送请求,被LoadBalancerInterceptor拦截器拦截,请求被交给ribbon来处理
2 拦截器拦截请求,交给了RibbonLoadBalancerClient的execute方法(下面的逻辑都是包含在这个方法中)
3 在进行负载均衡之前首先得知道有哪些服务实例信息,所以通过DynamicServerListLoadBalancer的updateListOfServers方法从注册中心(Eureka)那里获取到了所有的服务实例信息,并且会定时更新
4 使用负载均衡算法(默认轮询算法)从所有的服务实例信息中选择一台机器出来
5 将请求发送给负载均衡选择出来的服务实例上去
2 Ribbon支持的负载均衡策略有哪些?
1 RoundRobinRule 轮询策略 默认采用线性负载轮询负载均衡策略
2 AvailabilityFilteringRule 可用性过滤策略 该策略根据服务状态 (宕机和繁忙) 来分配权重,过滤掉那些因为一直连接失败或高并发的服务实例
3 WeightedResponseTimeRule 加权响应时间策略 是 RoundRibbonRule 的一个子类,它对 RoundRibbonRule 的功能进行了扩展。它根据每一个服务实例的运行情况先计算出该服务实例的一个权重,然后根据权重进行服务实例的挑选,这样能够调用到更优的服务实例。
4 ZoneAvoidanceRule 区域感知轮询策略 该策略以区域、可用的服务器为基础,选择服务实例并对服务实例进行分类
5 BestAvailableRule 最空闲策略 该服务是逐个考察各服务实例,然后选择一个最小的并发请求的服务实例来提供实例
6 RandomRule 随机策略 随机选择一个可用的服务实例。
7 RetryRule 重试策略
3如何修改Ribbon的负载均衡策略?
修改Ribbon负载均衡策略的方式有二种 :
1.在配置类中配置IRule
2.在application.yml配置文件中配置
4如何自定义负载均衡策略?
Ribbon自定义负载均衡也很简单 , 自己创建类实现IRule接口 ,
实现里面的choose方法即可 , 至于具体的负载均衡规则如何做是什么就要看具体的需求了