- 在Spring Cloud Netflix棧中,各個微服務都是以HTTP接口的形式暴露自身服務的裆赵,因此在調用遠程服務時就必須使用HTTP客戶端东囚。我們可以使用JDK原生的URLConnection、Apache的Http Client战授、Netty的異步HTTP Client, Spring的RestTemplate页藻。但是桨嫁,用起來最方便、最優(yōu)雅的還是要屬Feign了份帐。Feign是一種聲明式璃吧、模板化的HTTP客戶端。在Spring Cloud中使用Feign, 我們可以做到使用HTTP請求遠程服務時能與調用本地方法一樣的編碼體驗废境,開發(fā)者完全感知不到這是遠程方法肚逸,更感知不到這是個HTTP請求。
- feign的優(yōu)勢就是提供統(tǒng)一的抽象彬坏,通過接口來實現遠程調用朦促,更加符合我們的編程習慣图谷。實際上feign就是對restTemplate和ribbon進一步封裝惜傲,使之使用更加簡單、高效翘贮。通過Feign幻赚, 我們能把HTTP遠程調用對開發(fā)者完全透明禀忆,得到與調用本地方法一致的編碼體驗。這一點與阿里Dubbo中暴露遠程服務的方式類似落恼,區(qū)別在于Dubbo是基于私有二進制協(xié)議箩退,而Feign本質上還是個HTTP客戶端。如果是在用Spring Cloud Netflix搭建微服務佳谦,那么Feign無疑是最佳選擇戴涝。
一、入門體驗
1钻蔑、搭建注冊中心和服務提供者
(1)搭建eureka注冊中心
server-url=http://localhost:8081/eureka/
(2)搭建eureka服務提供中心
- spring.application.name=eureka-client
- 提供restful方法為:
@RequestMapping("/hello/{name}")
public String hello(@PathVariable String name){
return "hello "+name;
}
2啥刻、搭建服務消費中心(使用feign)
(1)一如feign相關包,老版本用spring-cloud-starter-feign咪笑,Finchley.SR1版本的用spring-cloud-starter-openfeign
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(2)定義接口
/**
* 定義一個feign接口可帽,通過@ FeignClient(“服務名”),來指定調用哪個服務
*/
@FeignClient(name = "EUREKA-CLIENT")
public interface HelloService {
@RequestMapping("/hello/{name}")
String hello(@PathVariable("name") String name);
}
(3)創(chuàng)建controller并訪問
@Autowired
private HelloService helloService;
@RequestMapping("/hello")
public String hello(){
return helloService.hello("qiu");
}
(4)開啟feign服務
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class RibbonConsumer1Application {
public static void main(String[] args) {
SpringApplication.run(RibbonConsumer1Application.class, args);
}
}
(5)配置
server.port=8083
spring.application.name=feign-consumer
#向注冊中心注冊并獲取相關的服務提供者信息
eureka.client.service-url.defaultZone=http://localhost:8081/eureka/
(6)測試
3窗怒、feign調用整個流程
1映跟、首先通過@EnableFeignCleints注解開啟FeignCleint
2、根據Feign的規(guī)則實現接口扬虚,并加@FeignCleint注解
3努隙、程序啟動后,會進行包掃描孔轴,掃描所有的@ FeignCleint的注解的類剃法,并將這些信息注入到ioc容器中碎捺。
4路鹰、當接口的方法被調用贷洲,通過jdk的代理,來生成具體的RequesTemplate
RequesTemplate在生成Request
5晋柱、Request交給Client去處理优构,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp
6雁竞、最后Client被封裝到LoadBalanceClient類钦椭,這個類結合類Ribbon做到了負載均衡。
二碑诉、feign一些高級功能
- 與ribbon搭配使用
- 重試機制
- 與hystrix搭配使用
- 替換底層連接方式(比如替換成httpClient)
- feign的配置(默認和自定義配置)