1. Open Feign 是什么?
Feign,假装、伪装。OpenFeign可以使消费者将提供者提供的服务名伪装为接口进行消费,消费者只需使用“Service接口 + 注解”的方式即可直接调用Service接口方法,而无需再使用RestTemplate了
2. Ribbon与OpenFeign
Ribbon是Netflix公司的一个开源的负载均衡项目,是一个客户端负载均衡器,运行在消费者端。
OpenFeign也是运行在消费者端的,使用Ribbon进行负载均衡,所以OpenFeign直接内置了Ribbon。即在导入OpenFeign依赖后,无需再专门导入Ribbon依赖了
3.Open Feign 的简单使用
引入jar包,这里需要注意的一点是:OpenFeign内置了Ribbon,所以不需要引入Ribbon的jar包
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.3.RELEASE</version>
</dependency>
新建一个接口类
package com.xhc.example.userservice;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
/**
* @author xuehuichen
* @version V1.0
* @Package com.xhc.example.userservice
* @date 2021/3/20 下午5:24
*/
@FeignClient("order-service")
public interface OrderServiceFeignClient {
// 这里声明的是服务提供方的接口,类似于dubbo一样的使用方法
@GetMapping("/orders")
public String getAllOrder();
}
PS:其实正常情况下都是把这个接口统一的定义为一个单独的模块
在主方法中添加开启OpenFeign的注解
@EnableFeignClients
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
}
新建一个Controller
@RestController
public class OpenFeignController {
@Autowired
OrderServiceFeignClient orderServiceFeignClient;
@GetMapping("/test")
public String test(){
return orderServiceFeignClient.getAllOrder();
}
}
服务消费者的代码完毕,接下来是服务提供者代码(另外新建一个微服务项目)
@RestController
public class OrderService {
@Value("${server.port}")
private int port;
@GetMapping("/orders")
public String getAllOrder(){
System.out.println("port"+port);
return "Return all order";
}
}
application.properties
# 应用名称
spring.application.name=order-service
# 应用服务 WEB 访问端口
server.port=8080
至此,一个使用Open Feign的简单例子就已经写完!这个简单的例子已经实现了Feign远程调用和Ribbon客户端负载均衡,是不是很简单?
4. Open Feign 的原理
4.1 思考Feign要做的事情
- 参数的解析和装载
- 针对指定的feignClient,生成动态代理
- 针对FeignClient中的方法描述进行解析
- 组装出一个Request对象,发起请求