springcloud--part3 : 服務消費者(feign)


摘自  方志朋博客(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使得 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關閉保護機制,確保注冊中心可以將不可用的實例剔除




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM