日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

SpringCloud Netflix Ribbon

發(fā)布時(shí)間:2023/12/3 javascript 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SpringCloud Netflix Ribbon 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 一、 Ribbon簡介
    • 二、 使用Ribbon開發(fā)微服務(wù)
        • 1 創(chuàng)建springcloud工程 和 commons子模塊
        • 2 開發(fā)服務(wù)提供者 - ribbonappservice
        • 3 開發(fā)服務(wù)消費(fèi)者 - ribbonappclient
    • 三、 集中式與進(jìn)程內(nèi)負(fù)載均衡區(qū)別
    • 四、 Ribbon常見的負(fù)載均衡策略
        • 1 Ribbon中的常用負(fù)載均衡簡介
        • 2 配置負(fù)載均衡策略
    • 五、 Ribbon的點(diǎn)對點(diǎn)直連

一、 Ribbon簡介

Ribbon 是一個(gè)基于Http和TCP的客服端負(fù)載均衡工具,它是基于Netflix Ribbon實(shí)現(xiàn)的。它不像spring cloud服務(wù)注冊中心、配置中心、API網(wǎng)關(guān)那樣獨(dú)立部署,但是它幾乎存在于每個(gè)spring cloud 微服務(wù)中。包括feign提供的聲明式服務(wù)調(diào)用也是基于該Ribbon實(shí)現(xiàn)的。ribbon默認(rèn)提供很多種負(fù)載均衡算法,例如 輪詢、隨機(jī) 等等。甚至包含自定義的負(fù)載均衡算法。Ribbon可以用于解決并提供微服務(wù)的負(fù)載均衡的問題。

二、 使用Ribbon開發(fā)微服務(wù)

在Spring Cloud中,使用Ribbon技術(shù)開發(fā)Eureka Client組件還是非常方便的。我們在開發(fā)過程中,不需要像Dubbo那樣關(guān)注服務(wù)的角色。無論是Provider還是Consumer都是一個(gè)微服務(wù)客戶端,只是在編碼層面上,服務(wù)消費(fèi)者代碼的開發(fā)相對比較麻煩。我們通過簡單案例測試一下Spring Cloud中的微服務(wù)開發(fā)過程。
因?yàn)楝F(xiàn)在的Eureka Server部署在Linux中,并已為Linux定義了新的主機(jī)域名,需要先修改開發(fā)測試環(huán)境中的hosts文件。windows中的hosts文件位于:C:\windows\system32\dirvers\etc\hosts。新增內(nèi)容如下:(IP根據(jù)具體情況配置)

192.168.14.128 eureka1 192.168.14.129 eureka2

1 創(chuàng)建springcloud工程 和 commons子模塊

1.1 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"><modelVersion>4.0.0</modelVersion><packaging>pom</packaging><modules><module>commons</module><module>ribbonappservice</module><module>ribbonappclient</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent><groupId>com.bjsxt</groupId><artifactId>springcloud</artifactId><version>1.0-SNAPSHOT</version><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement> </project>

1.2 commons 的pom.xml

<?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>springcloud</artifactId><groupId>com.bjsxt</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>commons</artifactId> </project>

1.3 commons子模塊中user類 (包含set,get等方法)

2 開發(fā)服務(wù)提供者 - ribbonappservice

2.1 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>springcloud</artifactId><groupId>com.bjsxt</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><!-- 服務(wù)提供方項(xiàng)目, 使用Ribbon技術(shù)開發(fā) --><artifactId>ribbonappservice</artifactId><dependencies><!-- spring cloud是通過http協(xié)議對外發(fā)布一個(gè)基于REST規(guī)則的微服務(wù)通過SpringMVC技術(shù)中的Controller對外提供微服務(wù)的。--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Eureka客戶端依賴,spring cloud中,服務(wù)的提供者和消費(fèi)者都是Eureka客戶端。必須依賴此資源 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>com.bjsxt</groupId><artifactId>commons</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

2.2 服務(wù)提供者代碼

