最近在使用SpringCloud的context-path時,遇到了一些坑,記錄一下。app
服務提供者的application配置文件中有一個屬性叫server.context-path,是上下文。
以下示:ide
server.context-path=/dev
若是沒有上下文,咱們訪問一個接口的路徑多是:
localhost:8080/user/
若是有上下文dev,那麼這個url必須寫成:
localhost:8080/dev/user/
也就是說:
服務消費者對服務提供者的方法進行訪問時,url也要加上context-path上下文。測試
我這邊項目使用的是Feign進行服務消費,將context-path加在了方法的value裏面。
以下:url
@FeignClient(value="user",fallback=UserMsgHystrix.class) public interface UserMsgService { /** * 推送消息 * 注意:此處的dev 是服務提供者的上下文 */ @RequestMapping(value = "/dev/sentMsg", method = RequestMethod.POST) public JSONObject sentMsgToWeChat(JSONObject invoiceJson) ; }
若是隻有一個本地環境,那麼採用上面的作法就解決了。
可是在實際開發中,每每有多個環境。好比本地環境,開發環境,測試環境,正式環境。
而不一樣的環境又有不一樣的上下文,好比開發環境上下文設爲/dev,測試環境上下文設爲/test。
不一樣環境的上下文,能夠使用@FeignClient的path屬性,讀取properties文件的值。
查看@FeignClient的源碼,能夠看到path的註釋:code
/** * Path prefix to be used by all method-level mappings. Can be used with or without */ String path() default "";
意思就是:path能夠給方法的url添加前綴server
在服務消費者的開發環境properties文件中,加入:接口
providerContext=dev
在服務消費者的測試環境properties文件中,加入:開發
providerContext=test
在服務消費者的正式環境properties文件中,加入:源碼
providerContext=/
Feign服務消費的代碼以下示:it
@FeignClient(value="user",fallback=UserMsgHystrix.class) public interface UserMsgService { @RequestMapping(value = "sentMsg",path="${providerContext}", method = RequestMethod.POST) public JSONObject sentMsgToWeChat(JSONObject invoiceJson) ; }