微服務入門之Ribbon+OpenFeign

来源:https://www.cnblogs.com/lovexiao/archive/2022/05/19/16287992.html
-Advertisement-
Play Games

#一、概述 ##1.1、Ribbon Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端負載均衡的工具。簡單的說,Ribbon是Netflix發佈的開源項目,主要功能是提供客戶端的軟體負載均衡演算法和服務調用。Spring Cloud Ribbon雖然只是一個工具 ...


一、概述

1.1、Ribbon

Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端負載均衡的工具。簡單的說,Ribbon是Netflix發佈的開源項目,主要功能是提供客戶端的軟體負載均衡演算法和服務調用。Spring Cloud Ribbon雖然只是一個工具類框架,它不像服務註冊中心、配置中心、API網關那樣需要獨立部署,但是它幾乎存在於每一個Spring Cloud構建的微服務和基礎設施中。但是Ribbon已經進入了維護模式。後續我們將要介紹的Feign,它也是基於Ribbon實現的工具。所以,對Spring Cloud Ribbon的理解和使用,對於我們使用Spring Cloud來構建微服務非常重要。
官網地址 >> https://github.com/Netflix/ribbon/wiki/Getting-Started
spring-cloud-starter-netflix-eureka-client自帶了spring-cloud-starter-ribbon引用

1.2、Feign

Feign是聲明式的web service客戶端,它讓微服務的調用變得更簡單了,類似Controller調用service。SpringCloud集成了Ribbon和Eureka,可在使用Feign時提供負載均衡的http客戶端。只需要創建一個介面,然後添加註解即可!

二、負載均衡

2.1、Ribbon核心組件

IRule:根據特定演算法從服務列表中選取一個要訪問的服務。

  • com.netflix.loadbalancer.RoundRobinRule 輪詢
  • com.netflix.loadbalancer.RandomRule 隨機
  • com.netflix.loadbalancer.RetryRule 先按照RoundRobinRule的策略獲取服務,如果獲取服務失敗則在指定時間內會進行重試
  • WeightedResponseTimeRule 對RoundRobinRule的擴展,響應速度越快的實例選擇權重越大,越容易被選擇
  • BestAvailableRule 會先過濾掉由於多次訪問故障而處於斷路器跳閘狀態的服務,然後選擇一個併發量最小的服務
  • AvailabilityFilteringRule 先過濾掉故障實例,再選擇併發較小的實例
  • ZoneAvoidanceRule 預設規則,複合判斷server所在區域的性能和server的可用性選擇伺服器

2.2、替換Ribbon的負載均衡規則

2.2.1 首先,在主啟動類的上一級目錄創建一個myrule包,用於存放我們的rule配置。

2.2.2 創建一個MyRuleConfig 類,並new 一個新的IRule 實例Bean。

package com.cpown.myrule;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.RandomRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 創建新的ruleBean
 * create by c-pown on
 */
@Configuration
public class MyRuleConfig {
    @Bean
    public IRule iRule(){
        return new RandomRule();
    }
}

2.2.3 在主啟動類添加 @RibbonClient註解 指定我們需要應用自定義負載均衡演算法的微服務名稱,以及演算法類class;

package com.atguigu.springcloud;

import com.atguigu.myrule.MySelfRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;

/**
 * @auther zzyy
 * @create 2020-01-28 16:18
 * 在啟動該微服務的時候就能去載入我們的自定義Ribbon配置類,從而使配置生效,形如:
 */
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE",configuration=MySelfRule.class)
public class OrderMain80
{
    public static void main(String[] args)
    {
        SpringApplication.run(OrderMain80.class,args);
    }
}

啟動項目即可實現替換的負載均衡演算法了。
輪詢負載均衡演算法:rest介面第幾次請求數 % 伺服器集群總數量 = 實際調用伺服器位置下標 ,每次服務重啟動後rest介面計數從1開始。

三、OpenFeign

3.1、OpenFeign使用步驟

1、新建cloud-consumer-feign-order80
2、POM

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>mscloud03</artifactId>
        <groupId>com.atguigu.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-consumer-feign-order80</artifactId>

    <dependencies>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- 引入自己定義的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--一般基礎通用配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

3、YML

server:
  port: 80

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

4、業務類
業務邏輯介面+@FeignClient配置調用provider服務,
新建PaymentFeignService介面並新增註解@FeignClient

package com.atguigu.springcloud.service;

import com.atguigu.springcloud.entities.CommonResult;
import com.atguigu.springcloud.entities.Payment;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @auther zzyy
 * @create 2020-02-03 12:00
 */
@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE")
public interface PaymentFeignService
{
    @GetMapping(value = "/payment/get/{id}")
    CommonResult<Payment> getPaymentById(@PathVariable("id") Long id);
}

