文章目录
1 feign简介
- Feign是一个http请求调用的轻量级框架
- 可以以Java接口注解的方式调用Http请求,而不用像Java中通过封装HTTP请求报文的方式直接调用。
- Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的请求,这种请求相对而言比较直观。
- 简化了Http请求的过程,是的Http请求变得简单
2 feign源码总结描述
-
1、 首先通过@EnableFeignClients(添加在程序启动类上)注解开启FeignClient的功能。有了这个注解的存在,才会在程序启动是开启对@FeignClient注解的包进行扫描
-
2、根据Feign的规则实现接口,并在接口上面加上@FeignClient注解
-
3、 程序启动后,会进行包扫描,扫描所有的@FeignClient 的注解类,并将这些信息注入IOC容器中
-
4、 当接口的方法被调用时,通过JDK的代理来生成具体的RequestTemplate模板对象
-
5、 跟据RequestTemplate再生成Http请求的Request对象
-
6、Request对象交给Client去处理,其中Client的网络请求框架可以是HttpURLConnection、HTTPClient、和OkHttp
-
7、 最后Client被封装到LoadBalanceClient类,这个类结合Ribbon做到负载均衡
3 Feign的Demo
3.1 在第一篇基础上构建
在 【spring cloud 第一篇】eureka简介及demo中demo的基础上进行构建,新建一个module为eureka-feign-client,
启动eureka-server,eureka-client打包两个应用,一个端口为8762,一个端口为8763,再分别启动两个eureka-client
3.2 eureka-feign-client相关文件
- pom.xml
- application.yml 配置文件
- EurekaFeignClientApplication.java 服务启动类
- MyFeignController.java 控制类
- MyFeignService.java service实现类
- MyFeignConfig.java feign的自定义配置类
- MyEurekaFeignClient.java Feign接口
3.3 pom.xml 文件
- 继承了主maven工程的pom文件
- feign的起步依赖 spring-cloud-starter-feign
- web功能起步依赖 spring-boot-starter-web
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>eureka-master</artifactId>
<groupId>com.qgg</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-feign-client</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring-boot测试起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
</project>
3.4 application.yml 文件
spring:
application:
name: eureka-feign-client # 应用名称
server:
port: 8766 # 端口
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # 服务注册地址
3.5 EurekaFeignClientApplication启动类
- @EnableEurekaClient 开启eureka client功能
- @EnableFeignClients 开启Feign Client 功能
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients // 开启Feign Client 功能
public class EurekaFeignClientApplication
{
public static void main(String[] args) {
SpringApplication.run(EurekaFeignClientApplication.class,args);
}
}
3.6 编写MyEurekaFeignClient
- @FeignClient 注解来声明这个接口是一个feign client
- value 是远程调用其他服务的服务名
- configuration 指定配置bean
@FeignClient(value = "eureka-client-4",configuration = MyFeignConfig.class)
public interface MyEurekaFeignClient {
/**
* 调用 eureka-client-4 服务的getPort接口
* @PathVariable(name = "name")中的"name"必须要写,并且与eureka-client-4 服务的getPort接口对应
*/
@GetMapping(value = "/getPort/{name}")
public String getPortForEurekaClient(@PathVariable(name = "name") String name);
}
3.7 MyFeignConfig.java配置类
- 覆盖默认的Retryer的bean,更改FeignClient的请求失败重试策略
- 重试间隔为100毫秒,最大重试时间为1秒,重试次数为5次
@Configuration // 表示是一个配置类
public class MyFeignConfig {
/**
* 注入该Bean,Feign在远程调用失败后会进行重试
*/
@Bean
public Retryer feignRetryer() {
return new Retryer.Default(100, TimeUnit.SECONDS.toMillis(1),5);
}
}
3.8 MyFeignService.java
- @Service 表示是一个service
- 注入FeignClient
@Service
public class MyFeignService {
@Autowired
private MyEurekaFeignClient myEurekaFeignClient;
public String getPort(String name) {
return myEurekaFeignClient.getPortForEurekaClient(name);
}
}
3.9 MyFeignController
@RestController
@RequestMapping(value = "/myFeign")
public class MyFeignController {
@Autowired
private MyFeignService myFeignService;
@GetMapping(value = "/getPort/{name}")
public String getPort(@PathVariable String name) {
return myFeignService.getPort(name);
}
}
3.10 服务注册调用图
- Eureka-client 和 eureka-feign-client想eureka-server 进行注册
- eureka-feign-client获取了注册的实例
3.11 启动eureka-feign-client
多次访问 http://localhost:8766/myFeign/getPort/测试feign
测试feign-8762
测试feign-8763