如何像 Spring Boot 方式一样为 Micronaut (1.1.4) HTTP 客户端配置 HTTP 代理?
Posted
技术标签:
【中文标题】如何像 Spring Boot 方式一样为 Micronaut (1.1.4) HTTP 客户端配置 HTTP 代理?【英文标题】:How can I configure the HTTP proxy for a Micronaut (1.1.4) HTTP client like the Spring Boot way? 【发布时间】:2019-12-03 14:55:43 【问题描述】:在与 Micronaut 进行了很多斗争以取消我们的代理之后,我想到了编写一个用于相同目的的 Spring Boot 应用程序。
对于 Spring Boot,HTTP 代理配置非常简单,并且有很多示例可用。我提出了这个例子:
application.properties
generic.proxyHost = my.corporateproxy.net
generic.proxyPort = 3128
MyController.java
@Value("$generic.proxyHost")
private String proxyHost;
@Value("$generic.proxyPort")
private Integer proxyPort;
@GetMapping("/proxy")
public HttpStatus getApiWithProxy()
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
InetSocketAddress address = new InetSocketAddress(proxyHost, proxyPort);
Proxy proxy = new Proxy(Proxy.Type.HTTP, address);
factory.setProxy(proxy);
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(factory);
ResponseEntity<String> response = restTemplate.getForEntity("https://any.api.returningstring.net/", String.class);
return response.getStatusCode();
这种方式确实有效,我尝试将此列表转换为 Micronaut 扩展,例如 HttpClientConfiguration。没有任何成功。
是否有任何解决方案可以设置代理并将其以编程方式传递给 Micronaut 中的 HttpClient?
P.S:这个 Spring Boot 应用程序在我们的企业云 (Kubernetes) 中作为 Docker 容器启动。 micronaut 必须更换它,但我们坚持如何设置代理。
【问题讨论】:
可能与***.com/questions/55813538/… 重复? 不一样。例如,这里是关于为生产环境动态设置代理的。 【参考方案1】:为所有客户端配置代理: https://docs.micronaut.io/latest/guide/configurationreference.html#io.micronaut.http.client.DefaultHttpClientConfiguration
为手动配置的客户端配置代理: https://docs.micronaut.io/latest/guide/configurationreference.html#io.micronaut.http.client.ServiceHttpClientConfiguration
对于任何其他客户端,您可以在注解中指定配置类(包含代理设置) https://docs.micronaut.io/latest/api/io/micronaut/http/client/annotation/Client.html#configuration--
【讨论】:
谢谢你的回答,但是有一些配置类的例子吗?因为我尝试过mrhaki.blogspot.com/2018/08/…,但在 k8s、云配置文件中它不起作用。 我无法让每个客户端配置的服务正常工作,但默认和自定义似乎工作正常。如果不同的服务需要不同的代理,请参阅下面的答案。当您的测试访问您的本地服务并且那些访问互联网时就是这种情况。他们都使用 DefaultHttpClientConfiguration 所以他们都可能不需要代理。【参考方案2】:@James,我花了几天时间尝试获取服务 Http 客户端配置,但无论我尝试什么,我都无法将其注入。我试图从micronaut aws lambda guide 获取增值税示例。该示例需要在我的公司环境中使用代理,因此我花了将近两天的时间,付出或接受,研究以使其工作。 我尝试了两种方法:
-
ServiceHttpClientConfiguration 失败
CustomHttpClientConfiguration 成功
ServiceHttpClientConfiguration
以下是我尝试过的一些事情:
resources/application.yml
...
micronaut:
http:
services:
vat:
proxy-address: some.proxy.corp.com:8000
proxy-type: http
example/micronaut/VatService.groovy
...
@Client("vat")
@Inject RxHttpClient client
我会使用调试器运行,但 client.configuration 类永远不会填充 ServiceHttpClientConfiguration。它总是填充有 DefaultHttpClientConfiguration
CustomHttpClientConfiguration
我最终选择了一个自定义配置类。它对我来说看起来像这样,并且适用于代理:
@Inject
@Client(value = "client-two", configuration = ClientTwoHttpConfiguration.class)
RxHttpClient client
@Singleton
static class ClientTwoHttpConfiguration extends HttpClientConfiguration
private final DefaultHttpClientConfiguration.DefaultConnectionPoolConfiguration connectionPoolConfiguration
@Inject
ClientTwoHttpConfiguration(ApplicationConfiguration applicationConfiguration, DefaultHttpClientConfiguration.DefaultConnectionPoolConfiguration connectionPoolConfiguration)
super(applicationConfiguration)
this.connectionPoolConfiguration = connectionPoolConfiguration
setProxyType(Proxy.Type.HTTP)
setProxyAddress(new InetSocketAddress("some.proxy.corp.com",8000))
@Override
HttpClientConfiguration.ConnectionPoolConfiguration getConnectionPoolConfiguration()
return this.connectionPoolConfiguration
我从micronaut tests 之一中获取了这个
【讨论】:
以上是关于如何像 Spring Boot 方式一样为 Micronaut (1.1.4) HTTP 客户端配置 HTTP 代理?的主要内容,如果未能解决你的问题,请参考以下文章