網站首頁 編程語言 正文
1.什么是負載均衡 nginx
通俗的講, 負載均衡就是將負載(工作任務,訪問請求)進行分攤到多個操作單元(服務器,組件)上進行執行。
根據負載均衡發生位置的不同,一般分為服務端負載均衡和客戶端負載均衡。
服務端負載均衡指的是發生在服務提供者一方,比如常見的nginx負載均衡。
而客戶端負載均衡指的是發生在服務請求的一方,也就是在發送請求之前已經選好了由哪個實例處理請求。
我們在微服務調用關系中一般會選擇客戶端負載均衡,也就是在服務調用的一方來決定服務由哪個提供者執行.。
2.自定義實現負載均衡
2.1通過idea再啟動一個 shop-product 微服務,設置其端口為8082

2.2在Nacos注冊中心查看自己微服務的啟動狀態(是否是多個服務)
2.3修改controller代碼實現負載均衡
@Service
public class OrderServiceImpl01 implements OrderService {
@Autowired
private OrderMapper orderMapper;
//該類默認沒有交于spring管理
@Autowired
private RestTemplate restTemplate;
@Override
public String saveOrder(Integer pid,Integer num) {
Order order = new Order();
order.setNumber(num);
//用戶的信息可以從登錄者的token中redis獲取用戶信息
order.setUsername("king");
order.setUid(1);
//需要設置訂單對象中商品的信息
//商品操作都在商品微服務---訂單微服務遠程調用商品微服務即可拿到商品信息,遠程調用:http協議的restFul風格調用適合微服務,基于TCP協議的RPC調用適合SOA分布式
//一定采用的為http協議:(1)自己寫代碼完成http調用【httpclient】微信支付---適合調用第三方網址。(2) spring提高了一個工具類RestTemplate,該類也是基于http協議的
//restTemplate調用處必須是 http://服務提供者的名稱/服務提供資源路徑
Product product = restTemplate.getForObject("http://springcloud-product/product/findById/" + pid, Product.class);
order.setPid(product.getPid());
order.setPname(product.getPname());
order.setPprice(product.getPprice());
orderMapper.insert(order);
return "添加訂單成功";
}
}
啟動兩個服務提供者和一個服務消費者,多訪問幾次消費者測試效果。
3.基于Ribbon實現負載均衡 ---組件
3.1什么是Ribbon
1.是 Netflix?發布的一個負載均衡器,有助于控制 HTTP 和 TCP客戶端行為。在 SpringCloud 中, nacos一般配合Ribbon進行使用,Ribbon提供了客戶端負載均衡的功能,Ribbon利用從nacos中讀 取到的服務信息,在調用服務節點提供的服務時,會合理(策略)的進行負載。 在SpringCloud中可以將注冊中心和Ribbon配合使用,Ribbon自動的從注冊中心中獲取服務提供者的 列表信息,并基于內置的負載均衡算法,請求服務。
2.是 Netflix?發布的一個負載均衡器,Ribbon自動的從注冊中心中獲取服務提供者的 列表信息,并基于內置的負載均衡算法,請求服務。
3.2Ribbon的主要作用
(1)服務調用
基于Ribbon實現服務調用, 是通過拉取到的所有服務列表組成(服務名-請求路徑的)映射關系。借助 RestTemplate 最終進行調用。
(2)負載均衡
當有多個服務提供者時,Ribbon可以根據負載均衡的算法自動的選擇需要調用的服務地址,?Ribbon是Spring Cloud的一個組件, 它可以讓我們使用一個注解就能輕松的搞定負載均衡。
1.在RestTemplate 的生成方法上添加@LoadBalanced注解
@Bean
//ribbon借助RestTemplate完成負載均衡的調用
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
2.修改服務調用的方法?
@Autowired
private ProductFeign productFeign;
@Override
public Product saveOrder(Integer pid,Integer num) {
Order order = new Order();
order.setNumber(num);
//用戶的信息可以從登錄者的token中redis獲取用戶信息
order.setUsername("king");
order.setUid(1);
System.out.println(pid);
Product product = productFeign.selectProduct(pid);
System.out.println(product);
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~遠程查詢的商品結果~~~~~~~~~~~~~~~~~~"+product);
order.setPid(product.getPid());
order.setPname(product.getPname());
order.setPprice(product.getPprice());
orderMapper.insert(order);
return product;
}
4.Ribbon支持的負載均衡策略
Ribbon內置了多種負載均衡策略,內部負載均衡的頂級接口為
com.netflix.loadbalancer.IRule , 具體的負載策略如下圖所示:
我們可以通過修改配置來調整Ribbon的負載均衡策略,具體代碼如下:
#指定ribbeon負載均恒的策略 ?springcloud-product為我自己的服務器名稱
springcloud-product.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule?
原文鏈接:https://blog.csdn.net/JAVA_SR/article/details/126592756
相關推薦
- 2023-04-10 詳解Go語言中的數據庫操作_Golang
- 2022-09-18 Go語言單控制器和多控制器使用詳解_Golang
- 2023-02-25 Golang嵌入資源文件實現步驟詳解_Golang
- 2022-07-23 Python實現環形鏈表_python
- 2022-06-19 rsa詳解及例題及python算法_python
- 2022-09-20 C#利用TreeView控件實現目錄跳轉_C#教程
- 2022-07-14 如何批量刪除Docker中已經停止的容器的幾種方法_docker
- 2022-09-16 python?playwright之元素定位示例詳解_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支