一、概念
Feign是一个http请求调用的轻量级框架。他的作用就是进行服务之间的调用。
它使用不在像RestTemplate那样麻烦,直接在类上使用注解(@FeignClient())就可以实现。
RestTemplate:
String name="";
name=restTemplate.getForObject(userServer+"user/getUsername",String.class);
Feign:一次声明,多地调用
@FeignClient(value = "store-server",fallback = ProductFeignClientFallback.class)
public interface ProductFegin {
@PostMapping("/store/add")
JsonResult Add(@RequestBody Store store);
}
二、集成步骤
注意:以下步骤是在需要调用远程服务的客户端配置
1、导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、启动类开启Feign功能(打注解)
@EnableFeignClients
3、编写Feign客户端(创建接口类就是把调用对象的controller中需要的接口拿过来)
@FeignClient(value = "store-server",fallback = ProductFeignClientFallback.class)
public interface ProductFegin {
@PostMapping("/store/add")
JsonResult Add(@RequestBody Store store);
}
三、实例代码
1、启动类
@SpringBootApplication
@EnableEurekaClient
//开启Fegin
@EnableFeignClients
public class OrderServerApplication {
public static void main(String[] args) {
SpringApplication.run(OrderServerApplication.class,args);
}
}
2、接口类
@FeignClient(value = "user-server",fallback = UserFeginBack.class)
public interface UserFegin {
//获取用户名
@GetMapping("/user/getUsername")
String getUserName();
}
3、调用地方
/** fegin远程调用 */
@Autowired
private UserFegin userFegin;
@GetMapping("/getOrder")
public String getOrder(){
String name = userFegin.getUserName();
if(null == name && "".equals(name)){
return "没有获取到用户名";
}
return name+" 订单";
}
四、性能优化
1、fegin底层的客户端实现:
URLConnection:默认实现、不支持连接池
ApacheHttpClient、OKHttp:支持连接池
2、优化方式
使用连接池代替默认的URLConnection
日志级别最好是Basic或none
3、步骤
导入依赖
<!-- feign httpclient 依赖 带连接池的fegin-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
配置文件
feign:
hystrix:
enabled: true #开启熔断支持,
client:
config:
default: #default全局配置
loggerLevel: BASIC #日志级别为BASIC
httpclient:
enabled: true #开启fegin对httpClient的支持
max-connections: 200 #最大连接数
max-connection-per-route: 50 #每个路径最大连接数
五、开启熔断
目的:当调用的服务挂掉了、出现问题时,fegin返回兜底数据,告诉调用方调用服务失败。
1、步骤
配置文件开启熔断机制
feign:
hystrix:
enabled: true #开启熔断支持,
写fegin客户端的熔断实现类,即实现Feign客户端
@Component
public class UserFeginBack implements UserFegin{
@Override
public String getUserName() {
return "出错";
}
}