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

at0kjp5o  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(39)

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


如果需要任何额外的信息,请告诉我。谢谢

kadbb459

kadbb4591#

如果你想使用restclient与应用程序名称,你必须使用服务发现(领事,Eureka btwEureka 是不推荐的)和注册所有应用程序调用对方。

相关问题