javascript
Spring Cloud —— 负载均衡与 Ribbon 应用
引言
本篇博客簡單介紹微服務負載均衡的概念,并通過 IDEA 多端口啟動應用的方式,模擬多個應用實例,使用自定義和?Ribbon 兩種方式實現基本的負載均衡策略。
微服務代碼以《Spring Cloud Alibaba——Nacos實現服務治理》為基礎。
一、什么是負載均衡
負載指的是系統接收請求的壓力,通常來講,單體應用如果接收的請求量過多,會對應用本身造成一定的并發困擾,導致邏輯出錯,甚至是服務癱瘓。
為了解決單個應用訪問量過大的情況,人們很自然的想到將一個單體應用克隆多份,來分攤請求量,均衡負載。
負載均衡就是將負載(工作任務、訪問量)進行分攤到多個操作單元(服務器、組件)上執行的一套技術。
根據負載均衡發生的位置不同,一般分為:服務端負載均衡、客戶端負載均衡。
1、服務端負載均衡指的是分攤工作發生在服務提供者一方,比如常見的 Nginx 。
2、客戶端負載均衡則恰好相反,它指的是分攤工作發生在服務請求的一方,即在發送請求之前就已經選好了由具體的哪一個實例處理請求。如下圖所示:
一般在微服務中,都是使用客戶端負載均衡。
二、IDEA 中模擬多個微服務實例
使用 idea 可以輕松的為一個 spring boot 服務創建多個微服務實例。以《Spring Cloud Alibaba——Nacos實現服務治理》的代碼用例為例,這里簡單回顧一下 Demo 用例。
我們創建了一個電商系統,有三個微服務:shop-user 用戶微服務、shop-product 商品微服務、shop-order 訂單微服務,我們使用 Nacos 實現了服務的注冊發現,并實現了完整的用戶下單——>查詢商品——>返回訂單的微服務調用邏輯,如下圖所示:
但上述案例只涉及到了一個訂單微服務實例對應另一個商品微服務實例,并沒有任何負載均衡的效果,為了演示負載均衡,我們可以通過 idea 將shop-product 微服務啟動多個實例。
方法是,在啟動項中添加多個:
配置好第二個商品微服務實例之后,我們啟動 ProductApplication 和 ProductApplication2,可以在 Nacos 中看到注冊的商品服務實例有 2 個(關于Nacos 的相關知識參考《Spring Cloud Alibaba——Nacos實現服務治理》):
三、自定義負載均衡
最簡單的負載均衡機制就是通過隨機數,根據服務提供者(商品服務)的實例數量,來隨機生成服務序號,從而確定訪問的實例。
我們在訂單微服務中加入隨機數代碼:
以下是完整代碼:?
@Slf4j @RestController @RequestMapping("/order") public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;@Autowiredprivate OrderService orderService;/**** 下單* @param pid* @return*/@GetMapping("/prod/{pid}")public Order order(@PathVariable("pid") Integer pid) {log.info("接收到{}號商品的下單請求,準備調用商品微服務", pid);// 獲取服務實例列表List<ServiceInstance> serviceList = discoveryClient.getInstances("service-product");// 生成隨機下標 0 1int index = new Random().nextInt(serviceList.size());// 獲取實例對象ServiceInstance productService = serviceList.get(index);// 調用商品微服務,查詢商品信息Product prod = restTemplate.getForObject("http://" + productService.getHost() + ":" + productService.getPort() + "/product/" + pid, Product.class);log.info("查詢到{}號商品信息,內容是:{}", pid, JSON.toJSONString(prod));// 下單(即創建訂單并保存)Order order = new Order();order.setUid(1);order.setUsername("測試用戶");order.setPid(pid);order.setPname(prod.getPname());order.setPprice(prod.getPprice());order.setNumber(1);// 訂單入庫orderService.createOrder(order);log.info("創建訂單成功,訂單信息為:{}", JSON.toJSONString(order));return order;} }啟動 OrderApplication ,并調用下單接口,觀察每次請求時,商品微服務后臺日志的打印情況:
總共請求了四次,商品實例1調用了3次,商品實例2調用了1次,隨機數負載均衡成功。
四、Ribbon 實現負載均衡
Ribbon 是 Spring Cloud 的一個組件,它可以讓我們使用一個注解就能輕松搞定負載均衡。Ribbon 的默認負載均衡策略是輪詢。
整合方法只需兩步:
1、在 RestTemplate 注入的時候,添加 @LoadBalanced 注解:
@Bean @LoadBalanced public RestTemplate restTemplate() {return new RestTemplate(); }2、修改服務調用的方法,以服務名稱直接代替 ip 和 端口號:
@GetMapping("/prod/{pid}") public Order order(@PathVariable("pid") Integer pid) {log.info("接收到{}號商品的下單請求,準備調用商品微服務", pid);// 調用商品微服務,查詢商品信息Product prod = restTemplate.getForObject("http://service-product/product/" + pid, Product.class);log.info("查詢到{}號商品信息,內容是:{}", pid, JSON.toJSONString(prod));...return ...; }(演示效果略)
Ribbon 的常用負載均衡策略有三個:
| RoundRobinRule | 輪詢選擇 service instance | 輪詢 index,選擇索引對應的服務實例 |
| RandomRule | 隨機選擇一個 instance | 在 index 上隨機,選擇對應位置的服務實例 |
| BestAvailableRule | 選擇一個最小的并發請求的 instance | 考察每個實例,如果實例被 tripped 了,則忽略。再選擇其中 ActiveRequestsCount最小的實例 |
修改 Ribbon 的負載均衡策略非常簡單,只需要在配置文件中指定即可:
# 調用的服務名稱 service-product:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule演示效果同第三節。
總結
項目的代碼以《Spring Cloud Alibaba——Nacos實現服務治理》基礎,可能缺少一些中間環境,建議結合閱讀。
負載均衡的作用是分攤流量,避免某一個服務因為請求壓力而癱瘓。
負載均衡的模式一般有兩種,客戶端負載均衡和服務端負載均衡。一般在微服務調用中,都是使用客戶端負載均衡。
Ribbon是實現負載均衡的重要組件,它的負載均衡策略主要有三個:輪詢(默認)、隨機、最小并發。
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Spring Cloud —— 负载均衡与 Ribbon 应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springmvc使用requestma
- 下一篇: 怎样设置电脑壁纸_怎样设置电脑的资料定时