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)));
}
}