春季会话延迟反序列化



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

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

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

为了解决这个问题,我想,如果只对从服务访问的属性进行反序列化,我可能会避免出现异常,一切都会正常工作。

你知道春季会议是否有可能做到这一点,或者可以提出另一个解决方案,让我解决最初的问题吗?

下面是一个重现我的问题的示例项目:https://github.com/deathcoder/hazelcast-shared-session

我相信我得到了发生的事情:Spring Session Hazelcast默认在本地存储会话更新,直到请求完成&请求完成后,在返回响应之前,使用EntryProcessor将所有内容发送到集群。EntryProcessor需要存储该会话记录的成员上可用的对象类,由于数据是分布式的,因此其他成员可能存储在另一个实例中创建的会话。根据你所说的,不是所有的节点都是相同的,也不是包含所有的类&这会导致序列化异常。

您可以使用User Code Deployment功能将这些缺失的类部署到其他成员:https://docs.hazelcast.org/docs/3.11/manual/html-single/index.html#member-用户代码部署测试版

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

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

我首先会尽量避免API层中的会话。它们的规模很小。同步会话的可扩展性甚至更低。

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

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

最新更新