目录
- 1. HelloWorld
- 1.1 pom.xml
- 1.2 yml配置
- 1.3 开启OpenFeign
- 1.4 创建Product的FeignClient
- 1.5 Controller
- 2. OpenFeign的工作原理
1. HelloWorld
服务中心以及Product微服务继续使用LoadBalance中的HelloWorld,新建一个client作为OpenFeign的例子
1.1 pom.xml
引入openfeign依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
1.2 yml配置
spring:
application:
name: open-feign
server:
port: 8001
eureka:
client:
service-url:
defaultZone: http://localhost:3333/eureka/
1.3 开启OpenFeign
@SpringBootApplication
// 开启OpenFeign
@EnableFeignClients
public class FeignClientApplication {
public static void main(String[] args) {
SpringApplication.run(FeignClientApplication.class, args);
}
}
1.4 创建Product的FeignClient
@FeignClient("product")
public interface ProductFeignClient {
@GetMapping("/product")
public String getProduct();
}
1.5 Controller
@RestController
@RequestMapping("/feign")
public class ProductController {
// 注入ProductFeignClient
@Autowired
private ProductFeignClient productFeignClient = null;
@GetMapping("/product")
public String getProduct() {
// product client发起请求
return productFeignClient.getProduct();
}
}
HelloWorld简简单单就建好了。启动四个服务,浏览器输入http://localhost:8001/feign/product
,即可在浏览器看到5001或者5002。多试几次会发现5001和5002是依次出现的,SpringCloud全家桶使用的自家的LoadBalance实现负载均衡,默认情况下会使用,不用特别配置。
2. OpenFeign的工作原理
先把整体流程亮出来,后续再注意分析。话不多说从图说起
OpenFeign的工作原理如下:
- 注册OpenFeign的client
- 创建Feign.Builder,用于收集FeignClient的配置信息
- 创建ReflectiveFeign,用于创建FeignClient代理实例
- 创建FeignClient代理实例
- 当接收到请求时,代理使用FeignInvocationHandler处理HTTP请求
- 发送HTTP请求并获取结果
整体的过程大致如此,接下来逐一分析。