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是一個(gè)聲明式的http客戶端,官方地址:https://github.com/OpenFeign/feign
其作用就是幫助我們優(yōu)雅的實(shí)現(xiàn)http請(qǐng)求的發(fā)送,解決上面提到的問題。
1.3Feign的使用
①書接上文,在orderservice中引入依賴
<!--feign客戶端依賴--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
②在啟動(dòng)類上添加注解開啟Feign的功能
@MapperScan("cn.itcast.order.mapper") @SpringBootApplication @EnableFeignClients #開啟Feign功能 public class OrderApplication { public static void main(String[] args) { SpringApplication.run(OrderApplication.class, args); } }
③編寫Feign客戶端
新建一個(gè)接口,使用@FeignClient注解指定是哪個(gè)微服務(wù)。下面的與Controller寫法類似對(duì)應(yīng)
@FeignClient("userservice") public interface UserClient { @GetMapping("/user/{id}") User findById(@PathVariable("id") Long id); }
主要是基于SpringMVC的注解來聲明遠(yuǎn)程調(diào)用的信息,比如:
服務(wù)名稱:userservice
請(qǐng)求方式:GET
請(qǐng)求路徑:/user/{id}
請(qǐng)求參數(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ù)名稱,則是針對(duì)某個(gè)微服務(wù)的配置 loggerLevel: FULL # 日志級(jí)別
局部生效:
feign:
client:
config:
userservice: # 寫服務(wù)名稱,則是針對(duì)某個(gè)微服務(wù)的配置
loggerLevel: FULL # 日志級(jí)別
②java代碼方式
首先需要聲明一個(gè)Bean
public class FeignClientConfiguration { @Bean public Logger.Level feignLogLevel(){ return Logger.Level.BASIC; } }
如果要使用全局配置,把他放到@EnableFeignClients這個(gè)注解中
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
如果要使用局部配置,把他放到@FeignClient這個(gè)注解中
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
③小結(jié)
Feign的日志配置:
方式一是配置文件,feign.client.config.xxx.loggerLevel
如果xxx是default則代表全局
如果xxx是服務(wù)名稱,例如userservice則代表某服務(wù)
方式二是java代碼配置Logger.Level這個(gè)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
日志級(jí)別,最好用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 #單個(gè)請(qǐng)求路徑最大連接數(shù)
③小結(jié)
Feign的優(yōu)化:
日志級(jí)別盡量用basic
使用HttpClient或OKHttp代替URLConnection
引入feign-httpClient依賴
配置文件開啟httpClient功能,設(shè)置連接池參數(shù)
1.6Feign的最佳實(shí)踐
將FeignClient抽取為獨(dú)立模塊,并且將與接口相關(guān)的POJO、默認(rèn)的Feign配置都放在這個(gè)模塊,提供給所有消費(fèi)者使用
①新建一個(gè)模塊,明明為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)用的包都改成模塊的
⑥重啟測(cè)試
當(dāng)定義的FeignClient不在SpringBootApplication的掃描包范圍時(shí),這些FeignClient無法使用。有兩種方式解決:
方式一:指定FeignClient所在包
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
方式二:指定FeignClient字節(jié)碼
@EnableFeignClients(clients = {UserClient.class})
到此這篇關(guān)于SpringCloud Feign客戶端使用流程的文章就介紹到這了,更多相關(guān)SpringCloud Feign內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Spring Boot 使用Java代碼創(chuàng)建Bean并注冊(cè)到Spring中
本篇介紹了Spring Boot 使用Java代碼創(chuàng)建Bean并注冊(cè)到Spring中,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02Spring Cloud Hystrix實(shí)現(xiàn)服務(wù)容錯(cuò)的方法
Hystrix是SpringCloud中重要的熔斷保護(hù)組件,由Netflix開源,主要提供延遲和容錯(cuò)管理,以保障分布式系統(tǒng)的高可用性和魯棒性,通過封裝依賴項(xiàng)實(shí)現(xiàn)服務(wù)間隔離,引入回退邏輯應(yīng)對(duì)依賴服務(wù)故障,有效防止系統(tǒng)崩潰和服務(wù)級(jí)聯(lián)故障2024-10-10Java實(shí)現(xiàn)的連續(xù)奇數(shù)(n+2*x)是合數(shù)的算法題暴力算法
這篇文章主要介紹了Java實(shí)現(xiàn)的連續(xù)奇數(shù)(n+2*x)是合數(shù)的算法題暴力算法,本文包含運(yùn)算結(jié)果和實(shí)現(xiàn)代碼,需要的朋友可以參考下2014-09-09Java學(xué)習(xí)基礎(chǔ)之安裝JDK/配置JDK環(huán)境&IEDA工具安裝
這篇文章主要介紹了Java學(xué)習(xí)基礎(chǔ)系列文章的第一篇,主要內(nèi)容是安裝JDK/配置JDK環(huán)境&IEDA工具安裝的相關(guān)資料,需要的朋友可以參考下2020-02-02新的Java訪問mysql數(shù)據(jù)庫工具類的操作代碼
本文通過實(shí)例代碼給大家介紹新的Java訪問mysql數(shù)據(jù)庫工具類的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2021-12-12