微服务springcloud—使用Zuul聚合微服务

使用Zuul聚合微服务

1.复制项目microservice-gateway-zuul。将ArtifactId修改为microservice-gateway-zuul-aggregation。
2.修改启动类ZuulApplication:

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {
    public static void main(String[] args) {
        SpringApplication.run(ZuulApplication.class, args);
    }

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

3.创建实体类

public class User {
    private Long id;
    private String username;
    private String name;
    private Integer age;
    private BigDecimal balance;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public BigDecimal getBalance() {
        return balance;
    }

    public void setBalance(BigDecimal balance) {
        this.balance = balance;
    }
}

4.创建java类,名为AggregationService:

@Service
public class AggregationService {
    @Autowired
    private RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "fallback")
    public Observable<User> getUserById(Long id) {
        //创建一个被观察者
        return Observable.create(observer -> {
           //创建用户为服务的/{id}端点
           User user = restTemplate.getForObject("http://users/{id}", User.class, id);
           observer.onNext(user);
           observer.onCompleted();
        });
    }

   @HystrixCommand(fallbackMethod = "fallback")
   public Observable<User> getMovieUserByUserId (Long id){
        return Observable.create(observer -> {
           //请求电影微服务的/user/{id}端点
           User movieUser = restTemplate.getForObject("Http://movie/user/{id}",User.class, id);
           observer.onNext(movieUser);
           observer.onCompleted();
        });
   }

   public User fallback(Long id){
        User user = new User();
        user.setId(-1L);
        return user;
   }
}

5.创建Controller,在Controller中聚合多个请求

@RestController
public class AggregationController {
    public static final Logger LOGGER = LoggerFactory.getLogger(ZuulApplication.class);

    @Autowired
    private AggregationService aggregationService;

    @GetMapping("/aggregate/{id}")
    public DeferredResult<HashMap<String, User>> aggregate(@PathVariable Long id){
        Observable<HashMap<String, User>> result = this.aggregateObservable(id);
        return this.toDeferredResult(result);
    }

    public Observable<HashMap<String, User>> aggregateObservable(Long id){
        //合并两个或者多个Observables发射出数据项,根据指定的函数变换他们
        return Observable.zip(
          this.aggregationService.getUserById(id),
          this.aggregationService.getMovieUserByUserId(id),
          (user, movieUser) -> {
              HashMap<String,User> map = Maps.newHashMap();
              map.put("user", user);
              map.put("movieUser", movieUser);
              return map;
          }
        );
    }
    public DeferredResult<HashMap<String,User>> toDeferredResult(Observable<HashMap<String,User>>details){
        DeferredResult<HashMap<String,User>> result = new DeferredResult<>();
        //订阅
        details.subscribe(new Observer<HashMap<String,User>>() {
            //@Override
            public void onCompleted(){
                LOGGER.info("完成");
            }

            //@Override
            public void onError(Throwable throwable){
                LOGGER.info("发生错误...", throwable);
            }

            //@Override
            public void onNext(HashMap<String,User>movieDetails){
                result.setResult(movieDetails);
            }
        });
        return result;
    }
}

测试一:微服务聚合测试

启动项目microservice-discovery-eureka。
启动项目microservice-provider-user。
启动项目microservice-consumer-movie。
启动项目microservice-gateway-zuul-aggregation。
访问http://localhost:8040/aggregate/1,可获得如下结果:
微服务springcloud—使用Zuul聚合微服务

测试二:Hystrix容错测试

1.在测试一的基础上,停止项目microservice-provider-user以及microservice-consumer-movie。
2.访问http:localhost:8040/aggregate/1,可获得如下结果:
微服务springcloud—使用Zuul聚合微服务
说明fallback方法正常被触发,能够正常回退。

本文大部分内容转载自周立的《Spring Cloud与Docker微服务架构实战》