【springboot】整合LoadBalancer

news/2024/10/12 10:36:38/

目录

  • 问题产生背景
  • 解决方案:实现LoadBalancer
    • 1. 添加依赖
    • 2. 配置文件
    • 3. 使用LoadBalancer
    • 4. 使用 RestTemplate 进行服务调用
    • 5. 测试

问题产生背景

      以下是一个购物车项目,通过调用外部接口获取商品信息,并添加到购物车中,这段代码中有一个问题:下面的代码中直接指定了调用的url,但如果存在多个resfood服务的url,就需要修改代码,如果存在多个,就无法保证调用的url来自不同的resfood服务,所以需要使用负载均衡。负载均衡可以实现将请求平均分配到各个服务上,避免出现一直调用同一个服务的情况。

java">    @Value("${resfood.url}")private String resfoodUrl;/*** 调用外部接口,获取商品信息,并添加到itemList中* @param fid* @param item* @param itemList*/private void addItem(int fid, CartItem item, List<CartItem> itemList) {String url = resfoodUrl+fid;Map<String,Object> result = restTemplate.getForObject(url, Map.class);System.out.println(result);System.out.println(result.get("obj").getClass().getSimpleName());// ObjectMapper是Jackson提供的一个类,用于将json数据转换为java对象Resfood resfood = objectMapper.convertValue(result.get("obj"), Resfood.class);
//        CartItem cartItem = new CartItem();//原来的itemitem.setFood(resfood);//处理数量小于0的情况if(item.getNum()<=0){return;}
//            item.setNum(0);
//        cartItem.setNum(item.getNum());itemList.add(item);}

解决方案:实现LoadBalancer

      实现 Spring Cloud LoadBalancer 的前提条件:当前服务与当前服务调用的服务需要实现服务注册与发现。

1. 添加依赖

        <!--       负载均衡依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency><!--        nacos场景依赖:nacos客户端,用于将当前的微服务注册到nacos服务器中--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>

2. 配置文件

      配置nacos

  cloud:nacos:discovery:
#        nacos的服务器地址,根据实际情况修改server-addr: your_nacos_server_addrusername: nacospassword: nacos

3. 使用LoadBalancer

      在配置类中创建一个带有负载均衡功能的 RestTemplate Bean。

java">@Configuration
public class RestTemplateConfig {// 使用@LoadBalanced注解赋予RestTemplate负载均衡的能力@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

4. 使用 RestTemplate 进行服务调用

      在代码中,使用 LoadBalanced 的 RestTemplate 调用服务。

java">    @Value("${resfood.url}")private String resfoodUrl;/*** 调用外部接口,获取商品信息,并添加到itemList中* @param fid* @param item* @param itemList*/private void addItem(int fid, CartItem item, List<CartItem> itemList) {String url = resfoodUrl+fid;Map<String,Object> result = restTemplate.getForObject(url, Map.class);System.out.println(result);System.out.println(result.get("obj").getClass().getSimpleName());// ObjectMapper是Jackson提供的一个类,用于将json数据转换为java对象Resfood resfood = objectMapper.convertValue(result.get("obj"), Resfood.class);
//        CartItem cartItem = new CartItem();//原来的itemitem.setFood(resfood);//处理数量小于0的情况if(item.getNum()<=0){return;}
//            item.setNum(0);
//        cartItem.setNum(item.getNum());itemList.add(item);}

      使用服务名称代替url,让Spring Cloud LoadBalancer自动选择合适的服务实例。

resfood:url: http://res-food/resfood/getById/

5. 测试

      多开几个依赖的服务,请求需要测试的接口,测试是否能通过服务名称调用服务,并且负载均衡。

在这里插入图片描述

      请求发送到不同的服务上。

在这里插入图片描述在这里插入图片描述


http://www.ppmy.cn/news/1537846.html

相关文章

10.4学习记录

一、日常八股 1.键入网址到页面显示&#xff0c;中间发生了哪些内容? 二、Socket网络编程 在VS上复习下Socket网络编程 1.大体流程 首先做服务端&#xff0c;与在Linux上不同&#xff0c;如果要在VS上使用Socket进行网络通信&#xff0c;需要引入网络库如下: #include <…

STM32中的DMA数据转运——下篇

STM32中的DMA数据转运——上篇-CSDN博客 在上篇文章中&#xff0c;我们讨论了STM32中的DMA&#xff08;直接存储器访问&#xff09;及其工作原理、存储器类型和总线设计。接下来&#xff0c;我们将更深入地探讨DMA的具体配置方法、常见应用场景以及一些实际设计中的注意事项。…

vue3 elementUI 表单验证

1、前端配置正则表达式入存入数据库&#xff0c;前端表单反显校验 <script>const rgxFunc new RegExp(item.fieldRegexp.trim());const rules[];console.log(正则表达式, rgxFunc);console.log(正则表达式, rgxFunc.test(中文));rules.push({message: item.regexpTip ||…

Python异常处理详解:try, except, else, finally的使用方法与示例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…

[Notes] Computer Network - Overwiew

What is the Internet? The Internet is a global network of interconnected computers that communicate using standard protocols (rules). It’s not a single entity but a network of networks that allows millions of devices worldwide to exchange data. In simp…

C语言编程之SDS动态字符串

在字符串处理中&#xff0c;SDS&#xff08;Simple Dynamic Strings&#xff09;是一种动态字符串库&#xff0c;通常用于C语言编程中&#xff0c;以简化字符串的管理和操作。SDS库由Redis的开发者Salvatore Sanfilippo&#xff08;也称为antirez&#xff09;创建&#xff0c;旨…

洛谷 P11045 [蓝桥杯 2024 省 Java B] 最优分组

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] [Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis] 首先得注意这么一点&#xff1a; k k k 必须得是 n n n 的因数&#xff08;这里的 n , k n,k n,k 对应于题目的 N ,…

计算机毕业设计 | SpringBoot 房屋租赁网 租房买房卖房平台(附源码)

1&#xff0c;绪论 1.1 背景调研 在房地产行业持续火热的当今环境下&#xff0c;房地产行业和互联网行业协同发展&#xff0c;互相促进融合已经成为一种趋势和潮流。本项目实现了在线房产平台的功能&#xff0c;多种技术的灵活运用使得项目具备很好的用户体验感。 这个项目的…