1.简介:
feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用
service。
Spring Cloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。
只需要创建一个接口,然后添加注解即可!
feign ,主要是社区,大家都习惯面向接口编程。这个是很多开发人员的规范。调用微服务访问两种方法
1. 微服务名字 【ribbon】
2. 接口和注解 【feign 】
2.作用:
Feign能干什么?
Feign旨在使编写Java Http客户端变得更容易
前面在使用Ribbon + RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模
板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多
处调用,所以通常都会针对每个微服务自行封装一些客户端类来包装这些依赖服务的调用。所以,
Feign在此基础上做了进一步封装,由他 来帮助我们定义和实现依赖服务接口的定义,在Feign的实
现下,我们只需要创建一个接口并使用注解的方式来配置它(类似于以前Dao接口上标注Mapper
注解,现在是一个微服务接口上面标注一个Feign注解即可。)即可完成对服务提供方的接口绑
定,简化了使用Spring Cloud Ribbon时,自动封装服务调用客户端的开发量。
3.Feign的使用
我们在api上创建接口:
-
package com.csh.springcloud.service;
-
import com.csh.springcloud.pojo.Dept;
-
import org.springframework.cloud.openfeign.FeignClient;
-
import org.springframework.stereotype.Component;
-
import org.springframework.web.bind.annotation.PathVariable;
-
import org.springframework.web.bind.annotation.RequestMapping;
-
import java.util.List;
-
@Component
-
@FeignClient(value = “SPRINGCLOUD-PROVIDER-DEPT”,fallbackFactory = DeptClientServiceFallbackFactory.class)
-
public interface DeptClientService {
-
@RequestMapping(“/dept/add”)
-
public boolean addone();
-
@RequestMapping(“/dept/find/{id}”)
-
public Dept findbyid(@PathVariable(“id”) int id);
-
@RequestMapping(“/dept/selectall”)
-
public List<Dept> findall();
-
}
实现类:
-
package com.csh.springcloud.service;
-
import com.csh.springcloud.pojo.Dept;
-
import feign.hystrix.FallbackFactory;
-
import org.springframework.stereotype.Component;
-
import java.util.List;
-
@Component
-
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {
-
//这里提供的降级服务是当服务器崩了后停了之后客户端再来访问时还是能够访问得到降级信息,不至于服务崩溃了
-
@Override
-
public DeptClientService create(Throwable throwable) {
-
return new DeptClientService() {
-
@Override
-
public boolean addone() {
-
return false;
-
}
-
@Override
-
public Dept findbyid(int id) {
-
return new Dept().setDeptno(id).setDname(“降级”).setDb_source(“降级库”);
-
}
-
@Override
-
public List<Dept> findall() {
-
return null;
-
}
-
};
-
}
-
}
4.consumer上的修改:
DeptComsumerController控制层的修改:
-
package com.csh.springcloud.controller;
-
import com.csh.springcloud.pojo.Dept;
-
import com.csh.springcloud.service.DeptClientService;
-
import org.springframework.beans.factory.annotation.Autowired;
-
import org.springframework.web.bind.annotation.PathVariable;
-
import org.springframework.web.bind.annotation.RequestMapping;
-
import org.springframework.web.bind.annotation.RestController;
-
@RestController
-
public class DeptComsumerController {
-
@Autowired
-
DeptClientService deptClientService=null;
-
@RequestMapping(“/consumer/get/{id}”)
-
public Dept findbyid(@PathVariable(“id”) int id)
-
{
-
return this.deptClientService.findbyid(id);
-
}
-
}
然后是在启动类上加上注解:
@EnableFeignClients(basePackages = “com.csh.springcloud”)
5.总结
Feign通过接口的方法调用Rest服务 ( 之前是Ribbon+RestTemplate )
该请求发送给Eureka服务器 (http://MICROSERVICECLOUD-PROVIDER-DEPT/dept/list)
通过Feign直接找到服务接口,由于在进行服务调用的时候融合了Ribbon技术,所以也支持负载均衡作
用!
feign其实不是做负载均衡的,负载均衡是ribbon的功能,feign只是集成了ribbon而已,但是负载均衡的功能
还是feign内置的ribbon再做,而不是feign。
feign的作用的替代RestTemplate,性能比较低,但是可以使代码可读性很强