Feign是什么
Feign是Netflix公司開發的一個聲明式的REST調用客戶端;
Ribbon負載均衡、Hystrix服務熔斷是我們Spring Cloud中進行微服務開發非?;A的組件,在使用的過程中我們也發現它們一般都是同時出現的,而且配置也都非常相似,每次開發都有很多相同的代碼,因此Spring Cloud基于Netflix Feign整合了Ribbon和Hystrix兩個組件,讓我們的開發工作變得更加簡單,就像Spring Boot是對Spring+SpringMVC的簡化一樣,Spring Cloud Feign對Ribbon負載均衡、Hystrix服務熔斷進行簡化,在其基礎上進行了進一步的封裝,不僅在配置上大大簡化了開發工作,同時還提供了一種聲明式的Web服務客戶端定義方式;
使用Feign實現消費者,我們通過下面步驟進行:
首先我們來創建一個普通的Spring Boot工程,取名為:05-springcloud-service-feign;
要添加的依賴主要是spring-cloud-starter-netflix-eureka-client和spring-cloud-starter-feign,如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
<!--Spring Cloud熔斷器起步依賴-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
第三步:添加注解
在項目入口類上添加@EnableFeignClients注解表示開啟Spring Cloud Feign的支持功能;
定義一個HelloService接口,通過@FeignClient注解來指定服務名稱,進而綁定服務,然后再通過SpringMVC中提供的注解來綁定服務提供者提供的接口,如下:
@FeignClient("01-springcloud-service-provider")
public interface HelloService {
@RequestMapping("/service/hello")
public String hello();
}
這相當于綁定了一個名叫01-springcloud-service-provider (這里01-springcloud-service-provider大小寫01-SPRINGCLOUD-SERVICE-PROVIDER都可以 ) 的服務提供者提供的/service/hello接口;
我們服務提供者提供的接口如下:
@GetMapping("/service/hello")
public String hello() {
System.out.println("服務提供者1。。。。。。。");
return "Hello, Spring Cloud,Provider 1";
}
第五步:使用Controller中調用服務
接著來創建一個Controller來調用上面的服務,如下:
@RestController
public class FeignController {
@Autowired
HelloService helloService;
@RequestMapping("/web/hello")
public String hello() {
return helloService.hello();
}
}
第六步:屬性配置
在application.properties中指定服務注冊中心、端口號等信息,如下:
server.port=8082
#配置服務的名稱
spring.application.name=05-springcloud-service-feign
#配置eureka注冊中心地址
eureka.client.service-url.defaultZone=http://eureka8761:8761/eureka/,http://eureka8762:8762/eureka/
第七步:測試
依次啟動注冊中心、服務提供者和feign實現服務消費者,然后訪問如下地址:http://localhost:8082/web/hello。
之前我們為了簡化RestTemplate操作,將之封裝在一個BookService中,但同時我們也發現BookService中的方法幾乎都是模板式的,寫起來很枯燥,Spring Cloud Feign對此進行了進一步的封裝,簡化了我們的封裝操作。
Feign的基本使用,在HelloService類中聲明接口時,我們發現這里的代碼可以直接從服務提供者的Controller中復制過來,這些可以復制的代碼Spring Cloud Feign對它進行了進一步的抽象,這里就用到了Feign的繼承特性,Feign繼承特性的方便之處了,這種方式用起來確實很方面,但是也帶來一個問題,就是服務提供者和服務消費者的耦合度太高,此時如果服務提供者修改了一個接口的定義,服務消費者可能也得跟著變化,進而帶來很多未知的工作量,因此小伙伴們在使用繼承特性的時候,要慎重考慮。