我正在开发一个UserService应用程序,它使用Sping Boot 从Rating和Hotel服务中获取数据。我想用应用程序名称替换硬编码的URL以进行动态服务发现。当前方法(使用硬编码的URL):
List<Rating> ratingsOfUser = client.get().uri("http://localhost:8083/ratings/user/" + user.getUserId())
.retrieve()
.body(typeRef);
字符串
所需方法(带应用程序名称):
List<Rating> ratingsOfUser = client.get().uri("http://RATING-SERVICE/ratings/user/" + user.getUserId())
.retrieve()
.body(typeRef);
型
尝试的解决方案:
1.使用RestClient的@LoadBalanced注解:
@Configuration
public class MyConfig {
@Bean
@LoadBalanced
public RestClient restClient() {
return RestClient.builder()
.build();
}
}
型
这不管用
1.带有负载平衡的WebClient:
@Bean
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder().filter(loadBalancerExchangeFilterFunction());
}
型
我添加了spring-cloud-starter-loadbalancer依赖项,但我得到了一个“Cannot resolve symbol 'WebClient'”错误。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>4.0.4</version>
</dependency>
型
Sping Boot 版本= 3.2.1
MyConfig.class
@Configuration
public class MyConfig {
@Bean
@LoadBalanced
public RestClient restClient(){
return RestClient.builder()
.build();
}
@Bean
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder().filter(loadBalancerExchangeFilterFunction());
}
}
型
getUser方法
@Override
public User getUser(String userId) {
//get user from the db with the help of user Repo
User user = userRepository.findById(userId)
.orElseThrow(() -> new ResourceNotFoundException("User not found: " + userId));
// fetch Rating of the above user from Rating Service
ParameterizedTypeReference<List<Rating>> typeRef = new ParameterizedTypeReference<List<Rating>>() {};
// List<Rating> ratingsOfUser = client.get().uri("http://RATING-SERVICE/ratings/user/" +user.getUserId())
List<Rating> ratingsOfUser = client.get().uri("http://localhost:8083/ratings/user/" +user.getUserId())
.retrieve()
.body(typeRef);
// for each rating fetch Hotel
List<Rating> ratingList = ratingsOfUser.stream().map(rating -> {
//api call to get hotel service
//Hotel hotels = client.get().uri("http://HOTEL-SERVICE/hotels/"+rating.getHotelId())
Hotel hotels = client.get().uri("http://localhost:8081/hotels/"+rating.getHotelId())
.retrieve()
.body(new ParameterizedTypeReference<Hotel>() {});
//set the hotel to the rating
rating.setHotel(hotels);
// return the rating
return rating;
}).collect(Collectors.toList());
user.setRatings(ratingList);
logger.info("{} ",ratingsOfUser);
return user;
}
型
如果需要任何额外的信息,请告诉我。谢谢
1条答案
按热度按时间kadbb4591#
如果你想使用restclient与应用程序名称,你必须使用服务发现(领事,Eureka btwEureka 是不推荐的)和注册所有应用程序调用对方。