Spring 框架,4、Spring Cloud-負載均衡 Ribbon

 2023-10-08 阅读 21 评论 0

摘要:4.1、RestTemplate 簡介 RestTemplate是Spring Resources中一個訪問RESTful API 接口的網絡請求框架。 RestTemplate 的設計 則和其他 Spring Template (例如 JdbcTemplate JmsTemplate )類似,都 是為執行復雜任務提供了一個具有默認行為的簡單方法。 Re

4.1、RestTemplate 簡介

RestTemplate是Spring Resources中一個訪問RESTful API 接口的網絡請求框架。
RestTemplate 的設計 則和其他 Spring Template (例如 JdbcTemplate JmsTemplate )類似,都
是為執行復雜任務提供了一個具有默認行為的簡單方法。
RestTemplate 是用來消費 REST 服務的,所以 RestTemplate 主要方法都與REST的HTTp
協議的一些方法緊密相連,例如 HEAD 、GET 、POST 、PUT、DELETE和OPTIONS 等方法
這些方法在 RestTemplate 類對應的方法為 headForHeaders()、getForObject()、?
postForObject()、put()和 delete () 等。
RestTemplate 支持常見的 Http 協議的請求方法,例如 Post、 Put、 Delete ,所以用
RestTemplate 很容易構建 RESTful API 。

?

4.2、Ribbon 簡介

負載均衡是指將負載分攤到多個執行單元上,常見的負載均衡有兩種方式。
1.獨立進程單元,通過負載均衡策略,將請求轉發到不同的執行單元上,例如 Ngnix 。
2.將負載均衡邏輯以代碼的形式封裝到服務消費者的客戶端上,服務消費者客戶端維護了一份服務提
供者的信息列 ,有了信息列表,通過負載均衡策略將請求分攤給多個服務提供者,從而達到負
載均衡的目的。
Ribbon是Netflix 公司開源的一個負載均衡的組件,它屬于上述的第2種方式
是將負載均衡邏輯封裝在客戶端中,并且運行在客戶端的進程里
Ribbon是一個經過了云端測試的 IPC庫,可以很好地控制 HTTP和TCP 客戶端的負載均衡行為。
Spring Cloud 構建的微服務系統中, Ribbon 作為服務消費者的負載均衡器
兩種使用方式:??
1、 和RestTemplate 相結合
2、是和 Feign 相結合。(Feign 已經默認集成了 Ribbon)?
Ribbon 有很多子模塊,但很多模塊沒有用于生產環境,目前 Netflix 公司用于生產環境的 Ribbon
子模塊如下:

Spring 框架。?

?4.3、使用RestTemplate和Ribbon來消費

?

之前的案例中已經有了注冊中心此時不在進行注冊中心的代碼實現
(之前關于Eureka的高可用中有兩個端口的Eureka)
服務提供者的開發如下:
eureka-client地址:https://www.cnblogs.com/Mrchengs/p/10645860.html
是之前的工程進行改變的

服務端負載均衡和客戶端負載均衡,?

ProviderService.java

package com.cr.eurekaclient.service;
import org.springframework.stereotype.Service;@Service
public class ProviderService {public String  port(){return "8080";}
}

?

什么是Springcloud。?PortController.java

package com.cr.eurekaclient.controller;import com.cr.eurekaclient.service.ProviderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class PortController {@AutowiredProviderService providerService;@GetMapping("/port")public String getPort(){return providerService.port();}
}

?

?配置文件:

server.port=8089
spring.application.name=CLINET
#應用起名字spring.application.name=provider
#注冊服務時使用服務的ip地址
eureka.instance.prefer-ip-address=true
#服務中心地址
eureka.client.service-url.defaultZone=http://localhost:8762/eureka/

Spring Cloud Bus。?訪問:

?

去注冊中心可以看到此時的服務已經在注冊中心注冊:

Springcloud定時任務,

這里的Application將會是消費者中引用的地址!!!

?

