Spring-Cloud整合Spring-Session的注意點

markriver發表於2021-09-09

今天剛學習,但原文中還沒有更新關於如何整合Spring-Session。我就想動手試一試,結果遇到了不少問題,在這裡記錄下來,做一個分享。

專案的結構很簡單,就是zuul+feign+一個微服務的結構,然後想透過spring-session共享同一個session。透過後,成功的執行了專案,但是發現zuul,feign,微服務中三處列印出來的sessionId都不相同。透過瀏覽器除錯可以確定spring-session是其作用了。

圖片描述


如果是tomcat的session,cookie的name應該是JSESSIONID,這裡顯示SESSION說明spring-session是其作用了,而且也可以在redis中找到對應的記錄。那麼產生三處session都不同的原因應該就是zuul轉發給feign,feign呼叫微服務的時候都沒有把cookie傳過去。找到原因後,就有解決的思路了。

透過查詢發現,zuul預設是遮蔽Cookie的,要想使用Cookie,要在application.yml中配置sensitiveHeaders並把它設為空,這是一個遮蔽的黑名單,預設不為空,會遮蔽Cookie,例子如下:

zuul:
  routes:
    feign-a:
      path: /feign-a/**
      serviceId: fegin-service-a
      sensitiveHeaders:

透過這個配置zuul已經可以把cookie傳到feign中了,那麼feign要如何把cookie傳到微服務中呢?我們可以透過feign的RequestInterceptor介面來實現

@Configurationpublic class FeignConfig {    @Bean
    public RequestInterceptor requestInterceptor() {        return requestTemplate -> {
            String sessionId = RequestContextHolder.currentRequestAttributes().getSessionId();            if (!Strings.isNullOrEmpty(sessionId)) {
                requestTemplate.header("Cookie", "SESSION=" + sessionId);
            }
        };
    }
}

本以為這樣就完事大吉了,但是還是出錯了,報了找不到與執行緒繫結的request的異常。透過除錯初步判斷應該是feign整合了hystrix的鍋。這裡整了好久還是沒解決,最後還是在找到了解決辦法。透過更改hystrix的預設策略為SEMAPHORE可以解決。

hystrix:  command:
    default:
      execution:
        isolation:
          strategy: SEMAPHORE



作者:黃瓜精
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/818/viewspace-2820537/,如需轉載,請註明出處,否則將追究法律責任。

相關文章