微服务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,可获得如下结果:
测试二:Hystrix容错测试
1.在测试一的基础上,停止项目microservice-provider-user以及microservice-consumer-movie。
2.访问http:localhost:8040/aggregate/1,可获得如下结果:
说明fallback方法正常被触发,能够正常回退。
本文大部分内容转载自周立的《Spring Cloud与Docker微服务架构实战》