在微服務開發中,如何讓多個微服務之間的session共享,如:登錄的賬號或其他信息需要保存到session中,但是不使用全局session肯定其他的微服務不能調用
我們的目的:讓微服務A保存的sesion在微服務B中也能獲取
因爲我這裏集成了OpenFein,在服務A使用OpenFein調用服務B時發現無法獲取session,但是單獨去執行服務B方法時又可以獲取了,這是因爲在連接調用時出現的問題?
第一步:這裏以微服務A ,微服務B爲案例
兩個微服務的pom.xml類必須加入依賴
<!--加載 springboot redis包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- redis session全局共享 -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
第二步:兩個微服務的yml文件均連接redis
#springboot集成redis
redis:
host: localhost
port: 6379
第三步:兩個微服務的主啓動類均加上
@EnableRedisHttpSession//session共享
到這一步:單獨訪問兩個服務獲取session沒問題,但是一個調用一個再獲取就不行了
如何處理?
我們只需要寫一個類繼承RequestInterceptor 實現其中的方法,傳遞session信息即可
mport javax.servlet.http.HttpServletRequest;
import org.springframework.session.web.http.SessionRepositoryFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import feign.RequestInterceptor;
/**
* feign調用時傳遞session信息
* @date 2018/12/7 16:39
*/
@Component
public class FeignRequestIntercepter implements RequestInterceptor {
@Override
public void apply(feign.RequestTemplate requestTemplate) {
//通過RequestContextHolder獲取本地請求
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes == null) {
return;
}
//獲取本地線程綁定的請求對象
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
//給請求模板附加本地線程頭部信息,主要是cookie信息
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement().toString();
requestTemplate.header(name, request.getHeader(name));
}
if(!request.isRequestedSessionIdValid()){
request.setAttribute(SessionRepositoryFilter.INVALID_SESSION_ID_ATTR,null);
requestTemplate.header("cookie","SESSION="+request.getSession().getId());
}
}
}