最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringCloud 服務(wù)負(fù)載均衡和調(diào)用 Ribbon、OpenFeign的方法

 更新時(shí)間:2020年09月05日 09:34:57   投稿:mrr  
這篇文章主要介紹了SpringCloud 服務(wù)負(fù)載均衡和調(diào)用 Ribbon、OpenFeign的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

1、Ribbon

Spring Cloud Ribbon是基于Netflix Ribbon實(shí)現(xiàn)的—套客戶端―負(fù)載均衡的工具。
簡(jiǎn)單的說(shuō),Ribbon是Netlix發(fā)布的開(kāi)源項(xiàng)目,主要功能是提供客戶端的軟件負(fù)載均衡算法和服務(wù)調(diào)用。Ribbon客戶端組件提供一系列完善的配置項(xiàng)如連接超時(shí),重試等。簡(jiǎn)單的說(shuō),就是在配置文件中列出Load Balancer(簡(jiǎn)稱LB)后面所有的機(jī)器,Ribbon會(huì)自動(dòng)的幫助你基于某種規(guī)則(如簡(jiǎn)單輪詢,隨機(jī)連接等)去連接這些機(jī)器。我們很容易使用Ribbon實(shí)現(xiàn)自定義的負(fù)載均衡算法。

目前Ribbon和Eureka進(jìn)入到維護(hù)模式。停更不停用

負(fù)載均衡:

LB負(fù)載均衡(Load Balance)是什么?
簡(jiǎn)單的說(shuō)就是將用戶的請(qǐng)求平攤的分配到多個(gè)服務(wù)上,從而達(dá)到系統(tǒng)的HA(高可用)。1
常見(jiàn)的負(fù)載均衡有軟件Nginx,LVS,硬件F5等。
Ribbon本地負(fù)載均衡客戶端VS Nginx服務(wù)端負(fù)載均衡區(qū)別
Nginx是服務(wù)器負(fù)載均衡,客戶端所有請(qǐng)求都會(huì)交給nginx,然后由nginx實(shí)現(xiàn)轉(zhuǎn)發(fā)請(qǐng)求。即負(fù)載均衡是由服務(wù)端實(shí)現(xiàn)的。
Ribbon本地負(fù)載均衡,在調(diào)用微服務(wù)接口時(shí)候,會(huì)在注冊(cè)中心上獲取注冊(cè)信息服務(wù)列表之后緩存到VM本地,從而在本地實(shí)現(xiàn)RPC遠(yuǎn)
程服務(wù)調(diào)用技術(shù)。

1、集中式LB
即在服務(wù)的消費(fèi)方和提供方之間使用獨(dú)立的LB設(shè)施(可以是硬件,如F5,也可以是軟件,如nginx)由該設(shè)施負(fù)責(zé)把訪問(wèn)請(qǐng)求通過(guò)某種策咯轉(zhuǎn)發(fā)至服務(wù)的提供方;

2、進(jìn)程內(nèi)LB
將LB邏輯集成到消費(fèi)方,消費(fèi)方從服務(wù)注冊(cè)中心獲知有哪些地址可用,然后自己再?gòu)倪@些地址中選擇出一個(gè)合適的服務(wù)器。Ribbon就屬于進(jìn)程內(nèi)LB,它只是一個(gè)類庫(kù),集成于消費(fèi)方進(jìn)程,消費(fèi)方通過(guò)它來(lái)獲取到服務(wù)提供方的地址。

負(fù)載均衡 +RestTemplate 配合使用

架構(gòu)

總結(jié):Ribbon其實(shí)就是一個(gè)軟負(fù)載均衡的客戶端組件,他可以和其他所需請(qǐng)求的客戶端結(jié)合使用,和eureka結(jié)合只是其中的一個(gè)實(shí)例.

Ribbon在工作時(shí)分成兩步
第一步先選擇EurekaServer ,它優(yōu)先選擇在同一個(gè)區(qū)域內(nèi)負(fù)載較少的server.
第二步再根據(jù)用戶指定的策略,在從server取到的服務(wù)注冊(cè)列表中選擇一個(gè)地址。
其中Ribbon提供了多種策略:比如輪詢、隨機(jī)和根據(jù)響應(yīng)時(shí)間加權(quán)。

