我试图从IntelliJ中运行我的Spring Boot应用程序(APP1),并使用另一个Spring Boot应用程序(APP2)中的服务作为Docker Machine VM中的容器运行(就像我在Windows上一样) )。本地运行的应用程序通过Consul发现容器化应用程序,因为这两个应用程序都通过Spring Cloud Consul与它集成。
不幸的是,为容器化应用程序提供给本地应用程序的IP地址是容器与VM的私有IP。因此,本地应用无法连接到它。例如
APP1 -> Docker Machine -> APP2
10.13.1.84 192.168.99.100 172.28.0.5
到目前为止,唯一的方法是创建一个方面来拦截框架返回的服务器地址:
@Profile("development")
@Component
@Aspect
@Slf4j
public class DockerMachineConsulServerListAdvice {
@Around("execution(* org.springframework.cloud.netflix.feign.ribbon.CachingSpringLoadBalancerFactory.create(..))")
public Object updateHost(ProceedingJoinPoint pjp) throws Throwable {
Object retVal = pjp.proceed();
if (retVal instanceof FeignLoadBalancer) {
FeignLoadBalancer lb = (FeignLoadBalancer) retVal;
List<Server> servers = lb.getLoadBalancer().getServerList(false).stream()
.map(server -> new Server("192.168.99.100", server.getPort())).collect(Collectors.toList());
DynamicServerListLoadBalancer dslb = (DynamicServerListLoadBalancer) lb.getLoadBalancer();
dslb.setServersList(servers);
}
return retVal;
}
}
我试图通过覆盖各种bean来解决如何配置Spring Cloud框架但是失败了(因为使用方面非常讨厌)。任何想法如何以更好的方式做到这一点?
由于
尼克