Java Spring Cloud Alibaba-Seata:(四)集成 Feign 测试 Seata

Spring Cloud Alibaba 技术栈 专栏收录该内容
47 篇文章 5 订阅

  • 在上面的章节中,我们使用的时 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 测试成功了
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 鲸 设计师:meimeiellie 返回首页

打赏

地球村公民

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值