OpenFegin 的使用

自定义接口

  1. 引入 jar 包

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.2.3.RELEASE</version>
    </dependency>
  2. 增加注解,在 application 增加注解@@EnableFeignClients,启用 feign

  3. 配置服务地址

    1
    2
    3
    # 配置指定服务的提供者的地址列表
    order-service.ribbon.listOfServers=\
    localhost:8188

    因为是继续 ribbon 的学习,所以会使用一些 ribbon 的配置。

  4. 创建接口

    1
    2
    3
    4
    5
    6
    @FeignClient("spring-cloud-order-service")
    public interface OrderFeginClient {

    @GetMapping("/orders")
    String orders();
    }

    注意这里的 client 是 spring-cloud-order-service,配置文件里面配置的是 order-service.ribbon.listOfServers(有效地址是 order-service)

  5. 使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @RestController
    public class TestOpenFeginController {

    @Autowired
    private OrderFeginClient orderFeginClient;

    @GetMapping("/orders")
    private String orders(){
    return orderFeginClient.orders();
    }
    }

通过依赖调用第三方服务

  1. 新建 maven 项目

  2. 定义接口

    1
    2
    3
    4
    5
    6
    7
    8
    public interface IOrderService {

    @GetMapping("/orders")
    String orders();

    @PostMapping("add")
    int add(OrderDto orderDto);
    }
  3. 实现接口

    1
    2
    3
    4
    5
    @FeignClient(value = "order-service")
    public interface OrderServiceClient extends IOrderService {

    }

     这里的地址是 order-service,没有加上 spring-cloud

  4. 引入该项目

    1
    2
    3
    4
    5
    <dependency>
    <groupId>com.example</groupId>
    <artifactId>order-api</artifactId>
    <version>0.0.2-SNAPSHOT</version>
    </dependency>
  5. 调用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    @RestController
    public class FeignTestController {

    @Autowired
    private OrderServiceClient orderServiceClient;

    @GetMapping("/feign")
    private String feign(){
    return orderServiceClient.orders();
    }

    @GetMapping("/add")
    private int add(){
    return orderServiceClient.add(new OrderDto());
    }
    }

OpenFeign 找不到类的案例

重写搭建了一个项目。来练习 springcloud。结果发现注入了 feign 的接口中,怎么都注入不进去,对比两者之间的差异没有找到原因,后面才发现是因为扫描包路径的问题。

依赖接口所在的路径为 com.example

引入的接口所在项目的 application 所在的路径为 com.example.userservice

引入方式:

1
2
3
4
5
6
7
8
9
@EnableFeignClients
@SpringBootApplication
public class UserServiceApplication {

public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}

}

这个时候会扫描不到接口实现,有 2 种方式解决。

  • 方案 1:将 UserServiceApplication 移动到 com.example 目录下即可(实际情况下,很多时候包的路径都不一致,下策)

  • 方案 2:设置 feign 的包扫描路径

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @EnableFeignClients(basePackages = "com.example")
    @SpringBootApplication
    public class UserServiceApplication {

    public static void main(String[] args) {
    SpringApplication.run(UserServiceApplication.class, args);
    }

    }