京东面试题解析: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的负载均衡等概念对于面试通过至关重要。

相关推荐
牛奔2 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
想用offer打牌7 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
passerby60618 小时前
完成前端时间处理的另一块版图
前端·github·web components
KYGALYX8 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了8 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法9 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
Moment9 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
草梅友仁9 小时前
墨梅博客 1.4.0 发布与开源动态 | 2026 年第 6 周草梅周报
开源·github·ai编程
Cobyte10 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc