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 文件中添加 属性 ,在这里您可以找到更多详细信息:
但我建议重构,没有充分的理由在控制器中定义 RestTemplate,最好在 @Configuration 中定义 class。
按照这个
(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 文件中添加 属性 ,在这里您可以找到更多详细信息:
但我建议重构,没有充分的理由在控制器中定义 RestTemplate,最好在 @Configuration 中定义 class。