如何像 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 代理?的主要内容,如果未能解决你的问题,请参考以下文章

如何将布局方言添加到spring-boot thymeleaf自动配置文件

Spring boot-应用打包部署

Spring boot-应用打包部署

spring-boot如何使用两个DataSource

Spring Boot 部署与服务配置

十Spring Boot 部署与服务配置