Spring cloud 如何在运行时更改假URL?

Spring cloud 如何在运行时更改假URL?,spring-cloud,spring-cloud-feign,Spring Cloud,Spring Cloud Feign,@FeignClient(name=“test”,url=”http://xxxx“” 如何更改假URL(URL=”http://xxxx)在运行时?因为URL只能在运行时确定。您可以手动创建客户端: @Import(FeignClientsConfiguration.class) class FooController { private FooClient fooClient; private FooClient adminClient; @Autowired

@FeignClient(name=“test”,url=”http://xxxx“”


如何更改假URL(URL=”http://xxxx)在运行时?因为URL只能在运行时确定。

您可以手动创建客户端:

@Import(FeignClientsConfiguration.class)
class FooController {

    private FooClient fooClient;

    private FooClient adminClient;

    @Autowired
    public FooController(ResponseEntityDecoder decoder, SpringEncoder encoder, Client client) {
        this.fooClient = Feign.builder().client(client)
            .encoder(encoder)
            .decoder(decoder)
            .requestInterceptor(new BasicAuthRequestInterceptor("user", "user"))
            .target(FooClient.class, "http://PROD-SVC");
        this.adminClient = Feign.builder().client(client)
            .encoder(encoder)
            .decoder(decoder)
            .requestInterceptor(new BasicAuthRequestInterceptor("admin", "admin"))
            .target(FooClient.class, "http://PROD-SVC");
     }
}

请参阅文档:

Feign可以在运行时提供动态URL和端点

必须遵循以下步骤:

  • faignclient
    界面中,我们必须删除URL参数。我们必须使用
    @RequestLine
    注释来提到REST方法(GET、PUT、POST等):

  • 您可以添加一个未注释的URI参数(可能在运行时确定),该参数将是用于请求的基本路径。例如:

    @FeignClient(name = "dummy-name", url = "https://this-is-a-placeholder.com")
    public interface MyClient {
        @PostMapping(path = "/create")
        UserDto createUser(URI baseUrl, @RequestBody UserDto userDto);
    }
    
    然后用法将是:

    @Autowired 
    private MyClient myClient;
    ...
    URI determinedBasePathUri = URI.create("https://my-determined-host.com");
    myClient.createUser(determinedBasePathUri, userDto);
    

    这将向
    https://my-determined-host.com/create
    ()。

    我不知道是否使用spring依赖于多个配置文件。 例如:like(dev、beta、prod等)

    如果您依赖于不同的yml或属性。您可以像这样定义
    FeignClient
    @FeignClient(url=“${feign.client.url.TestUrl}”,configuration=FeignConf.class)

    然后

    定义

    feign:
      client:
        url:
          TestUrl: http://dev:dev
    
    feign:
      client:
        url:
          TestUrl: http://beta:beta
    
    在您的应用程序中-dev.yml

    定义

    feign:
      client:
        url:
          TestUrl: http://dev:dev
    
    feign:
      client:
        url:
          TestUrl: http://beta:beta
    
    在您的应用程序中-beta.yml(我更喜欢yml)


    感谢上帝。享受吧。

    在界面中,您可以通过Spring注释更改url。基本URI在yml Spring配置中配置

       @FeignClient(
                name = "some.client",
                url = "${some.serviceUrl:}",
                configuration = FeignClientConfiguration.class
        )
    
    public interface SomeClient {
    
        @GetMapping("/metadata/search")
        String search(@RequestBody SearchCriteria criteria);
    
        @GetMapping("/files/{id}")
        StreamingResponseBody downloadFileById(@PathVariable("id") UUID id);
    
    }
    

    使用feign.Target.EmptyTarget

    @Bean
    public BotRemoteClient botRemoteClient(){
        return Feign.builder().target(Target.EmptyTarget.create(BotRemoteClient.class));
    }
    
    public interface BotRemoteClient {
    
        @RequestLine("POST /message")
        @Headers("Content-Type: application/json")
        BotMessageRs sendMessage(URI url, BotMessageRq message);
    }
    
    botRemoteClient.sendMessage(new URI("http://google.com"), rq)
    

    谢谢但是,我可以从properties/yaml文件中读取url,并注入
    @Value
    @ConfigurationProperties
    ?我不知道怎么做。这种方法改变了方法的特征,因此不是一个好的解决方案。有关使用Spring的更好解决方案,请参见下面@Forest10的答案。是否可以
    path
    (在您的示例中,它是
    /create
    )也可以是动态的?@lily是的。您应该使用
    @PathVarable
    。更多的信息你可以在你的答案周围加上一些上下文。另外,请清理代码,删除对百度的引用和非相关的注释代码。
                    package commxx;
    
                    import java.net.URI;
                    import java.net.URISyntaxException;
    
                    import feign.Client;
                    import feign.Feign;
                    import feign.RequestLine;
                    import feign.Retryer;
                    import feign.Target;
                    import feign.codec.Encoder;
                    import feign.codec.Encoder.Default;
                    import feign.codec.StringDecoder;
    
                    public class FeignTest {
    
                        public interface someItfs {
    
                     
                            @RequestLine("GET")
                            String getx(URI baseUri);
                        }
    
                        public static void main(String[] args) throws URISyntaxException {
                            String url = "http://www.baidu.com/s?wd=ddd";  //ok..
                            someItfs someItfs1 = Feign.builder()
                                    // .logger(new FeignInfoLogger()) // 自定义日志类,继承 feign.Logger
                                    // .logLevel(Logger.Level.BASIC)// 日志级别
                                    // Default(long period, long maxPeriod, int maxAttempts)
                                    .client(new Client.Default(null, null))// 默认 http
                                    .retryer(new Retryer.Default(5000, 5000, 1))// 5s超时,仅1次重试
                                //  .encoder(Encoder)
                                //  .decoder(new StringDecoder())
                                    .target(Target.EmptyTarget.create(someItfs.class));
    
                    //       String url = "http://localhost:9104/";
                    //         
                            System.out.println(someItfs1.getx(new URI(url)));
                        }
    
                    }