# 《分布式IM系统》大后端平台-通用模型-第02节:用户Session与全局异常捕获机制

作者:冰河
星球:http://m6z.cn/6aeFbs (opens new window)
博客:https://binghe.gitcode.host (opens new window)
文章汇总:https://binghe.gitcode.host/md/all/all.html (opens new window)
源码获取地址:https://t.zsxq.com/0dhvFs5oR (opens new window)
课程视频:https://t.zsxq.com/15w8khYq7 (opens new window)

沉淀,成长,突破,帮助他人,成就自我。

  • 本节难度:★★☆☆☆
  • 本节重点:对分布式IM即时通讯系统大后端平台的用户Session、全局异常捕获机制和通用返回模型数据进行设计和实现,掌握用户Session机制、全局异常捕获机制和通用返回模型数据的设计技巧,并能够将其灵活应用到自身实际项目中。
  • 课程视频:https://t.zsxq.com/15w8khYq7 (opens new window)

大家好,我是冰河~~

大后端平台并不是一个单体的应用,在设计上,我们会将其整体分为:用户微服务、好友关系微服务、群组微服务、消息微服务。但是,在正式实现每个微服务时,除了要设计和实现通用的领域层对象模型外,还需要统一设计和实现各个微服务都需要支持的Session机制、全局异常捕获机制和通用的数据响应机制。

注意:本节的代码结构与上一节的代码结构有所不同,从本节开始,分布式IM即时通讯系统会被正式拆分成四个微服务。

# 一、前言

大后端平台是整个分布式IM即时通讯系统的核心服务之一,考虑到大后端平台是用户访问分布式IM即时通讯的直接入口。在某些场景下,会存在瞬时高并发大流量的现象。因此,我们不能将大后端平台设计成一个单体应用,以免后续出现整体上的性能瓶颈。

从业务角度划分,我们将分布式IM即时通讯系统的大后端平台整体分成::用户微服务、好友关系微服务、群组微服务、消息微服务。各个微服务之间存在独立的业务,但彼此之间也会存在某些关联的交互逻辑。同时,各个微服务都需要实现用户Session机制、全局异常捕获机制和通用数据响应机制。

# 二、本节诉求

对大后端平台下的各个微服务通用的Session机制、全局异常捕获机制和通用数据响应机制进行设计和实现,掌握通用的Session机制、全局异常捕获机制和通用数据响应机制的代码编写技巧,并能够将其灵活应用到自身实际项目中。

# 三、编码实现

本节的内容比较简单,我们可以直接编码来实现,为后续正式开发大后端平台的各个微服务做准备。

# 3.1 实现Session编码

对于大后端平台各个微服务的通用Session来说,在实现上也比较简单,具体实现步骤如下所示。

(1)实现UserSession类

UserSession类是用户Session中的具体数据类。

源码详见:io.binghe.im.platform.common.session.UserSession。

public class UserSession extends IMSessionInfo {
    private String userName;
    private String nickName;
    /***********省略其他代码***********/
}
1
2
3
4
5

可以看到,UserSession类实现了通用的Session信息类IMSessionInfo,并添加了用户名和用户昵称信息。

(2)实现SessionContext类

SessionContext类是Session的上下文类,当用户通过大后端平台登录分布式IM即时通讯系统时,大后端平台会生成一个附加了用户Session信息数据的JWT Token返回给用户,后续用户访问系统时,会在请求头中带上JWT Token,业务网关会拦截用户的请求,解析出JWT Token中的Session数据,放到request请求的属性中,在后续的请求链路中,可直接从request属性中获取到用户的Session数据。SessionContext类就是我们封装的直接从request属性中获取Session数据的类。

源码详见:io.binghe.im.platform.common.session.SessionContext。

public class SessionContext {

    public static UserSession getSession(){
        // 从请求上下文里获取Request对象
        ServletRequestAttributes requestAttributes = ServletRequestAttributes.class.
                cast(RequestContextHolder.getRequestAttributes());
        HttpServletRequest request = requestAttributes.getRequest();
        return  (UserSession) request.getAttribute(IMPlatformConstants.SESSION);
    }
}
1
2
3
4
5
6
7
8
9
10

# 查看完整文章

加入冰河技术 (opens new window)知识星球,解锁完整技术文章与完整代码