使用Feign完成服务调用

添加Maven依赖

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

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

配置Feign

# 配置Feign
feign:
  client:
    config:
      # 服务提供者的服务名
      nacos-school-server:
        # 设置日志级别
        loggerLevel: FULL

        # 设置契约配置:支持Feign原生注解
        # contract: feign.Contract.Default

        # 设置请求超时时间,超时会抛出异常,单位毫秒,默认值2s
        # readTimeout: 5000

        # 设置连接超时时间,超时会抛出异常,单位毫秒,默认值5s
        # connectTimeout: 10000

        # 配置自定义请求拦截器
        requestInterceptors:
          - com.tigerkin.feign.CustomRequestIntercoptor

添加Feign接口

/**
 * @ClassName SchoolServiceFeign
 * @Description
 * 		value: 服务器提供者的应用程序名
 * 		path: 可以配置统一前缀路径
 * 		fallback: 异常回调
 * @Author tigerkin
 * @Date 2022/3/3 14:14
 */
@Component
@FeignClient(value = "nacos-school-server", path = "/school", fallback = SchoolServiceFallback.class)
public interface SchoolServiceFeign {

    // Feign原生注解:@RequestLine("GET /get") 请求映射注解,不指定GET POST等请求方法就会抛出异常
    // Feign原生注解:@Param() 参数注解
    @GetMapping("/get")
    String get();
}

添加Feign回调

Feign回调需要整合Ribbon或者Sentinel熔断降级,否则就不会生效。由于Ribbon已经不维护,这里就整合Sentinel。

  • 添加依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
  • 添加配置
feign:
  # 集成Sentinel后,需要设置为true
  sentinel:
    enabled: true
  • 整合后回调就可以生效了
/**
 * @ClassName SchoolServiceFallback
 * @Description 异常回调需要实现Feign接口
 * @Author tigerkin
 * @Date 2022/3/3 14:15
 */
@Component
public class SchoolServiceFallback implements SchoolServiceFeign {

    @Override
    public String get() {
        return "获取学校请求调用失败";
    }
}

服务调用

服务调用就比较简单了,就跟调用方法一样。依赖注入Feign接口,然后就只调用方法即可。

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    SchoolServiceFeign schoolServiceFeign;

    @GetMapping("/getSchool")
    public String getSchool() {
        return String.format("[Feign] %s", schoolServiceFeign.get());
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_42270645/article/details/123459082