0

在微服务系统中,我有一个带有 annotation 的接口 @AuthorizedFeignClient(name="send-email", url="http://localhost:8080/utils/api/email"),在开发环境中它可以正常工作,但是,在 Docker 环境中,我需要url参数来让 Docker 容器名称代替 localhost 才能在 Docker 环境中工作。

我尝试在 application-prod.yml 中添加配置:

containers-host:
    gateway: jhipster-gateway

在注释中我这样说:

     @AuthorizedFeignClient(name="send-email", url="http://${containers-host.gateway}:8080/utils/api/email")

但是,当尝试生成 .war 时,它会失败:

org.springframework.beans.factory.BeanDefinitionStoreException:在 null 中定义的名称为“com.sistema.service.util.EmailClient”的无效 bean 定义:无法解析值“http://${ 中的占位符“containers-host.gateway”容器-host.gateway}:8080/utils/api/email"; 嵌套异常是 java.lang.IllegalArgumentException:无法解析值“http://${containers-host.gateway}:8080/utils/api/email”中的占位符“containers-host.gateway”2018-11-08 11 :25:22.101 错误 64 --- [main] osboot.SpringApplication: 应用程序运行失败

org.springframework.beans.factory.BeanDefinitionStoreException:在 null 中定义的名称为 'com.sistema.service.util.EmailClient' 的无效 bean 定义:无法解析值“http://${ 中的占位符'containers-host.gateway'容器-host.gateway}:8080/utils/api/email"; 嵌套异常是 java.lang.IllegalArgumentException:无法解析值“http://${containers-host.gateway}:8080/utils/api/email”中的占位符“containers-host.gateway”

如何根据服务运行的环境配置来设置服务的主机名?

我失败的代码如下所示:

@AuthorizedFeignClient(name="send-email", url="http://${containers-host.gateway}:8080/utils/api/email")
public interface EmailClient {

    @PostMapping("/send-email")
    void sendEmail(String mail);
}
4

1 回答 1

1

要设置在 application-dev.yml 或 application-prod.yml 中输入的值,必须使用 @ConfigurationProperties 注释创建配置类。

在 .yml 文件中:

microservices:
    gateway: http://environment-host:8080

以这种方式创建配置文件:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;


@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "microservices", ignoreUnknownFields = false)
public class MicroservicesConectionProperties {

    private String gateway = "";

    public String getGateway() {
        return gateway;
    }

    public void setGateway(String gateway) {
        this.gateway = gateway;
    } 
}

并使@AuthorizedFeignClient 像这样:

@AuthorizedFeignClient(name="send-email", url="${microservices.gateway}/utils/api/email")
于 2018-11-14T19:27:03.733 回答