我正在开发一个 UserService 应用程序,该应用程序使用 Spring Boot 从评级和酒店服务中获取数据。我想用应用程序名称替换硬编码的 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);
尝试的解决方案:
@Configuration
public class MyConfig {
@Bean
@LoadBalanced
public RestClient restClient() {
return RestClient.builder()
.build();
}
}
这不起作用。
@Bean
public WebClient.Builder loadBalancedWebClientBuilder() {
return WebClient.builder().filter(loadBalancerExchangeFilterFunction());
}
我添加了 spring-cloud-starter-loadbalancer 依赖项,但出现“无法解析符号‘WebClient’”错误。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>4.0.4</version>
</dependency>
Spring 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());
}
}
获取用户方法
@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;
}
如果需要任何其他信息,请告诉我。谢谢你
您想要两个休息客户吗? 或者你想通过动态 url 来动态休息客户端? 让我把你的问题说清楚..