Spring 会话惰性反序列化

Spring session lazy deserialization

我有以下情况,我有一个带有 api 网关和多个下游服务的微服务架构,其中一些有一个独立的会话,这导致我的系统在随机服务调用时抛出过期会话异常.

由于我们无法从头开始重写这些服务,因此我们首先引入了 hazelcast,以便所有服务可以共享同一个会话。

现在的问题是,当一个服务写入一个 class 的对象时,其他服务的 class 路径中没有该对象,则会引发反序列化异常。

为了解决这个问题,我在想如果只有从服务访问的属性被反序列化,我可能可以避免异常,一切都应该正常工作。

您是否知道 spring 会话是否完全可行,或者可以建议另一种解决方案来解决最初的问题?

这里有一个重现我的问题的示例项目:https://github.com/deathcoder/hazelcast-shared-session

我相信我知道发生了什么:Spring-Session-Hazelcast 默认情况下在本地存储会话更新,直到请求完成,当请求完成时,在返回响应之前,使用 [=10= 将所有内容发送到集群]. EntryProcessor 要求对象 类 在存储该会话记录的成员上可用,并且由于数据是分布式的,其他成员可能存储在另一个实例中创建的会话。根据您的说法,并非所有节点都相同,不包含所有 类 & 这会导致序列化异常。

你可以做什么,你可以使用 User Code Deployment 功能将缺少的 类 部署到其他成员:https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#member-user-code-deployment-beta

如果您正在更改存储在会话中的对象,您可以将 class-cache-mode 设置为 OFF 以防止不缓存它们而是在每次操作时发送它们。

如果这能解决您的问题,请尝试告诉我。

我会首先尝试避免 API 层中的会话。它们的扩展性很差。同步会话的可扩展性更差。

尝试使用访问令牌,例如JWT token。令牌应包含足够的用户身份信息以加载处理交易所需的资源(可以缓存资源)。

至于会话中的其他状态——从流程的角度来看,微服务是自包含的,因此所有中间结果都应该持久化到数据库中。但是我当然不知道你具体应用的细节,所以这只是一个大概的想法。