Java Ribbon與openfeign區別和用法講解

Ribbon 本地負載均衡器

在SpringCloud第一代中使用Ribbon、SpringCloud第二代中直接采用自研發 loadbalancer 即可,默認使用的Ribbon。

本地負載均衡與Nginx 的區別

本地負載均衡器基本的概念:我們的消費者服務從我們的註冊中心獲取到集群地址列表,緩存到本地,讓後本地采用負載均衡策略(輪訓、隨機、權重、hash一致性等),獲取接口列表地址,采用算法獲取選擇一個接口地址實現本地的rpc遠程的。本地負載均衡器是從註冊中心獲取到集群地址列表,本地實現負載均衡算法,既本地負載均衡器。

Nginx是客戶端所有的請求統一都交給我們的Nginx處理,讓後在由Nginx實現負載均衡轉發,屬於服務器端負載均衡器。

應用場景:

Nginx屬於服務器負載均衡,應用於Tomcat/Jetty服務器等,而我們的本地負載均衡器,屬於客戶端負載均衡,應用於在微服務架構中rpc框架中,rest、openfeign、dubbo。

基本使用

註入 restTemplate,加上 @LoadBalanced 註解。

@Bean("restTemplate")
@LoadBalanced // 實現本地的負載均衡
public RestTemplate restTemplate(){
    return new RestTemplate();
}

請求路徑上可以換成服務的名稱

@RequestMapping("/orderToMember")
public String orderToMember() {
     // 使用本地rest形式實現rpc調用
     String result = restTemplate.getForObject("http://kaico-member/getUser", String.class);
     return "訂單調用會員獲取結果:" + result;
 }

使用 loadBalancerClient 實現負載均衡

@RequestMapping("/orderToMember")
public String orderToMember() {
    // 使用本地rest形式實現rpc調用
    ServiceInstance choose = loadBalancerClient.choose("kaico-member");
    return "獲取結果:" + choose;
}

原理分析

ServiceInstance choose = loadBalancerClient.choose(“kaico-member”); 從這行代碼分析,

客戶端負載均衡器源碼:

根據serviceId獲取服務

可以支持的算法:默認是輪訓

openfeign

openFeign是一個Web聲明式的Http客戶端調用工具,提供接口和註解形式調用。

openfeign客戶端作用:是一個Web聲明式的Http客戶端遠程遠程調用工具,底層是封裝 HttpClient 技術。

openfeign屬於 SpringCloud 自己研發,而 feign 是 netflix 研發的。

基本使用

提供服務方

接口

public interface MenberService {
    /**
     * 提供會員接口
     *
     * @param userId
     * @return
     */
    @GetMapping("/getUser")
    String getUser(@RequestParam("userId") Long userId);
}

接口的實現類

@RestController
public class MenberServiceImpl  implements MenberService {
    @Value("${server.port}")
    private String serverPort;
    @Override
    public String getUser(Long userId) {
        return "我是會員服務端口號為:" + serverPort;
    }
}

此時,服務方提供的接口已經準備好瞭

接下來編寫接口調用方的代碼:

1、引入maven 依賴

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>2.0.0.RELEASE</version>
</dependency>

2、啟動類上開啟openfeign 註解:@EnableFeignClients

3、編寫 feignClient 接口

@FeignClient(name = "kaico-member")
public interface MenberServiceFeign{
    /**
     * 提供會員接口
     *
     * @param userId
     * @return
     */
    @GetMapping("/getUser")
    String getUser(@RequestParam("userId") Long userId);
}

4、直接調用 MenberServiceFeign 接口的方法

@Autowired
private MenberServiceFeign menberServiceFeign;
@RequestMapping("/orderToMember")
public String orderToMember() {
    //測試openfeign 調用接口
    String user = menberServiceFeign.getUser(1L);
    return "獲取結果:" + user;
}

總結:調用方在編寫feignClient 接口代碼時,隻要方法代碼和註解和提供方法接口代碼一致即可,不要求類的全路徑名稱一致。然後在接口類上加上註解@FeignClient(name = “kaico-member”)並指定服務名稱。openfeign默認是支持負載均衡:輪訓算法(ribbon)

微服務的服務名稱不能有下劃線。

到此這篇關於Java Ribbon與openfeign區別和用法講解的文章就介紹到這瞭,更多相關Java Ribbon與openfeign內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: