最近在使用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) ; }