一、 基本介绍;

Feign是一种负载均衡的HTTP客户端, 使用Feign调用API就像调用本地方法一样,从避免了 调用目标微服务时,需要不断的解析/封装json 数据的繁琐。
Fegin是一个声明似的web服务客户端,它使得编写web服务客户端变得更加容易。使用Fegin创建一个接口并对它进行注解。它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign。
GitHub地址:https://github.com/OpenFeign/feign

下面就简单介绍一下其基本的使用步骤;

二、基本使用;

1、创建一个maven项目StarkClient,(本文创建Spring boot项目。)

2、引入Fegin和Eureka依赖

(注:Fegin在spring cloud中,经常同Eureka一同使用。)

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

3、配置client 接口类

说明:下面 注解中的 STARK,是已经 在Eureka中注册的其他微服务的服务名;
path,是请求匹配的路径patern。(即:fegin会先找到Stark服务,然后将请求转接到Stark服务中。)

@FeignClient(value = "STARK",path = "/stark/demo")
public interface StarkClient {

   /**
    * 获取所有对象
   *  这就是在fegin中,为我们目标服务中的方法定义的接口,客户端直接通过API代码调用这个类,
   * fegin会自动通过http协议调用目标服务中该接口的实现方法。
   * 这样我们就避免了http的解析和封装操作,提高编码效率。
   **/
    @RequestMapping(path = "_all", method = RequestMethod.GET)
    List<Object> getAll() ;

}

4、利用Client,访问Stark服务中的数据。

4.1开发Client的实现类,这是我们具体利用client提供的接口来获取数据并进行处理的类。

此处使用Springboot 创建一个客户端类.

@RestController
public class StarkBackendApiExampleController {

    @Autowired
    StarkClient starkClient ;

    @RequestMapping(path = "/stark/_all", method = RequestMethod.GET)
    @ResponseStatus(code = HttpStatus.OK)
    public List<Object> getAll() {
        List<Object> listResults = starkClient .getAll();   // 借助fegin,实现了基于API 访问 目标方法。
        return listResults ;
    }

4.2、配置Eureka服务,使Client可以找到配置的Stark服务。

修改application.yml文件

eureka:
  client:
    service-url:
      defaultZone: http://192.168.1.134:1111/eureka    #我们要连接的Stark服务就在该Server主机中。
    register-with-eureka: false
ribbon:
  eureka:
    enabled: true

5、在客户端模块的启动类中,添加注解,来启动fegin和Eureka服务。

 // 此包路径,指明Client接口所在的包。目的是让当前Sringboot可以找到这个类。【必须配置】
@EnableFeignClients(basePackages = {"com.f1.stark.client"})  
@EnableEurekaClient
public class ClientExampleStarter {

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

}

6、访问。

现在,我们就可以访问"/stark/_all" 这个路径了,

三、Stark中遇到的与fegin有关问题,及其解决;

1、由于引入f1-component组件,而受到其中Spring-security组件的权限拦截。

(1)临时解决,exclude Spring-security组件的pom引入。

(2)添加outh2 相关的配置,开启权限。

(3)添加拦截器,实现自动接收token,以及传递到下一个url请求环节中。
拦截器文件:com.joinbright.f1.iot.backend.client.FeignClientsConfiguration。
注:该文件,在与f1整合的项目中, 就不可以再添加使用了,因为f1已经自动整合、加载了该拦截器类。如果再重复添加就会启动报错。

2、某段时间,请求client客户端代码时,报错找不到stark服务。

原因:经排查,是由于stark服务无法注册到Eureka中,才导致找不到stark服务的。
解决:临时更换了eureka服务器,已经使stark服务可以注册,所有客户端代码自然后能找到stark服务,执行也就正常了。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