SpringCloud Feign context-path踩到的坑

最近在使用SpringCloud的context-path时,遇到了一些坑,记录一下。

server.context-path(上下文)

服务提供者的application配置文件中有一个属性叫server.context-path,是上下文。
如下示:

server.context-path=/dev

如果没有上下文,我们访问一个接口的路径可能是:
localhost:8080/user/
如果有上下文dev,那么这个url必须写成:
localhost:8080/dev/user/
也就是说:
服务消费者对服务提供者的方法进行访问时,url也要加上context-path上下文。

服务消费者Feign

我这边项目使用的是Feign进行服务消费,将context-path加在了方法的value里面。
如下:

@FeignClient(value="user",fallback=UserMsgHystrix.class)
public interface UserMsgService {

   /**
     * 推送消息
     * 注意:此处的dev 是服务提供者的上下文
     */
    @RequestMapping(value = "/dev/sentMsg", method = RequestMethod.POST)
    public JSONObject sentMsgToWeChat(JSONObject invoiceJson) ;
}

多个环境的context-path

如果只有一个本地环境,那么采用上面的做法就解决了。
但是在实际开发中,往往有多个环境。比如本地环境,开发环境,测试环境,正式环境。
而不同的环境又有不同的上下文,比如开发环境上下文设为/dev,测试环境上下文设为/test。
不同环境的上下文,可以使用@FeignClient的path属性,读取properties文件的值。
查看@FeignClient的源码,可以看到path的注释:

    /**
     * Path prefix to be used by all method-level mappings. Can be used with or without
     */
    String path() default "";

意思就是:path可以给方法的url添加前缀

在服务消费者的开发环境properties文件中,加入:

providerContext=dev

在服务消费者的测试环境properties文件中,加入:

providerContext=test

在服务消费者的正式环境properties文件中,加入:

providerContext=/

Feign服务消费的代码如下示:

@FeignClient(value="user",fallback=UserMsgHystrix.class)
public interface UserMsgService {
    @RequestMapping(value = "sentMsg",path="${providerContext}", method = RequestMethod.POST)
    public JSONObject sentMsgToWeChat(JSONObject invoiceJson) ;
}

猜你喜欢

转载自www.cnblogs.com/expiator/p/10581969.html