【spring cloud】(三)服務調用——Ribbon、OpenFeign

在這里插入圖片描述

??各位小伙伴們大家好,歡迎來到這個小扎扎的spring cloud專欄,在這個系列專欄中我對B站尚硅谷陽哥的spring cloud教程進行一個總結,鑒于 看到就是學到、學到就是賺到 精神,這波依然是血賺 ┗|`O′|┛

💡服務調用知識點速覽

  • 🍑 Ribbon
    • 🍏 初識Ribbon
      • 🥭 Ribbon是什么?
      • 🥭 Ribbon能干什么?
    • 🍏 使用Ribbon實現負載均衡
      • 🥭 RestTemplate三步走
      • 🥭 負載均衡算法
  • 🍑 OpenFeign
    • 🍏 初識OpenFeign
      • 🥭 什么是OpenFeign?
      • 🥭 如何使用OpenFeign?
    • 🍏 OpenFeign超時控制
    • 🍏 OpenFeign日志打印

🍑 Ribbon

🍏 初識Ribbon

🥭 Ribbon是什么?

??Ribbon是Netflix發布的開源項目,主要功能是提供對客戶端進行負載均衡算法的一套工具,將Netflix的中間層服務連接在一起。Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出Load Balancer(簡稱LB)后面所有的機器,Ribbon會自動的幫助你基于某種規則(如簡單輪詢,隨即連接等)去連接這些機器。我們也可以使用Ribbon實現自定義的負載均衡算法。

🥭 Ribbon能干什么?

??前面提到說Ribbon的作用就是向客戶端提供負載均衡算法的工具,那么什么是負載均衡呢?負載均衡就是將用戶發來的請求通過算法均攤到多個服務上,從而達到系統的HA(高可用性)

??其中,負載均衡又可分為本地負載均衡(進程內LB)和服務端負載均衡(集中式LB),服務端負載均衡以Nginx為例,用戶的所有請求都會交給Nginx,由其決定請求將被轉發到哪個服務器;Ribbon是本地負載均衡,在調用接口的時候從 eureka 注冊中心服務器端上獲取服務注冊信息列表緩存到本地,從而可以在本地實現RPC遠程調用服務

🍏 使用Ribbon實現負載均衡

??實際上Ribbon可以簡單的理解為負載均衡算法 + RestTemplate的調用,也就是說想要使用Ribbon實現負載均衡,就可以通過這兩個技術加以實現。

🥭 RestTemplate三步走

??第一步: 引入Ribbon場景啟動器依賴,但是之前使用eureka的時候我們在pom文件中導入過netflix-eureka-server的依賴,其中就默認引入了ribbon的場景啟動器依賴(netflix-eureka-client也會默認導入),如果再引一次也可以,但是真沒那必要。在這里插入圖片描述
??第二步: 使用配置文件開啟 RestTemplate

/*** @ClassName: ApplicationContextConfig* @Description: 程序配置類,用于開啟RestTemplate服務,以供后面使用* @author: chenhao* @date: 2022/7/17*/
@Configuration
public class ApplicationContextConfig {@Bean@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}

??第三步: 使用RestTemplate的API實現負載均衡,RestTemplate的API根據請求方式的不同可以被分為get和post,根據返回類型又可以分為Object(響應體轉化成的json串)和Entity(響應的重要信息,包括響應頭、狀態碼、響應體等,可以使用對應的get方法獲取到值),所以說最主要的四個API是getForObject、postForObject、getForEntity、postForEntity,這里我把四種API的使用方法都向大家介紹一下

@RestController
@Slf4j
@RequestMapping("consumer")
@Api("消費者的訂單管理類")
public class OrderController {// 先注入RestTemplate對象@Resourceprivate RestTemplate restTemplate;// 使用API實現負載均衡@ApiOperation(value = "創建一條支付記錄", tags = ApiVersionConstant.v1_0)@PostMapping(value = "/payment/create", produces = {"application/json;charset=UTF-8"})public CommonResult<Integer> create(@RequestBody Payment payment) {return restTemplate.postForObject(UrlConstant.CLUSTER_PAYMENT_URL + "/payment/create", payment, CommonResult.class);}@ApiOperation(value = "根據ID查詢支付記錄", tags = ApiVersionConstant.v1_0)@GetMapping(value = "/payment/get/{id}", produces = {"application/json;charset=UTF-8"})public CommonResult<Payment> getPayment(@PathVariable("id") Integer id) {return restTemplate.getForObject(UrlConstant.CLUSTER_PAYMENT_URL + "/payment/get/" + id, CommonResult.class);}@ApiOperation(value = "根據ID查詢支付記錄Entity", tags = ApiVersionConstant.v1_0)@GetMapping(value = "/payment/getForEntity/{id}", produces = {"application/json;charset=UTF-8"})public CommonResult<Payment> getPaymentEntity(@PathVariable("id") Integer id) {ResponseEntity<CommonResult> entity = restTemplate.getForEntity(UrlConstant.CLUSTER_PAYMENT_URL + "/payment/get/" + id, CommonResult.class);if (entity.getStatusCode().is2xxSuccessful()) {return entity.getBody();} else {return new CommonResult<>(444, "操作失敗");}}@ApiOperation(value = "創建一條支付記錄Entity", tags = ApiVersionConstant.v1_0)@PostMapping(value = "/payment/createEntity", produces = {"application/json;charset=UTF-8"})public CommonResult<Integer> createEntity(@RequestBody Payment payment) {return restTemplate.postForEntity(UrlConstant.CLUSTER_PAYMENT_URL + "/payment/create", payment, CommonResult.class).getBody();}
}

🥭 負載均衡算法

??經過我們上面的嘗試,不難發現使用RestTemplate實現的負載均衡算法是輪詢機制,實際上IRule中不僅僅只提供了一種算法在這里插入圖片描述
IRule實現算法切換

??第一步: 新建一個package,在官方文檔中聲明了IRule的配置類不能放到@ComponentScan注解所能掃描到的當前包以及子包下,否則自定義的配置類就會被Ribbon的所有客戶端所共享,以至于失去客戶端定制化的可能性。主程序入口上的@SpringBootApplication注解是復合注解,其中就包含@ComponentScan注解,而且是直接掃描主程序入口所在的當前包以及子包,也就是說配置類必須放到主程序入口之外的包下,于是需要新建一個package

??第二步: 在新建的包中新建一個MySelfRule規則類,用于設置輪詢算法,如果不設置的話就默認為輪詢

@Configuration
public class MySelfRule {@Beanpublic IRule myRule() {// 修改輪詢算法為隨機算法return new RandomRule();}
}

??第三步: 主啟動類上使用@RibbonClient(name = “CLOUD-PAYMENT-SERVICE”, configuration = MySelfRule.class)注解,用于指定應用服務和自定義算法規則的配置類

@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "CLOUD-PAYMENT-SERVICE", configuration = MySelfRule.class)
public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class, args);}
}

輪詢算法

??所謂的輪詢算法就是根據所有的服務,依次將請求均攤到所有的服務依次訪問,它的算法實現就是用RestTemplate接收到的請求數量對服務器集群的數量進行取模運算,余數就是服務在服務列表中對應的索引位置,所以說可以實現輪詢。但是如果中途服務器關掉的話接收到的請求數量就會從1重新計數

🍑 OpenFeign

🍏 初識OpenFeign

🥭 什么是OpenFeign?

??openFeign是要聲明式的web服務客戶端,或叫做聲明式REST客戶端,它讓編寫web服務客戶端變得簡單。它將提供者的restful服務偽裝成接口進行消費,消費者只需要通過feign接口+注解就可以直接調用提供者的服務接口,也就是可以實現接口對接口的調用,而無需像ribbon一樣通過restTemplate方式對提供者的服務進行調用

??值得注意的一點是,openFeign內置了負載均衡器-Ribbon,所以說openfeign也可以使用負載均衡算法在這里插入圖片描述

🥭 如何使用OpenFeign?

??第一步: 引入相關依賴

<!--openfeign-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

??第二步: 配置配置文件,只是基本配置和注冊,沒有OpenFeign獨有的配置

server:port: 80eureka:client:register-with-eureka: falseservice-url:#服務端的地址,服務端為集群版,向所有的模塊都注冊defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka

??第三步: 主啟動類開啟OpenFeign客戶端

@SpringBootApplication
@EnableFeignClients
public class OrderFeignMain80 {public static void main(String[] args) {SpringApplication.run(OrderFeignMain80.class, args);}
}

??第四步: 之前使用ribbon是直接在controller里調用payment服務的controller,但是openfeign則是通過service調用,于是第三步就是創建一個service接口用于調用payment服務的接口

@Component
@FeignClient(value = "CLOUD-PAYMENT-SERVICE") // 用于指定服務名,可在eureka或者服務的配置文件中查看
public interface PaymentFeignService {@GetMapping(value = "/payment/get/{id}", produces = {"application/json;charset=UTF-8"})CommonResult<Payment> getPaymentById(@PathVariable("id") Integer id);
}

??第五步: controller層調用service接口

@RestController
@RequestMapping("consumer")
public class OrderFeignController {@Autowiredprivate PaymentFeignService paymentFeignService;@GetMapping(value = "/payment/get/{id}", produces = {"application/json;charset=UTF-8"})public CommonResult<Payment> getPaymentById(@PathVariable("id") Integer id) {return paymentFeignService.getPaymentById(id);}
}

??如此操作也可實現order服務對payment服務的調用,而且由于OpenFeign默認引入Ribbon,去進行order服務訪問的時候,后端會默認輪詢名為是“CLOUD-PAYMENT-SERVICE”的微服務,也就是兩個payment服務

🍏 OpenFeign超時控制

??使用OpenFeign調用服務接口,默認等待時間為1秒,超時就會直接報錯。如果有些服務的調用確實會花費超過1s的時間,就需要我們在服務調用方(也就是order服務)的配置文件中進行配置
??由于OpenFeign的超時控制由其底層的ribbon實現,于是配置文件中的超時控制也由ribbon進行配置

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

🍏 OpenFeign日志打印

??OpenFeign提供了日志打印的功能,我們可以通過日志的打印監控接口的調用情況,從而了解接口調用時HTTP請求的具體細節,具體的使用分
??第一步: 使用配置類配置日志級別

@Configuration
public class FeignConfig {/*** 日志級別* NONE:默認的,不顯示任何日志* BASIC:僅記錄請求方法、URL、響應狀態碼以及執行時間* HEADERS:請求方法、URL、響應狀態碼、執行時間、請求和響應的頭信息* FULL:請求方法、URL、響應狀態碼、執行時間、請求和響應的頭信息、正文以及元數據*/@BeanLogger.Level feignLoggerLevel() {return Logger.Level.FULL;}
}

??第二步: 配置文件開啟日志打印,并指定監控的接口和級別

logging:level:# feign日志以 debug 級別監控 com.atguigu.springcloud.service.PaymentFeignService 接口com.xiaochen.springcloud.service.PaymentFeignService: debug

打印出來的日志如下:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534981.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534981.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534981.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言斐波那契數列_劍指Offer-10-I.斐波那契數列

題目題目描述寫一個函數&#xff0c;輸入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;數列的第 n 項。斐波那契數列的定義如下&#xff1a; F(0) 0, F(1) 1F(N) F(N - 1) F(N - 2), 其中 N > 1. 斐波那契數列由 0 和 1 開始&#xff0c;之后的斐波那契數…

mysql 導入 mssql_MySQL(csv,text)導入mssql使用方法

MySQL(csv,text)導入mssql是非常的簡單了但是在導入過程中會碰到text字段問題了&#xff0c;下面我們就來看一篇關于MySQL(csv,text)導入mssql使用方法吧&#xff0c;具體的操作細節如下所示。分兩步處理&#xff0c;第一步是將csv導入到mysql。沒有使用mssql自帶客戶端的導入功…

c# mvvm模式獲取當前窗口_AWTK-MVVM 介紹

MVVM(Model-View-ViewModel)介紹8.1 分離用戶界面和業務邏輯在開發應用程序時&#xff0c;要把用戶界面和業務邏輯分離開來&#xff0c;這是每個程序員都知道的常識。分離用戶界面和業務邏輯有幾個重要的好處&#xff1a;有利于隔離變化。用戶界面是最容易變化的&#xff0c;易…

【spring cloud】(三)服務降級——Hystrix

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的spring cloud專欄&#xff0c;在這個系列專欄中我對B站尚硅谷陽哥的spring cloud教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;服務…

mysql高級查詢教程_MYSQL高級查詢

實際開發中&#xff0c;經常需要對某些數據進行統計&#xff0c;比如&#xff0c;統計某個字段的最大值、最小值、平均值等。MySQL中&#xff0c;提供了一些函數來實現這些功能聚合函數COUNT()——返回某列的行數SUM()——返回某列值的和AVG()——返回某列的平均值MAX()——返回…

【dubbo】(一) dubbo是什么?

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的dubbo專欄&#xff0c;在這個系列專欄中我對B站尚硅谷雷神的dubbo教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;dubbo知識點速覽&a…

axios安裝_Vue腳手架安裝,與基本語法(干貨)

首先&#xff0c;這篇Vue文章是為了下一篇我整合springbootvue前后分離的小demo&#xff0c;這兩天整理好會上傳哈哈1. Node.js安裝1.1 下載安裝在node.js 官網下載&#xff0c; 根據自己電腦系統安裝&#xff0c;一直點下一步即可1.2 測試安裝是否成功WindowsR打開cmd窗口&…

mysql port range_MySQL 數據庫常見調優方法及參數設置_MySQL

1. 關閉 SELinuxvim /etc/selinux/config 更改 SELINUXenforcing 為 SELINUXdisabled2. 更改 IO Schedule, 對于 SSD 硬盤無需更改echo deadline > /sys/block/sda/queue/scheduler3. 更改 ulimitvim /etc/security/limits.conf* soft nofile 65535* hard nofile 65535roo…

base64 能放數組里面么_數組:總結篇

我們做個總結吧數組理論基礎數組是非常基礎的數據結構&#xff0c;在面試中&#xff0c;考察數組的題目一般在思維上都不難&#xff0c;主要是考察對代碼的掌控能力也就是說&#xff0c;想法很簡單&#xff0c;但實現起來 可能就不是那么回事了。首先要知道數組在內存中的存儲方…

xampp mysql 卸載_卸載Xampp并安裝apache + mysql + php 過程

首先是卸載xampp&#xff0c;打開xampp-control.exe 控制面板&#xff0c;停止apache和mysql服務。如果你是安裝版xampp&#xff0c;可以到如果不是則安裝如下方法。停止服務之后。就需要卸載服務。打開cmd&#xff0c;用sc.exe這個Windows命令開始——運行——cmd.exe&#xf…

python判斷正確錯誤_python錯誤和異常

Python3 錯誤和異常 作為 Python 初學者&#xff0c;在剛學習 Python 編程時&#xff0c;經常會看到一些報錯信息&#xff0c;在前面我們沒有提及&#xff0c;這章節我們會專門介紹。 Python 有兩種錯誤很容易辨認&#xff1a;語法錯誤和異常。 Python assert&#xff08;斷言&…

nodejs mysql 返回json_python向mysql中存儲JSON及Nodejs取出

雖然把JSON數據存入mysql也是比較蛋疼&#xff0c;但是相比使用Nodejs嵌套處理多個mysql查詢并拼接返回數據也算是沒mongo時的一個折中方案了。我使用python拼接了一個json格式的字符串&#xff0c;卻遇到了一些問題1&#xff0c;如果把json數據轉成str存入&#xff0c;那么nod…

17個常用經典數據可視化圖表與冷門圖表

數據可視化是創建信息圖形表示的過程。隨著可視化技術的飛速發展&#xff0c;可以利用強大的可視化工具選擇合適的數據可視化圖表來展示數據。以下專業人士都應該知道的一些最重要的數據可視化圖表。 常見數據可視化圖表 餅圖 餅圖是最常見和最基本的數據可視化圖表之一。餅圖…

python keyerror_盤點Python 初學者最容易犯的10大錯誤!你中招了嗎?

對于新手&#xff0c;初學Python時&#xff0c;總會遇到這樣那樣的報錯&#xff0c;想要弄懂Python錯誤信息的含義可能還不知道怎么做&#xff0c;這里列出了一些比較常見的Python報錯問題&#xff0c;希望對于學習Python的人能夠有些幫助。發現有很多想要學習Python卻不知道如…

mysql index sub part_mysql中的key和index 理解

mysql的key和index多少有點令人迷惑&#xff0c;這實際上考察對數據庫體系結構的了解的。1 key 是數據庫的物理結構&#xff0c;它包含兩層意義&#xff0c;一是約束(偏重于約束和規范數據庫的結構完整性)&#xff0c;二是索引(輔助查詢用的)。包括primary key, unique key, fo…

【spring cloud】(六)消息總線——springcloud Bus

各位小伙伴們大家好&#xff0c;歡迎來到這個小扎扎的spring cloud專欄&#xff0c;在這個系列專欄中我對B站尚硅谷陽哥的spring cloud教程進行一個總結&#xff0c;鑒于 看到就是學到、學到就是賺到 精神&#xff0c;這波依然是血賺 ┗|&#xff40;O′|┛ &#x1f4a1;Bus…

python快速排序代碼_Python實現快速排序算法

原標題&#xff1a;Python實現快速排序算法 Python實現快速排序算法 快速排序算法是一種基于交換的高效的排序算法&#xff0c;由C.R.A.Hoare于1962年提出&#xff0c;是一種劃分交換排序。它采用了一種分治的策略&#xff0c;通常稱其為分治法(Divide and conquer algorithm)。…

docker mysql 生產環境_如何部署Docker MySQL生產環境?

1 前言Docker容器原則上是短暫的&#xff0c;如果容器被刪除或損毀&#xff0c;數據或配置將丟失&#xff0c;所以上個章節部署的MySQL只適合于測試環境&#xff0c;由于生產的需求&#xff0c;本章將使用Docker卷機制持久保存Docker容器中創建的數據。2 最佳實踐2.1 環境配置2…

kali 切換root權限_Ubuntu 被曝嚴重漏洞:切換系統語言 + 輸入幾行命令,就能獲取 root 權限...

公眾號關注 “GitHubDaily”設為 “星標”&#xff0c;帶你了解技術圈內新鮮事&#xff01;來自量子位無需系統密碼&#xff0c;就能添加新的 sudo 用戶、獲取 root 權限&#xff0c;事后還能刪除不留痕跡。這是 GitHub 安全研究員 Kevin Backhouse 發現的一個 Ubuntu 系統大漏…

oracle定義變量sql賦值_ORACLE獲取SQL綁定變量值的方法總結

本文總結一下ORACLE數據庫中如何獲取SQL綁定變量值的方法&#xff0c;在SQL優化調優過程中&#xff0c;經常會用到這方面的知識點。在此梳理、總結一下這方面的知識點&#xff0c;方面日后查找、翻閱。方法1&#xff1a;查詢V$SQLV$SQL視圖中的BIND_DATA字段用來存儲綁定變量的…