1. 什么Feign
-
feign是声明式的web service客户端,它让微服务之间的调用变得更简单了,类似controller调用service。
-
SpringCloud集成了Ribbon和Eureka,可在使用Feign时提供负载均衡的http客户端。
-
只需要创建一个接口,然后添加注解即可!
-
feign,主要是社区,大家都习惯面向接口编程。这个是很多开发人员的规范。
-
调用微服务访问两种方法
- 1.微服务名字【ribbon】
- 2.接口和注解【feign】
总结:
- Feign是基于接口的注解;
- Feign整合了ribbon,具有负载均衡的能力;
- 整合了Hystrix,具有熔断的能力。
2. Feign能干什么?
- Feign旨在使编写Java Http客户端变得更容易
- 前面在使用Ribbon + RestTemplate时,利用RestTemplate对Http请求的封装处理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一处,往往一个接口会被多处调用,所以通常都会针对每个微服务自行封装一个客户端类来包装这些依赖服务的调用。所以,Feign在此基础上做了进一步的封装,由他来帮助我们定义和实现依赖服务接口的定义,在Feign的实现下,我们只需要创建一个接口并使用注解的方式来配置它 (类似以前Dao接口上标注Mapper注解,现在是一个微服务接口上面标注一个Feign注解),即可完成对服务提供方的接口绑定,简化了使用Spring Cloud Ribbon 时,自动封装服务调用客户端的开发量。
3. Feign默认集成了Ribbon
- 利用Ribbon维护了MicroServiceCloud-Dept的服务列表信息,并且通过轮询实现了客户端的负载均衡,而与Ribbon不同的是,通过Feign只需要定义服务绑定接口且以声明式的方法,优雅而简单的实现了服务调用。
4. 整合Feign
复制一份跟springcloud-consumer-dept-80模块一样并命名为springcloud-consumer-dept-feign,具体可参考:https://blog.csdn.net/Yearingforthefuture/article/details/117856588
4.1 导入依赖
在springcloud-consumer-dept-feign的pom.xml中添加:
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign </artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
4.2 编写Controller
DeptConsumerController.java,通过注解调用服务提供者
@RestController
@RequestMapping("/consumer/dept")
public class DeptConsumerController {
@Autowired
public DeptClientService deptClientService;
@RequestMapping("/add")
public boolean addDept(Dept dept) {
return deptClientService.addDept(dept);
}
@GetMapping("/get/{id}")
public Dept queryById(@PathVariable("id") Long id) {
return deptClientService.queryById(id);
}
@GetMapping("/get/list")
public List<Dept> quertAll() {
return deptClientService.quertAll();
}
}
4.3 开启注解支持
FeignDeptConsumer_80.java
/**
* 启动类
*/
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient //通过@EnableDiscoveryClient注解让改应用注册为Eureka客户端应用,以获得服务发现的能力
@EnableFeignClients(basePackages = {"com.test.springcloud"})//开启api模块注解的支持
@Component("com.test.springcloud") //开启feign模块注解的支持
public class FeignDeptConsumer_80 {
public static void main(String[] args) {
SpringApplication.run(FeignDeptConsumer_80.class,args);
}
}
4.4 修改springcloud-api
4.4.1 导入依赖
在springcloud-api的pom.xml中添加
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign </artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
4.4.2 添加Service
DeptClientService.java
@Component
@FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT")
public interface DeptClientService {
@PostMapping("/dept/add")
public boolean addDept(Dept dept);
@GetMapping("/dept/get/{id}")
public Dept queryById(@PathVariable("id") Long deptno);
@GetMapping("/dept/list")
public List<Dept> quertAll();
}
4.5 启动测试
在浏览器中输入:http://localhost/consumer/dept/get/list
feign跟ribbon一样可以照常的访问。
5. 总结
- Feign负载均衡(基于服务端),Ribbon负载均衡(基于客户端);
- Feign是基于接口的注解,Ribbon通过RestTemplate和服务名进行调用;
- Feign使用面向接口风格,Ribbon使用REST风格。
内容参考:https://www.bilibili.com/video/BV1jJ411S7xr
仅用于学习!