SpringCloud Feign負載均衡的簡介及實現

前面我們通過兩篇文章介紹了一下spring cloud ribbon實現負載均衡

1)Feign 簡介
feign是聲明式的web service客戶端,它使微服務之間的調用更加簡單,就像傳統ssm框架中controller調用service一樣,SpringCloud集成了Eureka和Ribbon,可在使用Feign時提供負載均衡的http客戶端。
只需要創建一個接口,添加註解即可

調用微服務的方式:

  • 通過微服務名稱調用【ribbon】
  • 通過接口和註解調用【feign】

2)Feign 的原理

  • 啓動時掃描所有包下所有@FeignClient註解的類,並將這些類注入到spring的IOC容器中。當定義的Feign中的接口被調用時,通過JDK的動態代理來生成RequestTemplate
  • RequestTemplate中包含請求的所有信息,如請求參數,請求URL
  • RequestTemplate生成Request,然後將Request交給client處理
  • 最後client封裝成LoadBaLanceClient,結合ribbon負載均衡地發起調用

3)Feign的集成實現

  • 引入依賴,修改pom.xml
		<!-- Feign依賴 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>
  • 創建Feign接口
@Component
@FeignClient(value = "pro_user") //value:微服務名稱
public interface IUserService {

    @GetMapping("/api/user/add")
    public boolean addUser(User user);

    @GetMapping("/api/user/query/{id}")
    public User queryUserById(@PathVariable("id")Long id);

    @GetMapping("/api/user/query")
    public List<User> queryUserList();


}
  • 消費者調用
-`@RestController
public class UserController {

    @Qualifier("IUserService")
    @Autowired
    private IUserService userService = null;

    @RequestMapping("/con/user/{id}")
    public User getser(@PathVariable("id") long id){
         return this.userService.queryUserById(id);
    }

    @RequestMapping("/con/user/save")
    public boolean saveUser(String username,String pass){
        User u = new User();
        u.setUsername(username).setPass(pass);
        return this.userService.addUser(u);
    }

    @RequestMapping("/query")
    public List<User> queryAllUser(){
        return this.userService.queryUserList();
    }

}`
  • 修改啓動類,添加Feign
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.fyy"})
public class FeignConApplication {

    public static void main(String[] args) {
        SpringApplication.run(FeignConApplication.class,args);
    }

}

至此我們就完成了Feign的集成配置,是不是感覺更像我們平常開發中使用的方式呢。這就是Feign的特點

4)FeignClient註解的一些屬性

屬性名 默認值 作用 備註
value 調用服務名稱與name屬性相同
serviceId 調用服務ID 已過期
name 調用服務名稱與value屬性相同
url 全路徑地址或hostname,http或https可選
decode404 false 配置響應狀態碼爲404時是否應該拋出FeignExceptions
configuration {} 自定義當前feign client的一些配置 參考FeignClientsConfiguration
fallback void.class 熔斷機制,調用失敗時,走的一些回退方法,可以用來拋出異常或給出默認返回數據 底層依賴hystrix,啓動類要加上@EnableHystrix
path 自動給所有方法的requestMapping前加上前綴,類似與controller類上的requestMapping
primary true

5)Feign配置詳解

feign:
  client:
    config:
      default:
        connectTimeout: 5000 #連接時間
        readTimeout: 5000 #讀時
        loggerLevel: basic  #日誌
  okhttp:
    enabled: true #開啓OKhttp來發送請求,默認是使用jdk中的HttpURLConnection發送HTTP請求
  hystrix:
    enabled: true #開啓熔斷機制,調用失敗時,走的一些回退方法
  compression:
    request: #請求
      enabled: true #開啓
      mime-types: text/xml,application/xml,application/json #開啓支持壓縮的MIME TYPE
      min-request-size: 2048 #配置壓縮數據大小的下限
    response: #響應
      enabled: true #開啓響應GZIP壓縮

由於開啓GZIP壓縮之後,Feign之間的調用數據通過二進制協議進行傳輸,返回值需要修改爲ResponseEntity<byte[]>纔可以正常顯示,否則會導致服務之間的調用亂碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章