公司項目整體結構遷移,從原有的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), 即可完成一個輕量級的滿足當前場景的微型網關服務,