• 在上面的章节中,我们使用的时 Ribbon + RestTemplate 的形式做的远程调用。下面我们来演示 Feign 的调用方式

1.改造 business-service

1.1 添加依赖

修改 business-service 项目里面的 pom.xml 文件,在里面添加依赖

<dependencies> 
	<dependency> 
		<groupId>org.springframework.cloud</groupId> 
		<artifactId>spring-cloud-starter-openfeign</artifactId>
	</dependency> 
</dependencies>

1.2 添加 OrderServiceFeign

 

里面的代码如下:

@FeignClient("order-service") 
public interface OrderServiceFeign {
   
      
	@GetMapping("/create/{userId}/{commodityCode}/{orderCount}") 
	ResponseEntity<Void> create( @PathVariable("userId") String userId, @PathVariable("commodityCode") String commodityCode, @PathVariable("orderCount") Integer orderCount); 
}

1.3 添加 StorageServiceFeign

 

@FeignClient("storage-service")
public interface StorageServiceFeign {
   
      
	@GetMapping("/deduct/{commodityCode}/{orderCount}") 
	ResponseEntity<Void> deduct( @PathVariable("commodityCode") String commodityCode, @PathVariable("orderCount") Integer orderCount ) ; 
}

1.5 改造 OrderService

 

@Service 
public class OrderService {
   
     
	
	private static Logger logger = LoggerFactory.getLogger(StorageService.class) ;

	//1.采用 Ribbon 的形式
	@Autowired 
	private RestTemplate restTemplate ;

	@Autowired 
	private OrderServiceFeign orderServiceFeign ;

	//2.采用 Feign 的形式
	public void create(String userId, String commodityCode, int orderCount){
   
     
		ResponseEntity<Void> entity = orderServiceFeign.create(userId, commodityCode, orderCount);
		if (entity.getStatusCode()== HttpStatus.OK){
   
     
			logger.info("订单创建成功,用户为{} ,商品编号为{},本次扣减的数量为{}",userId , commodityCode,orderCount);
			return;
		}
		throw new RuntimeException("订单创建失败") ;
	}
}

1.6 在启动类里面开启对 Feign 的支持

 

1.7 改造 StorageService

 

代码如下:

@Service 
public class StorageService {
   
     

	private static Logger logger = LoggerFactory.getLogger(StorageService.class);
	
	//1.采用 Ribbon 的形式
	@Autowired 
	private RestTemplate restTemplate;

	@Autowired 
	private StorageServiceFeign storageServiceFeign;

	//2.采用 Feign 的形式
	public void deduct(String commodityCode, int orderCount) {
   
     
		ResponseEntity<Void> entity = storageServiceFeign.deduct(commodityCode, orderCount);
		if (entity.getStatusCode() == HttpStatus.OK) {
   
     
			logger.info("扣减库存成功,商品编号为{},本次扣减的数量为{}", commodityCode, orderCount);
			return;
		}
		throw new RuntimeException("扣减库存失败");
	}
}

2.改造 order-service

2.1 添加依赖

在 dependencies 添加:

<dependency> 
	<groupId>org.springframework.cloud</groupId> 
	<artifactId>spring-cloud-starter-openfeign</artifactId> 
</dependency>

2.2 添加接口

 

里面的代码如下:

@FeignClient("account-service") 
public interface AccountServiceFeign {
   
      
	@GetMapping("/debit/{userId}/{orderMoney}") 
	ResponseEntity<Void> debit( @PathVariable("userId") String userId, @PathVariable("orderMoney") Integer orderMoney ) ; 
}

2.3 修改 AccoutService

 

//实现对账号服务的远程调用
@Service 
public class AccountService {
   
     
	
	private static Logger logger = LoggerFactory.getLogger(AccountService.class) ;

	//1.ribbon 的方式
	@Autowired 
	private RestTemplate restTemplate ;

	@Autowired 
	private AccountServiceFeign accountServiceFeign ;

	//2.feign 的方式
	public void debit(String userId, int orderMoney) {
   
     
		ResponseEntity<Void> entity = accountServiceFeign.debit(userId, orderMoney);
		if(entity.getStatusCode()== HttpStatus.OK){
   
     
			logger.info("扣减用户{}金额成功,本次扣减的数目为{}",userId,orderMoney);
			return ;
		}
		logger.info("扣减用户{}金额失败",userId);
		throw new RuntimeException("扣减金额失败") ;
	}
}

2.4 在启动类里面添加对 Feign 的支持

 

3.重启测试

  • 重启 order-service ,business-service
  • 还原数据库数据,开始测试。
  • 正常下单测试:

 

使用 DQCGM_USER_2 下单:

 

  • 出错了,但是数据库的各个表都正常。
  • Seata 测试成功了