远程调用其他服务
- 1.引入open-feign
- 2.编写接口 告诉SpringCloud这个接口需要调用远程服务(远程接口)
- 3.接口内声明的每个方法都是调用哪个远程服务的哪个请求
- 4.开启远程调用的功能 @EnableFeignClients 基础包扫描 Feign包
- 5.在Service种注入Feign接口对象
@FeignClient标签的常用属性如下:
value: 服务名
name:指定FeignClient的名称,如果项目使用了Ribbon,name属性会作为微服务的名称,用于服务发现
- url: url一般用于调试,可以手动指定@FeignClient调用的地址
- decode404:当发生http 404错误时,如果该字段位true,会调用decoder进行解码,否则抛出FeignException
- configuration: Feign配置类,可以自定义Feign的Encoder、Decoder、LogLevel、Contract
- fallback: 定义容错的处理类,当调用远程接口失败或超时时,会调用对应接口的容错逻辑,fallback指定的类必须实现@FeignClient标记的接口
- fallbackFactory: 工厂类,用于生成fallback类示例,通过这个属性我们可以实现每个接口通用的容错逻辑,减少重复的代码
- path: 定义当前FeignClient的统一前缀
/**
* @FeignClient 远程客户端 括号内注册中心种的服务名称 声明式远程调用
*/
@FeignClient("xmall-coupon")
public interface CouponFeignService {
@RequestMapping("coupon/coupon/member/list")
public R memberCoupons();
}
@Autowired
private CouponFeignService couponFeignService;
@RequestMapping("/coupons")
public R test(){
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("会员1");
//调用远程服务
R r = couponFeignService.memberCoupons();
return R.ok("请求成功").put("member", memberEntity).put("coupons", r.get("coupons"));
}
Feign数据传递
可以将数据封装为一个对象 TO A服务B服务都会使用
A服务向B服务传递数据
将数据封装成对象,Springcloud会将这个对象默认转为JSON数据,B会收到JSON数据,B也可以将JSON转为对象
@FeignClient("xmall-coupon")
public interface CouponFeignService {
/**
* 1、CouponFeignService.saveSpuBounds(spuBoundTo);
* 1)、@RequestBody将这个对象转为json。
* 2)、找到gulimall-coupon服务,给/coupon/spubounds/save发送请求。
* 将上一步转的json放在请求体位置,发送请求;
* 3)、对方服务收到请求。请求体里有json数据。
* (@RequestBody SpuBoundsEntity spuBounds);将请求体的json转为SpuBoundsEntity;
* 只要json数据模型是兼容的。双方服务无需使用同一个to
* @param spuBoundTo
* @return
*/
@PostMapping("/coupon/spubounds/save")
R saveSpuBouns(@RequestBody SpuBoundTo spuBoundTo);