步驟:
引入依賴
org.springframework.cloud spring-cloud-starter-openfeign
啟動(dòng)類上添加注解@EnableFeignClients
編寫Feign客戶端
@FeignClient("userService")
public interface UserApi {@GetMapping("/user/{id}")
User findById(@PathVariable Long id);
}
使用
這是RestTemplate的代碼
@Service
public class OrderService {@Autowired
private OrderMapper orderMapper;
@Autowired
RestTemplate restTemplate;
public Order queryOrderById(Long orderId) {// 1.查詢訂單
Order order = orderMapper.findById(orderId);
// 2.調(diào)用REST接口查詢數(shù)據(jù)
User user = restTemplate.getForObject("http://userService/user/" + order.getUserId(), User.class);
// 3.封裝數(shù)據(jù)
order.setUser(user);
// 4.返回
return order;
}
}
這是Feign的代碼:
@Service
public class OrderService {@Autowired
private OrderMapper orderMapper;
@Autowired
UserApi userApi;
public Order queryOrderById(Long orderId) {// 1.查詢訂單
Order order = orderMapper.findById(orderId);
// 2.調(diào)用REST接口查詢數(shù)據(jù)
User user = userApi.findById(order.getUserId());
// 3.封裝數(shù)據(jù)
order.setUser(user);
// 4.返回
return order;
}
}
代碼可讀性更高了,并且自帶負(fù)載均衡。
feign可以自定義配置一些東西:
springboot中配置一般都是兩種方式,代碼或者application.yml
代碼
@Bean
public Logger.Level feignLogLevel() {return Logger.Level.FULL;
}
若是全局生效,需要在啟動(dòng)類的注解中加上該配置類:
@EnableFeignClients(defaultConfiguration = CustomConfiguration.class)
若是局部,只需要在對(duì)應(yīng)的客戶端中聲明:
@FeignClient(value = "userService", configuration = CustomConfiguration.class)
application.yml
配置文件同樣也可以配置全局或者局部
全局:
feign:
client:
config:
default: # 這個(gè)就是區(qū)分全局或者局部的 若是default則是全局
logger-level: full
局部:
feign:
client:
config:
userService: # 這個(gè)就是區(qū)分全局或者局部的 若是default則是全局
logger-level: full
Feign底層實(shí)現(xiàn)默認(rèn)是URLConnection,不支持連接池,效率低。
我們可以選擇Apache HttpClient或是OKHttp(倆都支持連接池)來(lái)優(yōu)化Feign的性能。
以HttpClient為例:
引入依賴
io.github.openfeign feign-httpclient
配置連接池
feign:
httpclient:
enabled: true # 開(kāi)啟feign對(duì)httpclient的支持
max-connections: 200 # 大連接數(shù)
max-connections-per-route: 50 # 每個(gè)路徑大連接數(shù)
簡(jiǎn)單說(shuō)就是使用NONE級(jí)別或是BASIC級(jí)別,級(jí)別高了消耗性能。
四、最佳實(shí)踐 方式一:繼承給消費(fèi)者的FeignClient和提供者的Controller定義一個(gè)統(tǒng)一的父接口作為標(biāo)準(zhǔn)。
缺點(diǎn):緊耦合
方式二:抽取就是搞一個(gè)公共的模塊,把多個(gè)微服務(wù)都需要的接口寫在里面,需要使用時(shí)引入即可。
缺點(diǎn)就是會(huì)引入很多不用的東西。
實(shí)現(xiàn):
創(chuàng)建新的公共模塊,導(dǎo)入feign的依賴,創(chuàng)建普通maven項(xiàng)目即可,不然打包時(shí)有坑。
將order-service中的Feign客戶端、實(shí)體類、Feign的配置等移入該公共模塊
在order-service中引入該公共模塊
如:
com.example feign-api 0.0.1-SNAPSHOT
指定客戶端
兩種方式
掃描包,全部導(dǎo)入
@EnableFeignClients(basePackages = "com.example.feignapi.apis")
該包下的所有feign客戶端都會(huì)被掃描
指定客戶端導(dǎo)入
@EnableFeignClients(clients = {UserAPI.class})
指定客戶端,可以是一個(gè)數(shù)組
建議使用第二種。
測(cè)試
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