1.在order的pom中加三个依赖
feign,hystrix,actuator
1.1编辑配置类
#启用feign
feign:
hystrix:
enabled: true
#暴露监控端点
management:
endpoints:
web:
exposure:
include: hystrix.stream
1.2启动类加注解:@EnableFeignClients、@EnableCircuitBreaker
1.3为item和user添加声明式客户端接口和实现类
cn.tedu.sp04.feign.ItemClient
cn.tedu.sp04.feign.UserClient
@FeignClient(name="item-service",fallback = ItemClientFB.class)
public interface ItemClient {
//根据orderId获取商品
@GetMapping("/{orderId}" )
JsonResult> getItems(@PathVariable String orderId);
//减少商品库存
@PostMapping("/decreaseNumber")
JsonResult> decreaseNumber(@RequestBody List- items);
}
@FeignClient(name="user-service",fallback =UserClientFB.class )
public interface UserClient {
//获取用户,根据orderId?????不对,值根据userId
/* @GetMapping("{orderId}")
JsonResult getUser(@PathVariable String orderId); //增加用户积分,根据orderId和积分
@PostMapping("{orderId}/score") JsonResult> addScore(@PathVariable String orderId,Integer score);*/ @GetMapping("/{userId}")
JsonResult getUser(@PathVariable Integer userId);
@PostMapping("/{userId}/score")
JsonResult> addScore(@PathVariable Integer userId,Integer score);
}
@Component
public class ItemClientFB implements ItemClient{
@Override
public JsonResult> getItems(String orderId) {
//添加缓存数据
if(Math.random()>0.5){
ArrayList- list = new ArrayList<>();
list.add(new Item(1,"缓存商品1",1));
list.add(new Item(2,"缓存商品2",2));
list.add(new Item(3,"缓存商品3",3));
return JsonResult.ok().data(list);
}
return JsonResult.err("获取商品失败");
}
@Override
public JsonResult> decreaseNumber(List
- items) {
return JsonResult.err("减少商品库存失败");
}
}
@Component
public class UserClientFB implements UserClient{
@Override
public JsonResult getUser(Integer userId) {
//缓存数据
if(Math.random()>0.5){
User user = new User(1,"缓存用户","缓存密码");
return JsonResult.ok().data(user);
}
return JsonResult.err("获取用户失败");
}
@Override
public JsonResult> addScore(Integer userId, Integer score) {
return JsonResult.err("增加用户积分失败");
}
}
1.4 编辑OrderServiceImpl
@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
@Autowired
private ItemClient itemClient;
@Autowired
private UserClient userClient;
@Override
public Order getOrder(String orderId) {
log.info("获取订单: orderId="+orderId);
//TODO: 远程调用商品服务,获取商品列表
JsonResult> items = itemClient.getItems(orderId);
//TODO: 远程调用用户服务,获取用户数据
//userClient.getUser(userId);获取用户时,id写死
JsonResult user = userClient.getUser(99);
// 写死订单数据
Order order = new Order();
order.setId(orderId);
order.setUser(user.getData());
order.setItems(items.getData());
return order;
}
@Override
public void saveOrder(Order order) {
log.info("保存订单: "+order);
//TODO: 远程调用商品服务,减少商品库存
itemClient.decreaseNumber(order.getItems());
//TODO: 远程调用用户服务,增加用户积分
userClient.addScore(order.getUser().getId(),100);
}
}
1.5order-service 配置启动参数,启动两台服务器
1.6启动服服,进行测试
* 根据orderid,获取订单
http://localhost:8201/123abc
http://localhost:8202/123abc
* 保存订单
http://localhost:8201/
[http://localhost:8202/
注意:商品可能能获取到,可能获取的是缓存的,也肯获取不到。显示null。