SpringCloud Feign客戶端使用流程
一.HTTP客戶端Feign
1.1RestTemplate方式調(diào)用存在的問題
以前我用使用RestTemplate發(fā)起遠(yuǎn)程調(diào)用的代碼:
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
存在的問題:
①代碼可讀性差,編程體驗(yàn)體驗(yàn)不統(tǒng)一
②參數(shù)復(fù)雜的URL難以維護(hù)
1.2Feign的介紹
Feign是一個聲明式的http客戶端,官方地址:https://github.com/OpenFeign/feign
其作用就是幫助我們優(yōu)雅的實(shí)現(xiàn)http請求的發(fā)送,解決上面提到的問題。
1.3Feign的使用
①書接上文,在orderservice中引入依賴
<!--feign客戶端依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>②在啟動類上添加注解開啟Feign的功能
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients #開啟Feign功能
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}③編寫Feign客戶端
新建一個接口,使用@FeignClient注解指定是哪個微服務(wù)。下面的與Controller寫法類似對應(yīng)
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}主要是基于SpringMVC的注解來聲明遠(yuǎn)程調(diào)用的信息,比如:
服務(wù)名稱:userservice
請求方式:GET
請求路徑:/user/{id}
請求參數(shù):Long id
返回值類型:User
④用Feign客戶端代替RestTemplate
在orderservice中,更改之前我們使用的RestTemplate
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查詢訂單
Order order = orderMapper.findById(orderId);
//2.用feign遠(yuǎn)程調(diào)用
User user = userClient.findById(order.getUserId());
//3.封裝user到Order里
order.setUser(user);
// 4.返回
return order;
}
}⑤重啟orderservice,訪問,查看效果
⑥小結(jié)
Feign的使用步驟
引入依賴
添加@EnableFeignClients注解
編寫FeignClient接口
使用FeignClient中定義的方法代替RestTemplate
1.4自定義Feign的配置
Feign運(yùn)行自定義配置來覆蓋默認(rèn)配置,可以修改的配置如下:

配置Feign日志的兩種方式
①配置文件方式
全局生效:
feign:
client:
config:
default: # 這里用default就是全局配置,如果是寫服務(wù)名稱,則是針對某個微服務(wù)的配置 loggerLevel: FULL # 日志級別
局部生效:
feign:
client:
config:
userservice: # 寫服務(wù)名稱,則是針對某個微服務(wù)的配置
loggerLevel: FULL # 日志級別
②java代碼方式
首先需要聲明一個Bean
public class FeignClientConfiguration {
@Bean
public Logger.Level feignLogLevel(){
return Logger.Level.BASIC;
}
}如果要使用全局配置,把他放到@EnableFeignClients這個注解中
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
如果要使用局部配置,把他放到@FeignClient這個注解中
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
③小結(jié)
Feign的日志配置:
方式一是配置文件,feign.client.config.xxx.loggerLevel
如果xxx是default則代表全局
如果xxx是服務(wù)名稱,例如userservice則代表某服務(wù)
方式二是java代碼配置Logger.Level這個Bean
如果在@EnableFeignClients注解聲明則代表全局
如果在@FeignClient注解中聲明則代表某服務(wù)
1.5Feign性能優(yōu)化
Feign底層的客戶端實(shí)現(xiàn):
URLConnection:默認(rèn)實(shí)現(xiàn),不支持連接池
Apache HttpClient :支持連接池
OKHttp:支持連接池
因此優(yōu)化Feign的性能主要包括:
使用連接池代替默認(rèn)的URLConnection
日志級別,最好用basic或none
Feign的性能優(yōu)化-連接池配置
Feign添加HttpClient的支持:
①引入依賴
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>②配置連接池
feign:
httpclient:
enabled: true #支持httpclient
max-connections: 200 #最大連接數(shù)
max-connections-per-route: 50 #單個請求路徑最大連接數(shù)
③小結(jié)
Feign的優(yōu)化:
日志級別盡量用basic
使用HttpClient或OKHttp代替URLConnection
引入feign-httpClient依賴
配置文件開啟httpClient功能,設(shè)置連接池參數(shù)
1.6Feign的最佳實(shí)踐
將FeignClient抽取為獨(dú)立模塊,并且將與接口相關(guān)的POJO、默認(rèn)的Feign配置都放在這個模塊,提供給所有消費(fèi)者使用

①新建一個模塊,明明為feign(自定義)
②導(dǎo)入有關(guān)依賴
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
③將pojo、配置類、Feign的接口復(fù)制到feign模塊里
④orderservice中導(dǎo)入feign模塊的依賴
<dependency>
<groupId>cn.itcast.demo</groupId>
<artifactId>feign</artifactId>
<version>1.0</version>
</dependency>⑤將orderservice中有關(guān)feign調(diào)用的包都改成模塊的
⑥重啟測試
當(dāng)定義的FeignClient不在SpringBootApplication的掃描包范圍時,這些FeignClient無法使用。有兩種方式解決:
方式一:指定FeignClient所在包
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
方式二:指定FeignClient字節(jié)碼
@EnableFeignClients(clients = {UserClient.class})
到此這篇關(guān)于SpringCloud Feign客戶端使用流程的文章就介紹到這了,更多相關(guān)SpringCloud Feign內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Java實(shí)現(xiàn)DNS域名解析的簡單示例
這篇文章主要介紹了使用Java實(shí)現(xiàn)DNS域名解析的簡單示例,包括對一個動態(tài)IP主機(jī)的域名解析例子,需要的朋友可以參考下2015-10-10
@Autowired自動裝配,@Bean注入@Primary,@Qualifier優(yōu)先級講解
這篇文章主要介紹了@Autowired自動裝配,@Bean注入@Primary,@Qualifier優(yōu)先級,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

