1.在order的pom中加三个依赖
feign,hystrix,actuator
1.1编辑配置类
#启用feignfeign: hystrix: enabled: true#裸露监控端点management: endpoints: web: exposure: include: hystrix.stream
1.2启动类加注解:@EnableFeignClients、@EnableCircuitBreaker
1.3为item和user增加申明式客户端接口和实现类
cn.tedu.sp04.feign.ItemClientcn.tedu.sp04.feign.UserClient
@FeignClient(name="item-service",fallback = ItemClientFB.class)public interface ItemClient { //依据orderId获取商品 @GetMapping("/{orderId}" ) JsonResult<List<Item>> getItems(@PathVariable String orderId); //缩小商品库存 @PostMapping("/decreaseNumber") JsonResult<?> decreaseNumber(@RequestBody List<Item> items);}
@FeignClient(name="user-service",fallback =UserClientFB.class )public interface UserClient { //获取用户,依据orderId?????不对,值依据userId /* @GetMapping("{orderId}") JsonResult<User> getUser(@PathVariable String orderId); //减少用户积分,依据orderId和积分 @PostMapping("{orderId}/score") JsonResult<?> addScore(@PathVariable String orderId,Integer score);*/ @GetMapping("/{userId}") JsonResult<User> getUser(@PathVariable Integer userId); @PostMapping("/{userId}/score") JsonResult<?> addScore(@PathVariable Integer userId,Integer score);}
@Componentpublic class ItemClientFB implements ItemClient{ @Override public JsonResult<List<Item>> getItems(String orderId) { //增加缓存数据 if(Math.random()>0.5){ ArrayList<Item> 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<Item> items) { return JsonResult.err("缩小商品库存失败"); }}
@Componentpublic class UserClientFB implements UserClient{ @Override public JsonResult<User> 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@Slf4jpublic class OrderServiceImpl implements OrderService { @Autowired private ItemClient itemClient; @Autowired private UserClient userClient; @Override public Order getOrder(String orderId) { log.info("获取订单: orderId="+orderId); //TODO: 近程调用商品服务,获取商品列表 JsonResult<List<Item>> items = itemClient.getItems(orderId); //TODO: 近程调用用户服务,获取用户数据 //userClient.getUser(userId);获取用户时,id写死 JsonResult<User> 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/123abchttp://localhost:8202/123abc* 保留订单http://localhost:8201/
[http://localhost:8202/
留神:商品可能能获取到,可能获取的是缓存的,也肯获取不到。显示null。