springCloud負載均衡Ribbon和Feign的區別


1、什么是負載均衡:

   負載均衡(Load Balance)是分布式系統架構設計中必須考慮的因素之一,它通常是指,將請求/數據【均勻】分攤到多個操作單元上執行,負載均衡的關鍵在於【均勻】。

2、常見的負載均衡方案:

    1、正向代理:

   正向代理 是一個位於客戶端和原始服務器(origin server)之間的服務器,為了從原始服務器取得內容,客戶端向代理發送一個請求並指定目標(原始服務器),然后代理向原始服務器轉交請求並將獲得的內容返回給客戶端。客戶端必須要進行一些特別的設置才能使用正向代理。

          比如: 我是一個用戶,我訪問不了某網站,但是我能訪問一個代理服務器,這個代理服務器呢,他能訪問那個我不能訪問的網站,於是我先連上代理服務器,告訴他我需要那個無法訪問網站的內容,代理服務器去取回來,然后返回給我。從網站的角度,只在代理服務器來取內容的時候有一次記錄,有時候並不知道是用戶的請求,也隱藏了用戶的資料,這取決於代理告不告訴網站。

  用途:

    (1)訪問原來無法訪問的資源,如google(VPN)

 

    (2) 可以做緩存,加速訪問資源

 

 (3)對客戶端訪問授權,上網進行認證

 

 (4)代理可以記錄用戶訪問記錄(上網行為管理),對外隱藏用戶信息

 

  2、反代理:

      反向代理(Reverse Proxy)實際運行方式是指以代理服務器來接受internet上的連接請求,然后將請求轉發給內部網絡上的服務器,並將從服務器上得到的結果返回給internet上請求連接的客戶端,此時代理服務器對外就表現為一個服務器。

    比如:我要訪問localhost:8080/xxx/view這個頁面,但是xxx對應的服務器並沒有view這個資源,它是從另一台服務器上調用這個資源,這樣的vies對應的那個服務器就使用了反向代理服務器,具體請求是由服務器統一處理的,用戶並不需要知道。

  用途:

(1)保證內網的安全,可以使用反向代理提供WAF功能,阻止web攻擊

         大型網站,通常將反向代理作為公網訪問地址,Web服務器是內網。

(2)負載均衡,通過反向代理服務器來優化網站的負載

3、spring cloud的 Netflix ribbon 和 feign 的區別:

      Ribbon:Ribbon 是一個基於 HTTP 和 TCP 客戶端的負載均衡器它可以在客戶端配置 ribbonServerList(服務端列表),然后輪詢請求以實現均衡負載它在聯合 Eureka 使用時ribbonServerList 會被 DiscoveryEnabledNIWSServerList 重寫,擴展成從 Eureka 注冊中心獲取服務端列表同時它也會用 NIWSDiscoveryPing 來取代 IPing,它將職責委托給 Eureka 來確定服務端是否已經啟動。 使用 HttpClient 或 RestTemplate 模擬http請求,步驟相當繁瑣。

     用法: 

 RestTemplate注入到容器中,@LoadBalanced注解使用默認負載均衡算法(可以使用自定義)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableDiscoveryClient
public class HelloworldApplication {

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

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

     用 REST_URL_PREFIX 指定請求地址 , 使用 restTemplate 模擬 http 請求。@RestController

public class DeptController_Consumer {
    
//注冊中心請求的地址
private static final String REST_URL_PREFIX = "http://MICROSERVICECLOUD-DEPT"; @Autowired private RestTemplate restTemplate; @RequestMapping(value = "/consumer/dept/add") public boolean add(Dept dept) {
return restTemplate.postForObject(REST_URL_PREFIX + "/dept/add", dept, Boolean.class); } @RequestMapping(value = "/consumer/dept/get/{id}") public Dept get(@PathVariable("id") Long id) { return restTemplate.getForObject(REST_URL_PREFIX + "/dept/get/" + id, Dept.class); } @RequestMapping(value = "/consumer/dept/list") public List<Dept> list() { return restTemplate.getForObject(REST_URL_PREFIX + "/dept/list", List.class); } }

     Feign:

Feign 是在 Ribbon的基礎上進行了一次改進,是一個使用起來更加方便的 HTTP 客戶端。采用接口的方式, 只需要創建一個接口,面向接口;然后在上面添加注解即可 ,將需要調用的其他服務的方法定義成抽象方法即可, 不需要自己構建http請求。然后就像是調用自身工程的方法調用,而感覺不到是調用遠程方法,使得編寫 客戶端變得非常容易。類似於 mybatis 的 @Mapper注解 。

      用法:

      在 api 工程 定義一個接口API,
     a) 添加@FeignClient 注解,指定微服務名稱 MICROSERVICECLOUD-DEPT
   
  b) 指定請求地址 @RequestMapping

@FeignClient(value = "MICROSERVICECLOUD-DEPT")
public interface DeptClientService {
    
    @RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
    public Dept get(@PathVariable("id") long id);

    @RequestMapping(value = "/dept/list", method = RequestMethod.GET)
    public List<Dept> list();

    @RequestMapping(value = "/dept/add", method = RequestMethod.POST)
    public boolean add(Dept dept);
}

在 客戶端的工程 引入 DeptClientService 接口,調用對應的方法。DeptClientService 類似於 mybatis的@Mappper 注解

@RestController
public class DeptController_Consumer {

    @Autowired
    private DeptClientService service = null;

    @RequestMapping(value = "/consumer/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id) {
        return this.service.get(id);
    }

    @RequestMapping(value = "/consumer/dept/list")
    public List<Dept> list() {
        return this.service.list();
    }

    @RequestMapping(value = "/consumer/dept/add")
    public Object add(Dept dept) {
        return this.service.add(dept);
    }
}

application.yml

server:
  port: 80
  
eureka:
  client:
    register-with-eureka: false
    service-url: 
      defaultZone: http://eurekaHostIP1:7001/eureka/,http://eurekaHostIP2:7002/eureka/,http://eurekaHostIP3:7003/eureka/  


免責聲明!

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



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