在微服务中,使用RestClient如何使用应用程序名称动态调用url?

问题描述 投票:0回答:1

我正在开发一个 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);

尝试的解决方案:

  1. @LoadBalanced 注解与 RestClient:
@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 依赖项,但出现“无法解析符号‘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;
    }

如果需要任何其他信息,请告诉我。谢谢你

java spring-boot java-8 microservices
1个回答
0
投票

您想要两个休息客户吗? 或者你想通过动态 url 来动态休息客户端? 让我把你的问题说清楚..

© www.soinside.com 2019 - 2024. All rights reserved.