当前位置:   article > 正文

【1.4 服务调用(Feign)】使用Feign服务间相互调用,其实OpenFeign也没有想象中那么难嘛_feignclient服务间调用

feignclient服务间调用

一、Feign介绍

openfeign是一个java的http客户端,用来简化http调用

二、Feign架构(来自官方)

Feign由五大部分组成,

由于刚开始接触 feign ,比较关注的 clients 跟 encoders/decoders
在这里插入图片描述

三、OKHTTP与Feign之间的关系

在Feign中,Client是一个非常重要的组件,Feign最终发送Request请求以及接收Response响应都是由Client组件来完成的。

Client在Feign源码中是一个接口,在默认情况下,Client的实现类是Client.Default。
Client.Default是由HttpURLConnection来实现网络请求的。
另外,Client还支持HttpClient和OkHttp来进行网络请求。

如果想要在Feign中使用OkHttp作为网络请求框架,则只需要在pom文件中加上feign-okhttp的依赖

四、实战Feign

使用Spring Cloud组件时,微服务之间的调用是通过HTTP实现的,同时也是需要把服务接口在公用模块定义出来,其它微服务就可以直接像使用接口一样调用服务即可。
示例如下:
在微服务A模块(MALL_API)中实现了某个接口服务,需要从微服务B(Third-Party)远程去调用微服务A模块(MALL_API)的接口实现。

4.1 在各个启动类中加入此注解@EnableFeignClients

使用注解@EnableFeignClients启用feign客户端;

  1. @SpringBootApplication
  2. @EnableBaseFeignClients
  3. public class ProjectAuthApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(ProjectAuthApplication.class, args);
  6. }
  7. }

看到, @EnableBaseFeignClients注解是继承自@EnableFeignClients

  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @EnableFeignClients
  5. public @interface EnableBaseFeignClients {
  6. String[] value() default {};
  7. String[] basePackages() default {"com.project.cloud"};
  8. Class<?>[] basePackageClasses() default {};
  9. Class<?>[] defaultConfiguration() default {};
  10. Class<?>[] clients() default {};
  11. }

4.2 在POM文件中添加OpenFeign、OkHttp依赖

  1. <!--feign 依赖-->
  2. <dependency>
  3. <groupId>io.github.openfeign</groupId>
  4. <artifactId>feign-okhttp</artifactId>
  5. </dependency>
  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-openfeign</artifactId>
  5. <version>3.0.3</version>
  6. </dependency>
  7. </dependencies>

4.3 在微服务B中编写远程调用逻辑

  1. private final FeignPointsRecordService feignPointsRecordService;
  2. private void savePointsRecord(Integer newPoints, Integer oldPoints, String userId) {
  3. R r = feignPointsRecordService.ddCareSavePointsRecord(newPoints, oldPoints, userId, SecurityConstants.FROM_IN);
  4. if (!r.isOk()) {
  5. log.error("savePointsRecord error !userId = {}", userId);
  6. throw new RuntimeException(r.getMsg());
  7. }
  8. }

4.4 在微服务B中编写远程调用逻辑

在公用模块定义使用接口,并加入此声明使用注解@FeignClient 定义Feign客户端

  1. @FeignClient(contextId = "feignPointsRecordService", value = ServiceNameConstants.MALL_API_SERVICE)
  2. public interface FeignPointsRecordService {
  3. /**积分变动记录 */
  4. @GetMapping("/pointsrecord/ddCareSavePointsRecord/{newPoints}/{oldPoints}/{userId}")
  5. R ddCareSavePointsRecord(@PathVariable("newPoints") Integer newPoints, @PathVariable("oldPoints") Integer oldPoints, @PathVariable("userId") String userId, @RequestHeader(SecurityConstants.FROM) String from);
  6. @PostMapping("/pointsrecord/recharge")
  7. R pointsrecord(@RequestBody @Valid PointsRecord record, @RequestHeader(SecurityConstants.FROM) String from);
  8. }

4.5 微服务A中实现调用逻辑

  1. /*积分变动记录 */
  2. @ApiOperation(value = "积分变动记录-爱关怀积分充值")
  3. @GetMapping("/ddCareSavePointsRecord/{newPoints}/{oldPoints}/{userId}")
  4. @Inside
  5. public R ddCareSavePointsRecord(@PathVariable("newPoints") Integer newPoints, @PathVariable("oldPoints") Integer oldPoints, @PathVariable("userId") String userId) {
  6. TenantContextHolder.setTenantId(CommonConstants.DESAY_SV_TENANT_ID);
  7. return R.ok(pointsRecordService.ddCareSavePointsRecord(newPoints, oldPoints, userId));
  8. }

五、Feign的使用过程遇到的报错

場景1:沒有正確使用@PathValue

解決方案: 記得需要帶上{id}
feign method GET must not have a request body.超过2个参数时报Method has too many Body parameters:
https://blog.csdn.net/qq_34412985/article/details/108176425
https://blog.51cto.com/u_15242378/2986822
https://blog.csdn.net/qq_34412985/article/details/108176425

feign method GET must not have a request body.超过2个参数时报Method has too many Body parameters:

場景2:沒有正確使用@GetMapping 或者是@PostMapping

解決方案:改爲@PostMapping + @RequestBody
feign method GET must not have a request body.
https://www.cnblogs.com/qq376324789/p/14885327.html

https://www.codeleading.com/article/95383859705/

六、好用的OpenFeign的插件介绍

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号