京东面试题解析:SSO、Token与Redis交互、Dubbo负载均衡等

在京东的技术面试中,除了基本的编程能力外,还会涉及到一些分布式系统的架构和设计问题,尤其是SSO(单点登录)、Dubbo的负载均衡机制、Token和Redis的交互等内容。以下是一些常见的面试问题解析,希望能帮助大家更好地理解和准备这些知识点。

19. SSO是什么?

SSO(Single Sign-On,单点登录) 是一种身份验证机制,允许用户只通过一次登录认证后,就可以访问多个应用系统,而不需要在每个系统中重新输入用户名和密码。它的核心是通过统一的认证中心来管理用户的身份信息,并在各个应用间共享身份认证。​编辑

  • 工作原理

    1. 用户访问某一应用系统时,系统会将用户重定向到SSO认证中心。

    2. 用户在SSO认证中心登录后,认证中心会生成一个认证票据(例如,JWT Token),并将该票据发送回应用系统。​编辑

    3. 应用系统验证票据后,允许用户访问该系统的资源。之后,用户无需再次登录就可以访问其他已集成SSO的系统。

  • 优点

    • 减少了用户记住多个密码的负担。

    • 提高了企业系统的安全性,统一管理认证和权限。

    • 提升了用户体验,避免了重复登录。

  • 常见实现

    • 使用OAuth 2.0、JWT、CAS等协议来实现SSO功能。​编辑

20. 说一下Token和Redis交互的过程

在分布式系统中,Token通常用于认证和授权,常常与Redis配合使用,以便存储和管理Token。

Token和Redis交互的基本过程​编辑

  1. 用户登录

    • 用户通过用户名和密码进行登录,后端通过验证用户信息后,生成一个Token(例如JWT)。
  2. 存储Token到Redis​编辑

    • 后端将Token及其关联的用户信息存储在Redis中,通常使用Token作为Key,用户ID或其他信息作为Value。

    • Redis可以设置Token的过期时间,确保Token的有效期有限。
      java jedis.setex("userToken:<Token>", 3600, "<UserData>");

  3. 验证Token

    • 每次用户访问受保护的资源时,前端会将Token附带在请求头中传递给后端。​编辑

    • 后端从请求中提取Token,通过Redis检查Token是否存在并且有效。如果有效,则允许访问,否则返回未授权的错误信息。
      java String tokenData = jedis.get("userToken:<Token>"); if (tokenData == null) { return "Unauthorized"; }

  4. 删除Token

    • 用户注销时,后端从Redis中删除该Token,确保Token不再有效。
      java jedis.del("userToken:<Token>");![](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/55ca1561bad54945a31344673c5c854c~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAgMzYwX2dvX3BocA==:q75.awebp?rk3s=f64ab15b&x-expires=1762047139&x-signature=u%2Fxtqn9WYg2oTuwA54g7Uah%2FlnA%3D)![](<> "点击并拖拽以移动")​编辑

21. Dubbo指定特定的客户端方案​编辑

在Dubbo中,客户端可以根据具体的需求指定调用的服务提供者,常用的策略有以下几种:

  • 根据标签指定服务提供者

    • Dubbo支持基于标签的路由机制,可以通过@DubboReference注解指定调用某个特定的服务实现。比如,可以指定调用某个特定版本或特定分组的服务提供者。
      java @DubboReference(version = "1.0.0", group = "group1") private MyService myService;
  • 使用自定义的路由规则

    • Dubbo支持通过自定义路由规则来指定某些特定条件下的服务提供者。例如,可以根据请求的IP、用户的身份等条件来选择不同的服务提供者。
      xml <dubbo:consumer filter="myRouteFilter" />
  • 服务的负载均衡和路由

    • Dubbo还支持在客户端指定负载均衡策略(如随机、轮询、一致性哈希等)来选择服务提供者。

22. Dubbo的负载均衡都有哪些

Dubbo的负载均衡策略用于在多个服务提供者之间分配请求,常见的负载均衡策略有:

  1. 随机负载均衡(Random)
    • 请求随机选择一个服务提供者,适用于服务提供者相对平衡的场景。

​编辑2. 轮询负载均衡(Round Robin)

  • 请求按照顺序轮流分配给不同的服务提供者。每个请求被依次转发到不同的服务实例。
  1. 加权轮询负载均衡(Weight Round Robin)

    • 基于轮询策略,但每个服务提供者的权重不同,权重高的服务提供者会处理更多的请求。
  2. 一致性哈希负载均衡(Consistent Hash)

    • 根据请求的内容(例如用户ID)来决定分配到哪个服务提供者,确保同一请求始终路由到同一服务提供者,适用于有状态的应用。
  3. 最少活跃调用负载均衡(Least Active)

    • 将请求发送到当前处理请求最少的服务提供者,适用于服务负载不均的场景。
  4. 自定义负载均衡

    • 用户可以根据具体的业务需求,实现自定义的负载均衡策略。

23. 实现一下其中一个负载均衡

下面是基于Dubbo的**轮询负载均衡(Round Robin)**的简单实现:

  1. 定义负载均衡策略
    继承AbstractLoadBalance类并实现select()方法,该方法实现轮询策略:

```java

public class MyRoundRobinLoadBalance extends AbstractLoadBalance {

private AtomicInteger counter = new AtomicInteger(0);

@Override

protected Invoker doSelect(List> invokers, URL url, Invocation invocation) {

int index = counter.getAndIncrement() % invokers.size();

return invokers.get(index);

}

}

```

  1. 配置Dubbo使用自定义负载均衡策略

在Dubbo的XML配置文件中,指定负载均衡策略为自定义的轮询策略:

xml <dubbo:consumer loadbalance="com.example.MyRoundRobinLoadBalance"/>

这样,Dubbo就会使用自定义的轮询负载均衡策略来选择服务提供者。

结语

京东的面试问题不仅涉及基础的编程知识,还涵盖了分布式系统架构、微服务设计、消息队列等复杂的技术栈。理解SSO、Token与Redis的交互、Dubbo的负载均衡等概念对于面试通过至关重要。

相关推荐
程序员爱钓鱼1 小时前
Python 综合项目实战:学生成绩管理系统(命令行版)
后端·python·ipython
程序员爱钓鱼1 小时前
REST API 与前后端交互:让应用真正跑起来
后端·python·ipython
Dcs3 小时前
Java 中 UnaryOperator 接口与 Lambda 表达式的应用示例
java·后端
bagadesu5 小时前
使用Docker构建Node.js应用的详细指南
java·后端
lkbhua莱克瓦248 小时前
Java基础——方法
java·开发语言·笔记·github·学习方法
勇哥java实战分享8 小时前
第一次用 Ollama 跑视觉模型:Qwen2.5-VL 7B 给了我一个意外惊喜
后端
码事漫谈9 小时前
从后端开发者到Agent工程师:一份系统性的学习指南
后端
Croa-vo10 小时前
PayPal OA 全流程复盘|题型体验 + 成绩反馈 + 通关经验
数据结构·经验分享·算法·面试·职场和发展
码事漫谈10 小时前
后端开发如何将创新转化为专利?案例、流程与实操指南
后端
小坏讲微服务11 小时前
SpringCloud零基础学全栈,实战企业级项目完整使用
后端·spring·spring cloud