一、 基本介绍;
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服务,执行也就正常了。