OpenFiegn

具体调用方法及过程见本章节统计目录 SpringCloudAlibaba下的 远程调用OpenFeign 章节.

此处以gulimall-product模块中,调用gulimall-coupon的功能来演示.

首先,要保证两个模块都注册到了nacos注册中心里.
创建feign包,feign包下创建接口CouponFeignService,用来调用gulimall-coupon的功能:

  1. package com.atguigu.gulimall.product.feign;
  2. import org.springframework.cloud.openfeign.FeignClient;
  3. /**
  4. * 本类说明:
  5. *
  6. * @author yuanhai
  7. * @date 2022年02月18日
  8. */
  9. @FeignClient("gulimall-coupon") // 声明 是调用 gulimall-coupon 服务
  10. public interface CouponFeignService {
  11. }

gulimall-product要在启动类上开启远程调用功能:

  1. // 想要远程调用别的服务,就要在启动类上标注@EnableFeignClients注解,开启远程调用功能
  2. // basePackages = "com.atguigu.gulimall.product.feign 可以不写,也可以写上去显式指定feign接口都在哪个为位置
  3. @EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
  4. @EnableDiscoveryClient
  5. @MapperScan("com.atguigu.gulimall.product.dao")
  6. @SpringBootApplication
  7. public class GulimallProductApplication {
  8. public static void main(String[] args) {
  9. SpringApplication.run(GulimallProductApplication.class, args);
  10. }
  11. }

在CouponFeignService中,写好要调用的功能后,
在gulimall-product的类中,注入CouponFeignService后就可以使用CouponFeignService的对象来调用功能了.

TO领域对象模型

两个微服务模块,都要用到的对象.
比如gulimall-product服务向guliamll-coupon服务传递这个对象,
guliamll-coupon服务需要接收这个对象做处理.这种设为TO.
这时gulimall-product,guliamll-coupon都要用,我们把这个TO对象放在gulimall-common中(AB两个服务都会引入gulimall-common模块)

fiegn接口案例以及细节(远程调用过程)

/*
1、CouponFeignService.saveSpuBounds(spuBoundTo);
1)、@RequestBody将这个对象转为json。
2)、找到gulimall-coupon服务,给/coupon/spubounds/save发送请求。
将上一步转的json放在请求体位置,发送请求;
3)、对方服务收到请求。请求体里有json数据。
(@RequestBody SpuBoundsEntity spuBounds);将请求体的json转为SpuBoundsEntity;
只要json数据模型是兼容的。双方服务无需使用同一个to
** */

  1. package com.atguigu.gulimall.product.feign;
  2. import com.atguigu.common.to.SpuBoundTO;
  3. import com.atguigu.common.utils.R;
  4. import org.springframework.cloud.openfeign.FeignClient;
  5. import org.springframework.web.bind.annotation.PostMapping;
  6. import org.springframework.web.bind.annotation.RequestBody;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. /**
  9. * 本类说明:
  10. *
  11. * @author yuanhai
  12. * @date 2022年02月18日
  13. */
  14. @FeignClient("gulimall-coupon") // 声明 是调用 gulimall-coupon 服务
  15. public interface CouponFeignService {
  16. /**
  17. * 1、CouponFeignService.saveSpuBounds(spuBoundTo);
  18. * 1)、@RequestBody将这个对象转为json。
  19. * 2)、找到gulimall-coupon服务,给/coupon/spubounds/save发送请求。
  20. * 将上一步转的json放在请求体位置,发送请求;
  21. * 3)、对方服务收到请求。请求体里有json数据。
  22. * (@RequestBody SpuBoundsEntity spuBounds);将请求体的json转为SpuBoundsEntity;
  23. * 只要json数据模型是兼容的。双方服务无需使用同一个to
  24. * @param spuBoundTO
  25. * @return
  26. */
  27. @PostMapping("/coupon/spubounds/save")
  28. R saveBounds(@RequestBody SpuBoundTO spuBoundTO);
  29. }

远程调用是否经过网关

  1. package com.atguigu.gulimall.ware.feign;
  2. import com.atguigu.common.utils.R;
  3. import org.springframework.cloud.openfeign.FeignClient;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. @FeignClient("gulimall-product")
  7. public interface ProductFeignService {
  8. /**
  9. * /product/skuinfo/info/{skuId}
  10. *
  11. *
  12. * 1)、让所有请求过网关;
  13. * 1、@FeignClient("gulimall-gateway"):给gulimall-gateway所在的机器发请求
  14. * 2、/api/product/skuinfo/info/{skuId}
  15. * 2)、直接让后台指定服务处理
  16. * 1、@FeignClient("gulimall-gateway")
  17. * 2、/product/skuinfo/info/{skuId}
  18. *
  19. * @return
  20. */
  21. @RequestMapping("/product/skuinfo/info/{skuId}")
  22. public R info(@PathVariable("skuId") Long skuId);
  23. }