package com.bjsxt.userservice.controller;import com.bjsxt.entity.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;import java.util.HashMap; import java.util.Map;/*** 提供服務(wù)的控制器*/ @Controller public class UserController {@RequestMapping("/user/save")@ResponseBodypublic Map<String, Object> save(User user){System.out.println("新增用戶數(shù)據(jù): " + user);Map<String, Object> result = new HashMap<>();result.put("code", "200"); // 返回的狀態(tài)碼result.put("message", "新增用戶成功"); // 返回的處理結(jié)果消息。return result;} }

2.3 配置文件application.yml

server:port: 8082spring:application:name: ribbon-app-serviceeureka: # Eureka客戶端,啟動的時(shí)候,如果未配置Eureka服務(wù)端地址列表,則在localhost:8761注冊client:service-url: # 配置Eureka服務(wù)端地址,注冊中心地址,多個(gè)地址使用逗號 ',' 分隔。defaultZone: http://localhost:8761/eureka/

2.4 啟動類

package com.bjsxt.userservice;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;/*** 服務(wù)提供方啟動類* 在Spring Cloud低版本中,如果開發(fā)的代碼是Eureka Client(服務(wù)提供者和消費(fèi)者),* 那么啟動類上需要增加注解* @EnableEurekaClient - 當(dāng)前應(yīng)用是一個(gè)Eureka客戶端* @EnableDiscoveryClient - 當(dāng)前應(yīng)用需要啟動發(fā)現(xiàn)機(jī)制,就是找到Eureka服務(wù)端,并注冊發(fā)現(xiàn)服務(wù)。*/ @SpringBootApplication public class RibbonAppServiceApp {public static void main(String[] args) {SpringApplication.run(RibbonAppServiceApp.class, args);} }

2.5 檢查Eureka Server中的服務(wù)注冊情況(Eureka Server項(xiàng)目使用SpringCloud Netflix Eureka文章中的)

3 開發(fā)服務(wù)消費(fèi)者 - ribbonappclient

3.1 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>springcloud</artifactId><groupId>com.bjsxt</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>ribbonappclient</artifactId><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>com.bjsxt</groupId><artifactId>commons</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

3.2 控制器

package com.bjsxt.userclient.controller;import com.bjsxt.entity.User; import com.bjsxt.userclient.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;import java.util.Map;/*** 服務(wù)消費(fèi)端*/ @Controller public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/user/save")@ResponseBodypublic Map<String, Object> save(User user){// 調(diào)用本地服務(wù)代碼,本地服務(wù)代碼遠(yuǎn)程調(diào)用application service服務(wù)提供方。Map<String, Object> result = this.userService.save(user);System.out.println("遠(yuǎn)程調(diào)用返回的結(jié)果:" + result);return result;}}

3.3 服務(wù)接口

package com.bjsxt.userclient.service;import com.bjsxt.entity.User;import java.util.Map;public interface UserService {Map<String, Object> save(User user); }

3.4 服務(wù)實(shí)現(xiàn)

package com.bjsxt.userclient.service.impl;import com.bjsxt.entity.User; import com.bjsxt.userclient.service.UserService; import com.netflix.loadbalancer.RandomRule; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate;import java.util.Map;@Service public class UserServiceImpl implements UserService {/*** 是Ribbon技術(shù)中的負(fù)載均衡客戶端對象。其中封裝了從Eureka Server上發(fā)現(xiàn)的所有的服務(wù)地址列表* 包括服務(wù)的名稱,IP,端口等。*/@Autowiredprivate LoadBalancerClient loadBalancerClient;/*** 遠(yuǎn)程方法調(diào)用。訪問application service,訪問的地址是:http://localhost:8080/user/save* @param user* @return*/@Overridepublic Map<String, Object> save(User user) {// 根據(jù)服務(wù)的名稱,獲取服務(wù)實(shí)例。服務(wù)名稱就是配置文件yml中的spring.application.name// 服務(wù)實(shí)例包括,這個(gè)名稱的所有服務(wù)地址和端口。ServiceInstance instance = this.loadBalancerClient.choose("ribbon-app-service");// 訪問地址拼接StringBuilder builder = new StringBuilder("");builder.append("http://").append(instance.getHost()).append(":").append(instance.getPort()).append("/user/save").append("?username=").append(user.getUsername()).append("&password=").append(user.getPassword()).append("&remark=").append(user.getRemark());System.out.println("本地訪問地址:" + builder.toString());// 創(chuàng)建一個(gè)Rest訪問客戶端模板對象。RestTemplate template = new RestTemplate();// 約束響應(yīng)結(jié)果類型ParameterizedTypeReference<Map<String, Object>> responseType =new ParameterizedTypeReference<Map<String, Object>>() {};// 遠(yuǎn)程訪問application service。ResponseEntity<Map<String, Object>> response =template.exchange(builder.toString(), HttpMethod.GET,null, responseType);Map<String, Object> result = response.getBody();return result;} }

3.5 配置文件application.yml

server:port: 8081spring:application:name: ribbon-app-clienteureka:client:service-url:defaultZone: http://localhost:8761/eureka/

3.6 啟動類

package com.bjsxt.userclient;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication public class RibbonAppClientApp {public static void main(String[] args) {SpringApplication.run(RibbonAppClientApp.class, args);} }

三、 集中式與進(jìn)程內(nèi)負(fù)載均衡區(qū)別

業(yè)界主流的負(fù)載均衡解決方案有:集中式負(fù)載均衡和進(jìn)程內(nèi)負(fù)載均衡。

1 集中式負(fù)載均衡
即在客戶端和服務(wù)端之間使用獨(dú)立的負(fù)載均衡設(shè)施(可以是硬件,如F5, 也可以是軟件,如nginx), 由該設(shè)施負(fù)責(zé)把訪問請求通過某種策略轉(zhuǎn)發(fā)至服務(wù)端。
2 進(jìn)程內(nèi)負(fù)載均衡
將負(fù)載均衡邏輯集成到客戶端組件中,客戶端組件從服務(wù)注冊中心獲知有哪些地址可用,然后自己再從這些地址中選擇出一個(gè)合適的服務(wù)端發(fā)起請求。Ribbon就是一個(gè)進(jìn)程內(nèi)的負(fù)載均衡實(shí)現(xiàn)。

四、 Ribbon常見的負(fù)載均衡策略

Ribbon就屬于進(jìn)程內(nèi)負(fù)載均衡,它只是一個(gè)類庫,集成于Eureka Client進(jìn)程,Eureka Client進(jìn)程通過訪問注冊中心Eureka Server發(fā)現(xiàn)服務(wù)列表,發(fā)現(xiàn)的服務(wù)列表信息是由ribbon來管理的。當(dāng)訪問Application Service的時(shí)候,Application Client會通過ribbon來找到合適的Application Service地址信息,并發(fā)起遠(yuǎn)程調(diào)用請求。

1 Ribbon中的常用負(fù)載均衡簡介

1 輪詢策略(默認(rèn)) RoundRobinRule

輪詢策略表示每次都順序取下一個(gè)provider,比如一共有5個(gè)provider,第1次取第1個(gè),第2次取第2個(gè),第3次取第3個(gè),以此類推

2 權(quán)重輪詢策略(常用) WeightedResponseTimeRule

1.根據(jù)每個(gè)provider的響應(yīng)時(shí)間分配一個(gè)權(quán)重,響應(yīng)時(shí)間越長,權(quán)重越小,被選中的可能性越低。
2.原理:一開始為輪詢策略,并開啟一個(gè)計(jì)時(shí)器,每30秒收集一次每個(gè)provider的平均響應(yīng)時(shí)間,當(dāng)信息足夠時(shí),給每個(gè)provider附上一個(gè)權(quán)重,并按權(quán)重隨機(jī)選擇provider,高權(quán)越重的provider會被高概率選中。

3 隨機(jī)策略(不推薦) RandomRule

從provider列表中隨機(jī)選擇一個(gè)provider

4 最少并發(fā)數(shù)策略(應(yīng)用在硬件軟件環(huán)境一致的情況下) BestAvailableRule

選擇正在請求中的并發(fā)數(shù)最小的provider,除非這個(gè)provider在熔斷中。

5 在“選定的負(fù)載均衡策略”基礎(chǔ)上進(jìn)行重試機(jī)制 RetryRule

1.“選定的負(fù)載均衡策略”這個(gè)策略是輪詢策略RoundRobinRule
2.該重試策略先設(shè)定一個(gè)閾值時(shí)間段,如果在這個(gè)閾值時(shí)間段內(nèi)當(dāng)選擇provider不成功,則一直嘗試采用“選定的負(fù)載均衡策略:輪詢策略”最后選擇一個(gè)可用的provider

6 可用性敏感策略(一般在同區(qū)域內(nèi)服務(wù)集群環(huán)境中使用) AvailabilityFilteringRule

過濾性能差的provider,有2種:
第一種:過濾掉在eureka中處于一直連接失敗provider
第二種:過濾掉高并發(fā)的provider

7 區(qū)域敏感性策略(應(yīng)用在大型的,物理隔離分布式環(huán)境中) ZoneAvoidanceRule

1.以一個(gè)區(qū)域?yàn)閱挝豢疾炜捎眯?#xff0c;對于不可用的區(qū)域整個(gè)丟棄,從剩下區(qū)域中選可用的provider
2.如果這個(gè)ip區(qū)域內(nèi)有一個(gè)或多個(gè)實(shí)例不可達(dá)或響應(yīng)變慢,都會降低該ip區(qū)域內(nèi)其他ip被選中的權(quán)重。

2 配置負(fù)載均衡策略

可以通過修改 ribbonappclient 應(yīng)用的全局配置文件來改變當(dāng)前環(huán)境中使用的Ribbon負(fù)載均衡策略。

server:port: 8081spring:application:name: ribbon-app-clienteureka:client:service-url:defaultZone: http://localhost:8761/eureka/ribbon-app-service: # 遠(yuǎn)程訪問這個(gè)命名的服務(wù)ribbon: # 底層Ribbon配置NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 就是具體的負(fù)載均衡策略類型全名

五、 Ribbon的點(diǎn)對點(diǎn)直連

Ribbon也可以脫離Eureka Server注冊中心,通過配置的方式指定要調(diào)用的遠(yuǎn)程服務(wù)信息,實(shí)現(xiàn)Ribbon點(diǎn)對點(diǎn)直連。修改的配置內(nèi)容如下:

server:port: 8081spring:application:name: ribbon-app-client#eureka: # client: # service-url: # defaultZone: http://localhost:8761/eureka/ribbon-app-service: # 遠(yuǎn)程訪問這個(gè)命名的服務(wù)ribbon: # 底層Ribbon配置NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 就是具體的負(fù)載均衡策略類型全名listOfServers: localhost:8080 # 多個(gè)地址用逗號分隔。ribbon: # 關(guān)閉Ribbon自動訪問Eureka服務(wù)端。eureka:enabled: false

總結(jié)

以上是生活随笔為你收集整理的SpringCloud Netflix Ribbon的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。