Spring 负载均衡器、RestTemplate 和微服务问题

Spring Load Balancer, RestTemplate, and Microservices issue

按照这个,我配置了

(1) 一个尤里卡服务器,

(2) 作为 (1) 的客户的收费服务,

(3) 从 (2) 中读取数据的通行费率仪表板。

一切顺利,直到我使用@LoadBalanced 进行了一些更改(也许这不完全是由于负载平衡器,但我将在下面 post 相关代码块)

在(2)中的bootstrap.properties中,常用端点名称为

spring.application.name = demo-tollrate-service

在(3)的DashboardController.java中,可以看到HTTP地址改成了上面的应用名

// import some libraries

@Controller
public class DashboardController {
    
    @Autowired
    private RestTemplate restTemplate;
    
    @LoadBalanced
    @Bean
        public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }
    
    @RequestMapping("/dashboard")
    public String GetTollRate(@RequestParam int stationId, Model m) {
        
        TollRate tr = restTemplate.getForObject("http://demo-tollrate-service/tollrate/" + stationId, TollRate.class);
        
        m.addAttribute("rate", tr.getCurrentRate());
        
        return "dashboard";
    }
    
}

这个pom.xml大致相同

当运行这个应用程序时,我得到以下错误。

***************************
APPLICATION FAILED TO START
***************************

Description:

The dependencies of some of the beans in the application context form a cycle:

┌──->──┐
|  dashboardController (field private org.springframework.web.client.RestTemplate com.example.demo.DashboardController.restTemplate)
└──<-──┘


Action:

Relying upon circular references is discouraged and they are prohibited by default. Update your application to remove the dependency cycle between beans. As a last resort, it may be possible to break the cycle automatically by setting spring.main.allow-circular-references to true.

有人可以帮我吗?谢谢。

Spring101: 你不能在控制器中定义beanclass。将 RestRemplate 定义移动到 @Configuration class 或您的应用程序主 class.

存在循环依赖,DashboardController依赖RestTemplate,但RestTemplate是在DashboardController内部定义的

Java版本没有任何区别,但可能是Spring版本。新的 Spring 版本默认不允许循环引用。您可以更改在 application.properties 文件中添加 属性 ,在这里您可以找到更多详细信息:

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.6-Release-Notes#circular-references-prohibited-by-default

但我建议重构,没有充分的理由在控制器中定义 RestTemplate,最好在 @Configuration 中定义 class。