Java SpringCloud gateway面试题

Java SpringCloud gateway面试题


前言

最新的 Java 面试题,技术栈涉及 Java 基础、集合、多线程、Mysql、分布式、Spring全家桶、MyBatis、Dubbo、缓存、消息队列、Linux...等等,会持续更新。

如果对老铁有帮助,帮忙免费点个赞,谢谢你的发财手!

1、什么是网关Zuul(gateway)?

网关是一个处于客户端或服务端之间的服务,提供了统一的访问入口,所有客户端请求必须通过网关转发到具体的服务。

2、服务网关的作用?

统一管理微服务请求,身份认证、负载均衡、路由转发、用户限流、安全控制黑名单和白名单等,简化客户端调用复杂度,统一处理外部请求。

3、Zuul网关(Gateway)如何搭建集群?

使用Nginx的upstream设置Zuul服务集群,通过location拦截请求并转发到upstream,默认使用轮询机制对Zuul集群发送请求。

4、ZuulFilter常用有那些方法?

  • 1、Run():过滤器的具体业务逻辑;
  • 2、shouldFilter():判断过滤器是否有效;
  • 3、filterOrder():过滤器执行顺序;
  • 4、filterType():过滤器拦截位置。

5、如何实现动态zuul网关路由转发?

通过配置拦截请求,根据ServiceId到注册中心获取转发的服务列表,Zuul内部使用Ribbon实现本地负载均衡和转发。

6、在Zuul中做登录检查如何实现?

可以通过继承ZuulFilter抽象类,自定义pre类型的过滤器,shouldFilter方法中可以定义需要放行的资源,run方法中检查请求头中的token信息,如果没有token,就响应到客户端未登录的信息。

7、GateWay如何实现限流?

  • GateWay使用令牌桶算法实现限流(Nginx使用漏桶算法实现限流);
  • GateWay默认使用Redis的RateLimter限流算法来实现,主要配置令牌桶填充的速率,令牌桶容量,指定限流的key,可以根据用户信息、IP 、接口等限流。

8、kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?

Kafka 中发送 1 条消息的时候,可以指定(topic, partition, key) 3 个参数,分区和 key 是可选的;

如果你指定了分区,那所有消息发往同 1个分区,就是有序的,并且在消费端,Kafka 保证1 个 分区只能被1 个 consumer 消费。或者指定 key(比如 order id),具有同 1 个 key 的所有消息,会发往同 1 个 分区。

Spring Security面试题

9、讲一下你们的登录实现方案?

之前做过一个单体应用,使用过的是Redis来做登录,当用户第一次发起登录请求,后台生成一个token保存到Redis中,将生成的token返回给用户端,用户端使用用浏览器中的localStorage保存token,通过axios的拦截器,给每次请求的请求头都加上token,服务端收到token,就能在Redis中找到对应的数据。

10、第三方登录流程讲一下?

  • 1.用户发起第三方微信登录请求;
  • 2.后端通过appId调用微信接口获取code,请求成功返回一个二维码界面;
  • 3.用户使用微信扫一扫并同意授权;
  • 4.后端通过appId、secret和code再次请求微信接口获取access_token和openId;
  • 5.授权成功后跳转页面;
  • 6.后端根据openid和access_token获取用户信息。
    可以把openId保存起来,下次就不需要再次授权。

11、说一下security的认证原理?

  • 1、请求会经过UsernamePasswordAuthenticationFilter拦截,请求的用户名密码会封装成UsernamePasswordAuthenticationToken,过滤器将token提交给认证管理器AuthenticationManager进行认证;
  • 2、认证管理器调用AuthenticationProvider进行认证,AuthenticationProvider再调用UserDetailsService获取到数据库中存储的用户信息UserDetails,然后调用密码编码器(enCode)对密码进行比较,认证成功后封装到Authentication;
  • 3、请求回到UsernamePasswordAuthenticationFilter,调用SecurityContextHolder将Authentication对象封装成SecurityContext并保存到SecurityContextHolder中。

12、OAuth2的四种授权模式?

OAuth2是一个安全的开放授权协议,与传统的授权方式相比,它不会使第三方触及到用户的账号信息,Oauth2有四种授权模式:

  • 1、授权码模式:它是功能最完整,流程最严密的授权模式;
  • 2、密码模式:通过用户名密码的方式来换取Token ;
  • 3、简化模式:它简化了授权码模式,跳过了授权码这个步骤, 前三种都可以用作三方登录;
  • 4、客户端模式: 以客户端的名义直接向服务器申请Token,这种需要对客户端非常信任。

13、讲一下你们的微服务授权方案?

我们使用的是Spring Cloud Oauth2 ,它整合了SpringSecurity+Oauth2+JWT,主要分为两块配置:认证服务器:负责颁发token;资源服务器:负责校验Token和资源授权。

我们项目是资源服务器去校验Token,也可以将Token校验工作交给网关统一校验,资源服务器只负责授权工作。

另外常见的授权方案还有,CAS单点登录,用户只用在某个服务上登录,访问其他服务时就不需要登录了,这就要求每个面向用户的服务都必须于认证服务交互,会产生大量重复的工作;

分布式会话,它是将用户认证信息存储在redis中,通常会以会话作为key,当用户访问微服务时,就从redis中获取认证信息。这对安全存储有较高的要求,复杂度高。

