摘自 方志朋博客(http://blog.csdn.net/forezp/article/details/69808079 )
spring cloud 中調用服務的方式之二---- 通過 Feign
一、Feign簡介
Feign是一個聲明式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要創建一個接口並注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的編碼器和解碼器。 Feign默認集成了Ribbon,並和Eureka結合,默認實現了負載均衡的效果。
簡而言之:
Feign 采用的是基於接口的注解
Feign 整合了ribbon
Feign是一個聲明式的偽Http客戶端,它使得寫Http客戶端變得更簡單。使用Feign,只需要創建一個接口並注解。它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的編碼器和解碼器。 Feign默認集成了Ribbon,並和Eureka結合,默認實現了負載均衡的效果。
簡而言之:
Feign 采用的是基於接口的注解
Feign 整合了ribbon
Feign使得 Java HTTP 客戶端編寫更方便。Feign 靈感來源於Retrofit、JAXRS-2.0和WebSocket。Feign最初是為了降低統一綁定Denominator到HTTP API的復雜度,不區分是否支持Restful。Feign旨在通過最少的資源和代碼來實現和HTTP API的連接。通過可定制的解碼器和錯誤處理,可以編寫任意的HTTP API。
工作機制
Feign通過配置注入一個模板化請求進行工作。只需在發送之前關閉它,參數就可以被直接的運用到模板中。然而這也限制了Feign,只支持文本形式的API,它可以在響應請求方面來簡化系統。了解了這一點,這也非常容易進行你的單元測試轉換。
二 准備工作
啟動eureka-server,端口8761;
(設置
eureka.server.enable-self-preservation: 在eureka服務注冊中心,將沒有接收到心跳的服務自動剔除)
啟動eureka-client 2次,端口分別是8762,8763;
三 創建feign服務
3.1 新建spring-boot module,取名service-feign;
3.2 導包 spring-boot-starter-web ; spring-cloud-starter-eureka ; spring-cloud-starter-feign;
3.3 配置application.yaml 配置文件,端口 8765;
server:
port: 8765
spring:
application:
name: service-feign
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
3.4 在程序的主入口的類上加上@EnableFeignClients 這個注解,這個注解表示開啟了feign負載均衡的功能;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //此注解開啟feign功能
public class SpringCloudServiceFeignApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudServiceFeignApplication.class, args);
}
}
3.5 創建一個feign接口並通過注解@FeignClient(" 服務名")指定調用某個服務,再通過@RequestMapping(value="/hi", method=RequestMethod.GET) 表明調用 “ service-hi ” 這個服務的 “ /hi ” 這個接口;
@Service @FeignClient(value = "service-hi") //指的是調用service-hi這個服務 public interface SchedualServiceHi { @RequestMapping(value = "/hi",method = RequestMethod.GET) //調用service-hi這個服務的 /hi 這個接口 String sayHiFromClientOne(@RequestParam("name")String name); }
3.6 在web的Controller層,對外暴露一個 " /hello " 接口,通過上面定義的feign的客戶端SchedualServiceHi 來消費服務
@RestController
public class HiController {
@Autowired
SchedualServiceHi schedualServiceHi;
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String sayHi(String name){
return schedualServiceHi.sayHiFromClientOne(name);
}
}
3.7 測試: 多次訪問 http://localhost:8765/hello?name=zdj,頁面會交替出現
hello,this port is : 8763 hello,this port is : 8762
說明: 達到了通過feign來實現負載均衡功能的效果。
問題摘錄:
eg 1. “ 我的8763已經停掉了,為什么在注冊中心還能看見呢,刷了好幾遍一直都在 ”
eureka.server.enable-self-preservation=false關閉保護機制,確保注冊中心可以將不可用的實例剔除
