在微服务中使用会话是错误的吗?
Is it wrong to use sessions in Microservices?
我看过了,session是违背RESTfulness的概念的。
Do sessions really violate RESTfulness?
RESTful Authentication
既然微服务不可避免地使用了REST
,那么这里是否也同样适用?如果是这样,那我们为什么要进行 Spring 会话?它甚至将 'Spring Session allows providing session ids in headers to work with RESTful
APIs' 列为其功能之一。
除了 Scaling 作为微服务的优势,它还为您提供了选择多语言架构的灵活性,即(使用正确的编程语言、框架、数据库来实现正确的工作)。
如果您使用 spring 会话(当然它提供跨节点的会话复制),它在内部使用 Redis/gemfire/hazelcast 作为复制的会话存储,但您必须坚持使用一种编程语言和所有服务的框架,即 Java & Spring resp.(你当然可以用其他语言编写自己的实现以从会话存储中读取,但它需要重新发明轮子)这将需要远离多语言架构的好处。
因此,通常在微服务架构中,您有一个令牌服务(并且它应该能够单独扩展)实现来生成令牌(又名 sessionIds),用于每个服务中的身份验证和授权,您应该尝试避免存储会话信息。它还有助于避免“单点故障”。
我看过了,session是违背RESTfulness的概念的。
Do sessions really violate RESTfulness?
RESTful Authentication
既然微服务不可避免地使用了REST
,那么这里是否也同样适用?如果是这样,那我们为什么要进行 Spring 会话?它甚至将 'Spring Session allows providing session ids in headers to work with RESTful
APIs' 列为其功能之一。
除了 Scaling 作为微服务的优势,它还为您提供了选择多语言架构的灵活性,即(使用正确的编程语言、框架、数据库来实现正确的工作)。
如果您使用 spring 会话(当然它提供跨节点的会话复制),它在内部使用 Redis/gemfire/hazelcast 作为复制的会话存储,但您必须坚持使用一种编程语言和所有服务的框架,即 Java & Spring resp.(你当然可以用其他语言编写自己的实现以从会话存储中读取,但它需要重新发明轮子)这将需要远离多语言架构的好处。
因此,通常在微服务架构中,您有一个令牌服务(并且它应该能够单独扩展)实现来生成令牌(又名 sessionIds),用于每个服务中的身份验证和授权,您应该尝试避免存储会话信息。它还有助于避免“单点故障”。