spring mvc 不定路徑 請求映射

公司項目整體結構遷移,從原有的spring + zk + thrift 轉移到 spring-cloud, 搭建了spring-cloud 全家桶,新的微服務模塊寫的後臺接口,接入到原有域名,遇到了手動轉發的問題.

 

原有的管理後臺, 稱之爲 admin-api, 是一個spring mvc工程, 向前端提供http接口,後端與原有的各個thrift項目鏈接, 起到轉換http請求的作用. 新建立的spring-cloud項目, 通過zuul 提供統一的訪問域名,但是和原有域名不同,存在權限控制及安全性問題.

 

最原始的方案, 在admin-api中提供controller, 對應相同的spring-cloud 工程接口,問題可以解決,但是重複的工作量很是乏味, 由於spring-cloud暴露的接口形式較爲固定(get請求或者 post json請求), 故決定進行封裝(重複的邏輯, 就是代碼應該自動實現的地方).

方案一:

添加controller, 確定起始路徑, 並設定路徑變量, 然後按照路徑變量中的serviceName及路徑調用zuul進行轉發. 但是不確定會有多少級的路徑變量, 存在後續不斷更新的工作, 放棄

 

方案二:

添加controller, 路徑確定, 同時添加interceptor, 攔截指定規則的請求,獲取路徑變量並存儲到attributes中, 代起轉發到指定controller中, 則獲取路徑變量進行轉發.

結果:  在 搭建的spring-boot中實驗成功, 順利進行轉發, 但是在原有的項目中, 遇到了 DispatcherServlet 攔截的問題, 後查看spring mvc發現 , 所有請求會經過該servlet, 確認存在路徑映射後, 纔會下放到HandlerInterceptorAdapter 類中,所以在實際項目中, 我的攔截器在產生真正的效用前, 請求已經被返回, 其餘改動耗費較多,暫時擱置.

 

方案三:

在即將重試方案一的時候,偶然發現了spring mvc 對不定路徑的另外一種支持, 請求格式如下:

    @RequestMapping(value = "/myGateway/{serviceName}/**")
    public String moduleStrings(@PathVariable String serviceName, HttpServletRequest request) throws Exception {

在上述情形下, 該controller 會攔截以myGateway開頭, 且至少含有serviceName的URI的請求, 然後我再request中獲取到路徑變量, 解析請求攜帶的parameters 以及body中的參數, 解析請求方式( GET POST), 即可完成一個輕量級的滿足當前場景的微型網關服務,

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章