pom 依賴 
spring-cloud-starter-netflix-eureka-client
自身 就集成了 ribbon 。

RestTemplate說(shuō)明:

Ribbon負(fù)載均衡規(guī)則

繼承結(jié)構(gòu)

自帶7種:

如何使用?負(fù)載均衡策略替換。

官方文檔明確給出了警告:
這個(gè)自定義配置類不能放在@ComponentScan所掃描的當(dāng)前包下以及子包下,
否則我們自定義的這個(gè)配置類就會(huì)被所有的Ribbon客戶端所共享,達(dá)不到特殊化定制的目的了。

增加rule配置類

包路徑: com.fage.rules
 
@Configuration
public class MyRibbonRule {
 @Bean
 public IRule randomRule() {
  return new RandomRule();
 }

}

boot啟動(dòng)類增加注解

@RibbonClient(name = "cloud-payment-service", configuration = {MyRibbonRule.class})

負(fù)載均衡輪詢算法原理

負(fù)載均衡算法: rest接口第幾次請(qǐng)求數(shù)%服務(wù)器集群總數(shù)量=實(shí)際調(diào)用服務(wù)器位置下標(biāo),每次服務(wù)重啟動(dòng)后rest接口計(jì)數(shù)從1開(kāi)始。
List instances = discoveryClient.getlnstances(CLOUD-PAYMENT-SERVICE");
如:List [o] instances = 127.0.0.1:8002
List [1] instances = 127.0.0.1:8001
8001+8002組合成為集群,它們共計(jì)2臺(tái)機(jī)器,集群總數(shù)為2,按照輪詢算法原理:
當(dāng)總請(qǐng)求數(shù)為1時(shí):1%2=1對(duì)應(yīng)下標(biāo)位置為1,則獲得服務(wù)地址為127.0.0.1:8001
當(dāng)總請(qǐng)求數(shù)位2時(shí): 2%2=O對(duì)應(yīng)下標(biāo)位置為0,則獲得服務(wù)地址為127.0.0.1:8002
當(dāng)總請(qǐng)求數(shù)位3時(shí):3%2=1對(duì)應(yīng)下標(biāo)位置為1,則獲得服務(wù)地址為127.0.0.1:8001
當(dāng)總請(qǐng)求數(shù)位4時(shí):4%2=0對(duì)應(yīng)下標(biāo)位置為0,則獲得服務(wù)地址為127.0.0.1:8002
如此類推......

源碼:

從0開(kāi)始取余獲取提供者服務(wù)。

內(nèi)部使用cas+自旋鎖。

手寫(xiě)一個(gè)負(fù)載均衡算法,實(shí)現(xiàn)輪詢

1、服務(wù)提供者增加接口

 @GetMapping("/payment/loadBalanced")
 public CommonResult<Object> getLoadBalanced() {
  return new CommonResult<>(200, "調(diào)用成功", port);
 }

2、服務(wù)消費(fèi)者改造

將 @LoadBalanced 注解去掉

增加MyLoadBalanced接口,只有一個(gè)方法ServiceInstance instance(List serviceInstances);用于得到當(dāng)前算法后要使用的實(shí)例對(duì)象。

實(shí)現(xiàn)類MyLib源碼如下:

@Component
@Slf4j
public class MyLib implements MyLoadBalanced {

 private final AtomicInteger nextServerCyclicCounter = new AtomicInteger(0);

 public final int getAndIncrement() {
  // 方案 1 cas 
//  int current;
//  int next;
//  do {
//   current = this.nextServerCyclicCounter.get();
//   next = current >= 2147483647 ? 0 : current + 1;
//  } while (!this.nextServerCyclicCounter.compareAndSet(current, next));
//  log.info("**********第幾次訪問(wèn),次數(shù)next:" + next);
//  return next;

  // 方案 2 JUC 提供的 自增方法 
  log.info("**********第幾次訪問(wèn),次數(shù)next:" + nextServerCyclicCounter.getAndIncrement());
  return nextServerCyclicCounter.get();
 }

 /**
  * 負(fù)載均衡算法:rest接口第幾次請(qǐng)求書(shū) % 服務(wù)器集群總數(shù)量 = 實(shí)際調(diào)用服務(wù)器位置下標(biāo),每次服務(wù)重啟動(dòng)后rest接口計(jì)數(shù)從1開(kāi)始
  *
  * @param serviceInstances 集群中的 服務(wù) 實(shí)例
  * @return 集群中的一個(gè)實(shí)例
  */
 @Override
 public ServiceInstance instance(List<ServiceInstance> serviceInstances) {
  return serviceInstances.get(getAndIncrement() % serviceInstances.size());
 }
}

3、改造消費(fèi)者調(diào)用方法

@GetMapping(value = "/consumer/payment/loadBalanced")
 public CommonResult getLoadBalanced() {
  ServiceInstance instance = myLoadBalanced.instance(discoveryClient.getInstances(PAYMENT_URL.split("http://")[1]));
  return restTemplate.getForObject(instance.getUri()+"/payment/loadBalanced", CommonResult.class);
 }

2、OpenFeign

只需要一個(gè)接口并在接口上添加注解即可。

feign不再更新,直接學(xué)習(xí)openFeign。都是用于負(fù)載均衡。

Feign是一個(gè)聲明式WebService客戶端。使用Feign能讓編寫(xiě)Web Service客戶端更加簡(jiǎn)單。
它的使用方法是定義一個(gè)服務(wù)接口然后在上面添加注解。Feign也支持可拔括式的編碼羆和解碼器。Spring Cloud對(duì)Feign進(jìn)行了封裝,使其支持了Spring MVC標(biāo)準(zhǔn)注解和HttpMessageConverters。Feign和ribbon組合使用以支持負(fù)載均衡。

Feign能干什么

Feign旨在使編寫(xiě)Java Http客戶端變得更容易。
前面在使用Ribbon+RestTemplate時(shí),利用RestTemplate對(duì)http請(qǐng)求的封裝處理,形成了一套模版化的調(diào)用方法。但是在實(shí)際開(kāi)發(fā)
中,由于對(duì)服務(wù)依賴的調(diào)用可能不止一處,往往一個(gè)接口會(huì)被多處調(diào)用,所以通常都會(huì)針對(duì)每個(gè)微服務(wù)自行封裝一些客戶端類來(lái)包裝
這些依賴服務(wù)的調(diào)用。所以,F(xiàn)eign在此基礎(chǔ)上做了進(jìn)一步封裝,由他來(lái)幫助我們定義和實(shí)現(xiàn)依賴服務(wù)接口的定義。在Feign的實(shí)現(xiàn)下
,我們只需創(chuàng)建一個(gè)接口并使用注解的方式來(lái)配置它(以前是Dao接口上面標(biāo)注Mapper注解,現(xiàn)在是一個(gè)微服務(wù)接口上面標(biāo)注一個(gè)
Feign注解即可),即可完成對(duì)服務(wù)提供方的接口綁定,簡(jiǎn)化了使用Spring cloud Ribbon時(shí),自動(dòng)封裝服務(wù)調(diào)用客戶端的開(kāi)發(fā)量。

Feign集成了Ribbon

利用Ribbon維護(hù)了Payment的服務(wù)列表信息,并且通過(guò)輪詢實(shí)現(xiàn)了客戶端的負(fù)載均衡。而與Ribbon不同的是,通過(guò)feign只需要定義
服務(wù)綁定接口且以聲明式的方法,優(yōu)雅而簡(jiǎn)單的實(shí)現(xiàn)了服務(wù)調(diào)用

Feign和openFeign的區(qū)別

搭建openFeign模塊 cloud-consumer-openfeign-order80

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

啟動(dòng)類增加注解@EnableFeignClients

增加feign接口

@Component
@FeignClient(value = "cloud-payment-service")
public interface OpenFeignService {
 @GetMapping("/payment/loadBalanced")
 public CommonResult<Object> getLoadBalanced();
}

增加controller

@RestController
@Slf4j
public class OrderController implements OpenFeignService {
 @Resource
 OpenFeignService openFeignService;

 @Override
 @GetMapping("/consumer/payment/loadBalanced")
 public CommonResult<Object> getLoadBalanced() {
  return openFeignService.getLoadBalanced();
 }
}

注冊(cè)中心使用eureka。跟之前一樣。

OpenFeign超時(shí)控制

OpenFeign默認(rèn)等待時(shí)間為1ms。

設(shè)置超時(shí)時(shí)間

###設(shè)置 超時(shí)時(shí)間 方式 1
# 設(shè)置 feign客戶端超時(shí)時(shí)間 ( openFeign 默認(rèn)支持 ribbon )
ribbon:
 # 指的是建立連接所用的時(shí)間,適用于網(wǎng)絡(luò)狀況正常的情況下,倆端連接所用的時(shí)間 單位是秒
 ReadTimeout: 6000
 # 指的是建立連接后從服務(wù)器讀取到可用資源的時(shí)間
 ConnectTimeout: 5000
 
 
###設(shè)置 超時(shí)時(shí)間 方式 2
#feign:
# client:
# config:
#  default:
#  connectTimeout: 5000
#  readTimeout: 6000
#  loggerLevel: full 

OpenFeign日志增強(qiáng)

Feign提供了日志打印功能,我們可以通過(guò)配置來(lái)調(diào)整日志級(jí)別,從而了解Feign中Http請(qǐng)求的細(xì)節(jié)。
說(shuō)白了就是對(duì)Feign接口的調(diào)用情況進(jìn)行監(jiān)控和輸出

日志級(jí)別:

NONE:默認(rèn)的,不顯示任何日志;
BASIC:僅記錄請(qǐng)求方法、URL、響應(yīng)狀態(tài)碼及執(zhí)行時(shí)間;
HEADERS:除了BASIC中定義的信息之外,還有請(qǐng)求和響應(yīng)的頭信息;
FULL:除HEADERS中定義的信息之外,還有請(qǐng)求和響應(yīng)的正文及元數(shù)據(jù)。

配置日志bean:

 @Bean
 Logger.Level feignLoggerLevel() {
  return Logger.Level.FULL;
 }

yml開(kāi)啟日志

# 設(shè)置 feign客戶端超時(shí)時(shí)間 ( openFeign 默認(rèn)支持 ribbon )
ribbon:
 # 指的是簡(jiǎn)歷連接所用的時(shí)間,適用于網(wǎng)絡(luò)狀況正常的情況下,倆端連接所用的時(shí)間 單位是秒
 ReadTimeout: 8000
 # 指的是建立連接后從服務(wù)器讀取到可用資源的時(shí)間
 ConnectTimeout: 6000

# 開(kāi)啟 feign 日志打印
logging:
 level:
 ## feign 日志 以什么級(jí)別 監(jiān)控那個(gè)接口
 com.fage.springcloud.feign.OpenFeignService: debug

結(jié)果:

2020-08-25 17:55:26.667 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService   : [OpenFeignService#getLoadBalanced] ---> GET http://cloud-payment-service/payment/loadBalanced HTTP/1.1

2020-08-25 17:55:26.667 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService   : [OpenFeignService#getLoadBalanced] ---> END HTTP (0-byte body)

2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService   : [OpenFeignService#getLoadBalanced] <--- HTTP/1.1 200 (14ms)

2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService   : [OpenFeignService#getLoadBalanced] connection: keep-alive

2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService   : [OpenFeignService#getLoadBalanced] content-type: application/json

2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService   : [OpenFeignService#getLoadBalanced] date: Tue, 25 Aug 2020 09:55:26 GMT

2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService   : [OpenFeignService#getLoadBalanced] keep-alive: timeout=60

2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService   : [OpenFeignService#getLoadBalanced] transfer-encoding: chunked

2020-08-25 17:55:26.682 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService   : [OpenFeignService#getLoadBalanced] 

2020-08-25 17:55:26.683 DEBUG 56624 --- [p-nio-80-exec-2] c.f.springcloud.feign.OpenFeignService   : [OpenFeignService#getLoadBalanced] {"code":200,"message":"調(diào)用成功","data":"8001"}

到此這篇關(guān)于SpringCloud 服務(wù)負(fù)載均衡和調(diào)用 Ribbon、OpenFeign的方法的文章就介紹到這了,更多相關(guān)SpringCloud 服務(wù)負(fù)載均衡內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java生成文件夾和文件的簡(jiǎn)單示例分享

    java生成文件夾和文件的簡(jiǎn)單示例分享

    這篇文章主要介紹了java生成文件夾和文件的簡(jiǎn)單示例,需要的朋友可以參考下
    2014-04-04
  • Java構(gòu)建JDBC應(yīng)用程序的實(shí)例操作

    Java構(gòu)建JDBC應(yīng)用程序的實(shí)例操作

    在本篇文章里小編給大家整理了一篇關(guān)于Java構(gòu)建JDBC應(yīng)用程序的實(shí)例操作,有興趣的朋友們可以學(xué)習(xí)參考下。
    2021-03-03
  • 淺談Java中ThreadLocal內(nèi)存泄露的原因及處理方式

    淺談Java中ThreadLocal內(nèi)存泄露的原因及處理方式

    內(nèi)存泄漏就是我們申請(qǐng)了內(nèi)存,但是該內(nèi)存一直無(wú)法釋放,就會(huì)導(dǎo)致內(nèi)存溢出問(wèn)題,本文詳細(xì)的介紹了ThreadLocal內(nèi)存泄露的原因及處理方式,感興趣的可以了解一下
    2023-05-05
  • java學(xué)生信息管理系統(tǒng)源代碼

    java學(xué)生信息管理系統(tǒng)源代碼

    這篇文章主要為大家詳細(xì)介紹了java學(xué)生信息管理系統(tǒng)源代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java規(guī)則引擎Easy Rules的使用介紹

    Java規(guī)則引擎Easy Rules的使用介紹

    這篇文章主要介紹了Java規(guī)則引擎Easy Rules的使用介紹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 利用Java和c語(yǔ)言寫(xiě)一個(gè)計(jì)算器

    利用Java和c語(yǔ)言寫(xiě)一個(gè)計(jì)算器

    這篇文章我們就來(lái)分享如何利用Java和c語(yǔ)言來(lái)寫(xiě)一個(gè)計(jì)算器,文章附有代碼詳細(xì)說(shuō)明,感興趣得小伙伴可以參考下面文章得具體內(nèi)容
    2021-10-10
  • 在eclipse中使用SVN的方法(圖文)

    在eclipse中使用SVN的方法(圖文)

    這篇文章主要介紹了在eclipse中使用SVN的方法(圖文),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java貪心算法超詳細(xì)講解

    Java貪心算法超詳細(xì)講解

    人之初性本善,但是隨著自身的經(jīng)歷、生活環(huán)境等因素的影響,人逐漸會(huì)生出貪嗔癡。實(shí)際上不光人有貪念,我們的算法也會(huì)有貪念,今天就和大家介紹下一個(gè)有貪念的算法模型---貪心算法,看看一個(gè)算法是怎么產(chǎn)生貪念的
    2022-05-05
  • SpringCloud?Bus組件的使用配置詳解

    SpringCloud?Bus組件的使用配置詳解

    bus稱之為springcloud中消息總線,主要用來(lái)在微服務(wù)系統(tǒng)中實(shí)現(xiàn)遠(yuǎn)端配置更新時(shí)通過(guò)廣播形式通知所有客戶端刷新配置信息,避免手動(dòng)重啟服務(wù)的工作,這篇文章主要介紹了SpringCloud?Bus組件的使用,需要的朋友可以參考下
    2022-03-03
  • 快速理解Java垃圾回收和jvm中的stw

    快速理解Java垃圾回收和jvm中的stw

    這篇文章主要介紹了快速理解Java垃圾回收和jvm中的stw,涉及Java代碼的停頓,jvm中的線程等相關(guān)內(nèi)容,還是十分不錯(cuò)的,需要的朋友可以參考。
    2017-10-10

最新評(píng)論

嵊州市| 龙山县| 木兰县| 来宾市| 杂多县| 分宜县| 仙桃市| 仙桃市| 普洱| 河津市| 潼南县| 游戏| 太和县| 中阳县| 临沂市| 迭部县| 安陆市| 彰化市| 广东省| 古浪县| 铜山县| 阜城县| 昌宁县| 九龙城区| 三台县| 阿克陶县| 涞水县| 宿松县| 天台县| 红桥区| 芦山县| 株洲市| 南平市| 大余县| 福鼎市| 合阳县| 新闻| 铜山县| 枣庄市| 香格里拉县| 开原市|