14、讲一下你们微服务认证授权的整体流程?

认证中心-》密码模式-》httpclient -》security的认证流程-》oauth2生成令牌 -》请求带令牌 -》校验令牌 -》方法授权。
  • 1、浏览器带着用户名和密码访问认证中心的登录方法;
  • 2、登录方法会拼接一个基于密码模式的获取Token的url;
  • 3、使用httpclient把请求发出去,请求会到达认证服务器(uaa);
  • 4、认证服务器会走security的认证流程完成认证,以及加载用户的权限;
  • 5、然后认证服务器会通过oauth2,基于JWT生成Token;
  • 6、然后把令牌返回给浏览器,浏览器把Token存储到LocalStorage中。

15、Oauth2认证,如果Token过期了你们是怎么处理的?

  • 1、前端发起请求时会检查token是否过期了;
  • 2、如果是则通过刷新refresh_token,发送请求获取新的token;
  • 3、后台接收到前台的刷新token请求,重新生成token并返回客户端;
  • 4、客户端收到新的token就把旧的覆盖掉,后续请求都用新的token了。

16、Oauth2认证,如果Token被盗了怎么办?

  • 1、我们需要对token设置过期时间,这个时间可以根据需要设置短一点;
  • 2、可以在token中加入ip地址标识,如果短时间内ip地址频繁变动,就标记为异常状态,并给用户发送信息,提示账户有风险。

Eureka面试题

17、什么是Eureka Server的自我保护模式?

默认情况下,如果Eureka Server在90秒内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例,但如果是网络分区发生故障,那么不应该注销这个微服务,因为微服务本身是健康的。

  • Eureka Server通过"自我保护模式"来解决这个问题----当Eureka Server节点在短时间内丢失过多客户端时,那么这个节点就会进入自我保护模式。一旦进入该模式,Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不会注销任何微服务)。
  • 当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。
    自我保护模式是一种对网络异常的安全保护措施,使用自我保护模式,可以让Eureka集群更加的健壮、稳定。

18、Eureka服务注册与发现原理?

  • 1、每30s发送⼼跳检测重新进⾏租约,如果客户端不能多次更新租约,它将在90s内从服务器注册中⼼移除。
  • 2、注册信息和更新会被复制到其他Eureka 节点,来⾃任何区域的客户端可以查找到注册中⼼信息,每30s发⽣⼀次复制来定位他们的服务,并进⾏远程调⽤。
  • 3、客户端会缓存服务实例信息,即使Eureka全挂掉,客户端也是可以请求到服务地址的。

19、Eureka服务配置详解?

执行流程:
  • 1、先启动 eureka 注册中心;
  • 2、启动服务提供者 provider;
  • 3、服务提供者启动后会把自身信息(比如服务地址以别名方式注册进 eureka);
  • 4、消费者 consumer 服务在需要调用接口时,使用服务别名去注册中心获取实际的 RPC 远程调用地址;
  • 5、消费者获得调用地址后,底层实际是利用 HttpClient 技术实现远程调用;
  • 6、消费者获得服务地址后会缓存在本地 JVM内存中,默认每间隔 30 秒更新一次服务调用地址。

20、Eureka服务端启动?

Eureka是Netflix开发的服务发现框架,包含两个组件:

  • Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册;
  • Eureka Client客户端就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器,
    在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

21、Eureka和ZooKeeper请说说两个的区别?

Eureka和ZooKeeper都可以提供服务注册与发现的功能。

  • 1、ZooKeeper保证的是CP,Eureka保证的是AP;
  • 2、ZooKeeper有Leader和Follower角色,Eureka各个节点平等。
  • 3、ZooKeeper在leader选举期间不对外提供服务;但Eureka只要有一台服务器就可以对外提供服务,当其他节点服务器重启后,当前服务器的注册信息会被同步到其他节点中,实现最终一致性,Eureka可以很好的应对因网络故障导致部分节点失去联系的情况。

总结

都已经看到这里啦,赶紧收藏起来,祝您工作顺心,生活愉快!

相关推荐
天天扭码38 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
跳跳的向阳花1 小时前
03-03、SpringCloud第三章,负载均衡Ribbon和Feign
spring cloud·ribbon·负载均衡
inter_peng16 小时前
[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法
tcp/ip·docker·eureka
天天扭码17 小时前
五天SpringCloud计划——DAY1之mybatis-plus的使用
java·spring cloud·mybatis
小灰灰__1 天前
Linux离线安装Docker命令,简单镜像操作
linux·docker·eureka
luckywuxn1 天前
Spring Cloud Alibaba、Spring Cloud 与 Spring Boot各版本的对应关系
spring boot·spring·spring cloud
wclass-zhengge2 天前
SpringCloud篇(服务网关 - GateWay)
spring boot·spring cloud·gateway
荆州克莱2 天前
Redis | Redis常用命令及示例总结(API)
spring boot·spring·spring cloud·css3·技术
RainbowSea2 天前
5. Spring Cloud OpenFeign 声明式 WebService 客户端的超详细使用
java·spring·spring cloud
听潮阁2 天前
【SpringCloud详细教程】-02-微服务环境搭建
spring·spring cloud·微服务