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可以很好的应对因网络故障导致部分节点失去联系的情况。

总结

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

相关推荐
蓝眸少年CY1 小时前
(第三篇)Springcloud之Ribbon负载均衡
spring cloud·ribbon·负载均衡
backRoads8 小时前
docker部署springboot(eureka server)项目
spring boot·docker·eureka
lozhyf8 小时前
Eureka搭建
java·spring cloud
陈平安Java and C1 天前
Eureka、LoadBalance和Nacos
eureka
007php0071 天前
使用 Docker 安装 Elastic Stack 并重置本地密码
大数据·运维·后端·mysql·docker·eureka·jenkins
零点零一3 天前
docker能用来干什么的
云原生·eureka
MiniFlyZt3 天前
分布式数据库TiDB:架构、核心特性与生产实践(分库分表)
java·数据库·分布式·spring cloud·微服务·tidb
NovakG_3 天前
SpringCloud小白入门+项目搭建
后端·spring·spring cloud