Springcloud微服務、?服務的消費者:

?

RibbonConfig.java

@Configuration
public class RibbonConfig {@Bean@LoadBalancedRestTemplate restTemplate(){return new RestTemplate();}
}

?

RibbonController.java

@RestController
public class RibbonController {@AutowiredRibbonService ribbonService;@GetMapping("/port")public String port(){return ribbonService.port();}
}

?

RibbonService.java
@Service
public class RibbonService {@AutowiredRestTemplate restTemplate;public  String port(){return restTemplate.getForObject("http://CLINET/port",String.class);}
}

?http://CLINET/port中的CLIENT為注冊中心中的Application中的值

?

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

?

配置文件:

spring.application.name=eureka-ribbon-client
server.port=8088
eureka.client.service-url.defaultZone=http://localhost:8762/eureka/
訪問:localhost:8080之后、
看注冊中心:

訪問http://localhost:8088/port

@LoadBalanced開啟負載均衡功能?

測試實現:?

同時也將8090換成8089,使用maven進行打包

?

在cmd中運行兩個項目:

?

?

?此時8089、8090端口都可以進行訪問

?

?

?http://localhost:8088/port頁面進行刷新請求

?

?

?

此似乎可以看到兩個端口的服務都可以訪問到!!
負載均衡器會輪流地請求CLIENT的兩個實例中的“/port”請求

?

?4.4、loadBalancerClient 簡介

負載均衡器的核 類為 LoadBalancerClient
LoadBalancerCiient 可以獲取負載均衡的服務提供者的實例信息

?

在工程中進行測試:

?

RibbonController.java?

package com.cr.eurekaribbonclient.controller;import com.cr.eurekaribbonclient.service.RibbonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RibbonController {@AutowiredRibbonService ribbonService;@GetMapping("/port")public String port(){return ribbonService.port();}@Autowiredprivate LoadBalancerClient loadBalancerClient;@GetMapping("/testRibbon")public String testRibbon(){ ServiceInstance instance = loadBalancerClient.choose("CLINET");return instance.getHost()+ ":" + instance.getPort();}
}

?

繼續運行項目:
多次訪問:http://localhost:8088/testRibbon

?

?

LoadBalancerClient的choose("CLINET")方法可以輪流得到 eureka-client 的兩個服務實例的信息
負載均衡LoadBalancerClient是從Eureka Client 獲取服務注冊列表信息的,并且將注冊信息緩存一份
LoadBalancerCJient 調用 choose()方法時,根據負載均衡策略選擇一個服務實例的信息,
從而進行了負載均衡
LoadBalancerClient 也可以不從 Eureka Client 獲取注冊列表信息,
這時需要自己維護 份服務注冊列 信息
有兩個不同 Uri 地址 (例如 example.com,google.com )的服務實例 ,通
stores.ribbon.listOfServers 來配 這些服務實例的 Uri
spring.application.name=eureka-ribbon-client
server.port=8088
eureka.client.service-url.defaultZone=http://localhost:8762/eureka/
stores.ribbon.listOfServers:example.com,google.com
ribbon.eureka.enabled=false

?

?

package com.cr.eurekaribbonclient.controller;import com.cr.eurekaribbonclient.service.RibbonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class RibbonController {@AutowiredRibbonService ribbonService;@GetMapping("/port")public String port(){return ribbonService.port();}@Autowiredprivate LoadBalancerClient loadBalancerClient;@GetMapping("/testRibbon")public String testRibbon(){ServiceInstance instance = loadBalancerClient.choose("CLINET");return instance.getHost()+ ":" + instance.getPort();}//進一步說明@GetMapping("/hi")public String hi(){ServiceInstance instance = loadBalancerClient.choose("stores");return instance.getHost()+ ":" + instance.getPort();}
}
測試:

?

?

后期會對源碼進行相關的分析!!!

轉載于:https://www.cnblogs.com/Mrchengs/p/10645993.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/130087.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息