当前位置: 首页 > news >正文

SpringCloud——负载均衡

一.负载均衡

1.问题提出

上一篇文章写了服务注册和服务发现的相关内容。这里再提出一个新问题,如果我给一个服务开了多个端口,这几个端口都可以访问服务。

例如,在上一篇文章的基础上,我又新开了9091和9092端口,现在重新启动服务,查看访问的端口号:

通过运行发现,无论我怎么刷新,访问的永远是一个端口:

2.LoadBalance

负载均衡是高并发高可用系统中的必不可少的关键组件。我们上面的问题就可以使用负载均衡来解决。负载均衡可以按照一定规则分配资源。

负载均衡分为服务端负载均衡客户端负载均衡

1)服务端负载均衡

在服务端采用负载均衡算法分配资源,常用的有Nginx。

2)客户端负载均衡

在客户端采用负载均衡算法分配资源,客户端从注册中心获取服务列表,在发送请求前通过负载均衡算法选择⼀个服务器,然后进行访问。

二.SpringCloudLoadBalancer

SpringCloud从2020.0.1版本开始移除了Ribbon组件,使用SpringCloudLoadBalancer组件来代替Ribbon实现客户端负载均衡

1.添加注解

给 RestTemplate 添加注解@LoadBalanced

@Configuration
public class BeanConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

2.修改远程调用代码

将IP和端口号改成应用名:

@Resource
RestTemplate restTemplate;@RequestMapping("/{orderId}")
public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId) {OrderInfo orderInfo = orderMapper.selectByOrderId(orderId);//String url = "http://127.0.0.1:9090/product/"+ orderInfo.getProductId();String url = "http://product-service/product/"+ orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;
}

然后启动验证即可。

3.负载均衡策略

SpringCloudLoadBalancer仅支持两种负载均衡策略:

1)轮询:服务器轮流处理用户请求;

2)随机选择:随机选择一个服务器处理请求。

SpringCloudLoadBalancer默认的负载均衡策略是轮询,当然我们也可以将其改成随机选择,具体方法在SpringCloud官网也有介绍。

public class LoadBalancerConfig {@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class),name);}
}

接着在RestTemplate配置类上,使用@LoadBalancerClient或@LoadBalancerClients注解,两个注解的区别在于有没有多个服务提供者。

这两个注解有两个注解属性:

1)name:负载均衡对哪个服务生效;

2)configuration:使用哪个负载均衡策略。

@LoadBalancerClient(name = "product-service",configuration = LoadBalancerConfig.class)
@Configuration
public class BeanConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}
}

相关文章:

  • Mediamtx与FFmpeg远程与本地推拉流使用
  • 信息系统项目管理工程师备考计算类真题讲解七
  • 【晶振】晶振的工作原理及其与单片机关系
  • 【C语言】C语言中的联合体与枚举类型
  • 网站高可用架构设计基础——高可用策略和架构原则
  • 关于nginx,负载均衡是什么?它能给我们的业务带来什么?怎么去配置它?
  • Spring Boot + MyBatis-Plus 的现代开发模式
  • uniapp跨平台开发---switchTab:fail page `/undefined` is not found
  • HTML邮件背景图兼容 Outlook
  • HTML响应式网页设计与跨平台适配
  • 基于RFID的智能家居系统设计与实现
  • C++:函数重载
  • 【Python Web开发】02-Socket网络编程02
  • 从零到精通:全面解析人工智能的核心技术与发展趋势
  • 矩阵运营的限流问题本质上是平台与创作者之间的流量博弈
  • 高德MCP制作旅游攻略
  • NLP高频面试题(五十三)——深度学习正则化详解
  • Vue: el-select选项中如何显示label之外的其他信息
  • CentOS系统中MySQL安装步骤分享
  • kotlin和MVVM的结合使用总结(二)
  • 建投读书会·东西汇流|东西方戏剧在上海的相逢、交锋与融合
  • 今年一季度上海离境退税商品销售额7.6亿元,同比增85%
  • 范福生受审:任高密市长、市委书记时滥用职权,致公共财产利益重大损失
  • 叶迪奇任陆金所控股董事长,赵容奭继续担任CEO
  • 城事|喊侬白相,长兴太湖9号公路邀上海市民共赴诗意之旅
  • “75后”新任四川泸州市委副书记张伟,已任市政府党组书记