5、小總結
openfeign的實現原理:基於@EnableFeignClients 將所有被@FeignClient註解的類 註冊到容器中。當這些被@FeignClient註解的類被調用時會創建一個動態代理的對象為我們創建被調用類的實例,然後都會被統一轉發給 Feign 框架所定義的一個 InvocationHandler , 由該 Handler 完成後續的 HTTP 轉換, 發送, 接收, 翻譯HTTP響應的工作。

3.2、OpenFeign超時控制

預設Feign客戶端只等待一秒鐘,但是服務端處理需要超過1秒鐘,導致Feign客戶端不想等待了,直接返回報錯。為了避免這樣的情況,有時候我們需要設置Feign客戶端的超時控制。

server:
  port: 80

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

#設置feign客戶端超時時間(OpenFeign預設支持ribbon)
ribbon:
#指的是建立連接所用的時間,適用於網路狀況正常的情況下,兩端連接所用的時間
  ReadTimeout: 5000
#指的是建立連接後從伺服器讀取到可用資源所用的時間
  ConnectTimeout: 5000

3.3、OpenFeign日誌列印功能

Feign 提供了日誌列印功能,我們可以通過配置來調整日誌級別,從而瞭解 Feign 中 Http 請求的細節。說白了就是對Feign介面的調用情況進行監控和輸出

日誌級別:

  1. NONE:預設的,不顯示任何日誌;
  2. BASIC:僅記錄請求方法、URL、響應狀態碼及執行時間;
  3. HEADERS:除了 BASIC 中定義的信息之外,還有請求和響應的頭信息;
  4. FULL:除了 HEADERS 中定義的信息之外,還有請求和響應的正文及元數據。

日誌配置類:

 
package com.atguigu.springcloud.cfgbeans;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import feign.Logger;

/**
 * @auther LayTao
 * @create 2019-11-10 17:00
 */
@Configuration
public class FeignConfig
{
    @Bean
    Logger.Level feignLoggerLevel()
    {
        return Logger.Level.FULL;
    }
}
# YML文件里需要開啟日誌的Feign客戶端
logging:
  level:
    # feign日誌以什麼級別監控哪個介面
    com.atguigu.springcloud.service.PaymentFeignService: debug


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 卸載redis # 查詢redis進程 ps -ef | grep redis # 關閉進程 kill -9 6379 # 停止redis-cli redis-cli shutdown # 刪除local目錄下與redis相關的文件 rm -rf /usr/local/bin/redis-* 安裝r ...
  • 異常 異常定義 異常是運行過程中出現的錯誤 人為錯誤:填寫錯誤等 隨機錯誤:網路中斷、記憶體耗盡等 一個健壯的程式必須處理各種各樣的錯誤 Java的異常是class Object Throwable Error OutOfMemoryError Exception RuntimeException N ...
  • 一、反射 《java核心技術》 官方套話:能夠分析類能力的程式成為反射。 又通過網上搜索有這句話:反射指程式可以訪問、檢測和修改它本身狀態或行為的一種能力。 反射是用來乾什麼的呢? “明明我自己能直接new一個對象,為什麼它要繞一個圈子,先拿到Class對象,再調用Class對象的方法來創建對象呢, ...
  • #包機制 包就是裝代碼的文件夾。 為了更好地組織類,JAVA提供了包機制,用於區別類名的組織空間。 ##package 包語句的句法格式為: 一般利用公司功能變數名稱倒置作為包名。 ##import 為了使用某個包的成員,需要在JAVA程式中明確導入該包。使用import語句可以完成此功能。 import必 ...
  • 轉自:https://www.evanlin.com/maglev/ 2016 年 6 月 2 日 前言(為什麼想讀這一篇論文) 這一篇論文吸引我註意的原因是,Consistent Hashing本來的特性就是作為分散式緩存之用。谷歌將他們的負載均衡器(代號:Maglev)發佈他的實作方式,裡面將一 ...
  • 文章已收錄至https://lichong.work,轉載請註明原文鏈接。 ps:歡迎關註公眾號“Fun肆編程”或添加我的私人微信交流經驗🤝 一.Nginx安裝配置及常用命令 1.環境搭建 首先在linux系統下安裝gcc編譯環境,執行: yum install gcc-c++ -y 確保當前系統 ...
  • 來源:blog.csdn.net/qq_15371293/article/details/117090780 項目場景: ClickHouse 操作基於 Mybatis-puls源碼擴展開發。解決ClickHouse的修改和刪除 SQL操作與Mysql不相同。 基於 Mybatis-puls: up ...
  • 個人學習筆記總結。Basic Types、Strings、Arrays, Slices, and Maps、Control Statements、Declarations & Types、Formatted & File I/O、 Functions, Parameters、Defer、Closur... ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...