http客戶端Feign
a.Feign替代RestTemplate
以前利用RestTemplate發(fā)起遠(yuǎn)程調(diào)用的代碼:
String url = "http://userservice/user/" + order.getUserId();
User user = restTemplate.getForObject(url, User.class);
存在下面的問(wèn)題:
- 代碼可讀性差,編程體驗(yàn)不統(tǒng)一
- 參數(shù)復(fù)雜URL難以維護(hù)
Feign的介紹
Feign是一個(gè)聲明式的http客戶端, 其作用就是幫助我們優(yōu)雅的實(shí)現(xiàn)http請(qǐng)求的發(fā)送, 解決上面提到的問(wèn)題。
使用Feign的步驟如下:
1.引入依賴:
<!--Feign客戶端依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2.在order-service的啟動(dòng)類添加注解@EnableFeignClients開(kāi)啟Feign的功能:
@EnableFeignClients
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
3.編寫clients/UserClient中Feign客戶端:
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
主要是基于SpringMVC的注解來(lái)聲明遠(yuǎn)程調(diào)用的信息,比如:
- 服務(wù)名稱:userservice
- 請(qǐng)求方式:GET
- 請(qǐng)求路徑:/user/{id}
- 請(qǐng)求參數(shù):Long id
- 返回值類型:User
4.用Feign客戶端代替RestTemplate
b.自定義Feign的配置
Feign運(yùn)行自定義配置來(lái)覆蓋默認(rèn)配置,可以修改的配置如下:
一般我們需要配置的就是日志級(jí)別。
配置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,在config/DefaultFeignConfiguration:
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
而后如果是全局配置,則把它放到@EnableFeignClients這個(gè)注解中:
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
如果是局部配置,則把它放到@FeignClient這個(gè)注解中:
@FeignClient(value = "userservice", configuration = FeignClientConfiguration.class)
c.Feign的性能優(yōu)化
Feign底層的客戶端實(shí)現(xiàn):
- URLConnection:默認(rèn)實(shí)現(xiàn),不支持連接池
- Apache HttpClient :支持連接池
- OKHttp:支持連接池
因此優(yōu)化Feign的性能主要包括:
- 使用HttpClient 或者OKHttp連接池代替默認(rèn)的URLConnection
- 日志級(jí)別,最好用basic或none
Feign添加HttpClient的支持:
1.引入依賴:
<!--HttpClient依賴-->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
</dependency>
2.配置連接池:
feign:
client:
config:
default: # default全局的配置
loggerLevel: BASIC # 日志級(jí)別,BASIC就是基本的請(qǐng)求和響應(yīng)信息
httpclient:
enabled: true # 開(kāi)啟feign對(duì)HttpClient的支持
max-connections: 200 # 最大的連接數(shù)
max-connections-per-route: 50 # 每個(gè)路徑的最大連接數(shù)
d.Feign的最佳實(shí)踐分析
方式一(繼承):給消費(fèi)者的FeignClient和提供者的controller定義統(tǒng)一的父接口作為標(biāo)準(zhǔn)
- 服務(wù)緊耦合
- 父接口參數(shù)列表中的映射不會(huì)被繼承
方式二(抽?。簩eignClient抽取為獨(dú)立模塊,并且把接口有關(guān)的POJO、默認(rèn)的Feign配置都放到這個(gè)模塊中,提供給所有消費(fèi)者使用
e.Feign實(shí)現(xiàn)最佳實(shí)踐(方式二)
實(shí)現(xiàn)最佳實(shí)踐方式二的步驟如下:
- 1.首先創(chuàng)建一個(gè)module,命名為feign-api,然后引入feign的starter依賴
- 2.將order-service中編寫的UserClient、User、DefaultFeignConfiguration都復(fù)制到feign-api項(xiàng)目中
- 3.在order-service中引入feign-api的依賴
- 4.修改order-service中的所有與上述三個(gè)組件有關(guān)的import部分,改成導(dǎo)入feign-api中的包
- 5.重啟測(cè)試
當(dāng)定義的FeignClient不在SpringBootApplication的掃描包范圍時(shí),這些FeignClient無(wú)法使用。有兩種方式解決:
方式一:指定FeignClient所在包文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-670195.html
@EnableFeignClients(basePackages = "cn.itcast.feign.clients")
方式二 (推薦):指定FeignClient字節(jié)碼文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-670195.html
@EnableFeignClients(clients = {UserClient.class})
到了這里,關(guān)于微服務(wù)中間件--http客戶端Feign的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!