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對象,發起請求