微服务架构中的负载均衡与服务注册中心(Nacos)

1. 负载均衡:解决实际业务问题

1.1 业务场景思考

想象一个电子商务平台的微服务架构。我们有一个订单服务和多个用户服务实例。当订单服务需要调用用户服务时,它如何选择具体调用哪一台用户服务器?这就是负载均衡要解决的核心问题。

1.2 常用负载均衡算法及其业务影响

1.2.1 轮询(Round Robin)
  • 原理:请求依次分配给每个服务器。
  • 业务影响
    • 优点:实现简单,在服务器性能相近的情况下能达到较好的负载平衡。
    • 缺点:不考虑服务器当前负载,可能导致某些正在处理复杂请求的服务器过载。
1.2.2 加权轮询(Weighted Round Robin)
  • 原理:根据服务器的性能赋予权重,性能较好的服务器处理更多请求。
  • 业务场景:假设用户服务有3台服务器:
    • 8080端口:权重1
    • 8081端口:权重1
    • 8082端口:权重2(性能更高)
  • 请求分配示例
    1. 用户1请求 → 8080
    2. 用户2请求 → 8081
    3. 用户3请求 → 8082
    4. 用户4请求 → 8082
  • 业务影响
    • 优点:可以根据服务器实际性能分配负载,提高资源利用率。
    • 缺点:需要手动配置和调整权重,不能自动适应服务器状态变化。
1.2.3 最小连接(Least Connections)
  • 原理:将新请求分配给当前连接数最少的服务器。
  • 业务影响
    • 优点:能够动态调整,避免将请求分配给已经负载较重的服务器。
    • 缺点:可能不适用于长连接服务,因为连接数不一定反映真实负载。
1.2.4 哈希(Hash)
  • 原理:根据请求的某个特征(如用户ID)计算哈希值,将相同哈希值的请求发送到同一服务器。
  • 业务场景
    • 用户A的所有请求都发送到8080端口的服务器
    • 用户B的所有请求都发送到8081端口的服务器
  • 业务影响
    • 优点:可以实现会话保持,有利于缓存利用和状态管理。
    • 缺点:可能导致负载不均衡,特别是在有"热点"用户的情况下。
1.2.5 随机(Random)
  • 原理:随机选择一个服务器处理请求。
  • 业务影响
    • 优点:实现简单,在请求量很大时能达到类似轮询的效果。
    • 缺点:短期内可能导致负载不均衡。

1.3 负载均衡的实际应用

以下是一个简单的随机负载均衡算法的Java实现示例,可以用于订单服务调用用户服务:

public class UserServiceLoadBalancer {
    private String[] userServiceUrls;
    private Random random;

    public UserServiceLoadBalancer(String[] userServiceUrls) {
        this.userServiceUrls = userServiceUrls;
        this.random = new Random();
    }

    public String getRandomUserService() {
        int index = random.nextInt(userServiceUrls.length);
        return userServiceUrls[index];
    }
}

// 使用示例
public class OrderService {
    private UserServiceLoadBalancer loadBalancer;

    public OrderService() {
        String[] userServices = {
            "http://localhost:8080/user/info",
            "http://localhost:8081/user/info",
            "http://localhost:8082/user/info"
        };
        this.loadBalancer = new UserServiceLoadBalancer(userServices);
    }

    public void processOrder(int userId) {
        String userServiceUrl = loadBalancer.getRandomUserService();
        // 使用选中的用户服务URL处理订单
        System.out.println("Processing order for user " + userId + " using service: " + userServiceUrl);
    }
}

2. 服务注册与发现:动态管理服务实例

2.1 业务场景思考

在一个快速发展的电商平台中,用户服务可能需要经常扩容或者进行维护。如果订单服务中硬编码了用户服务的地址,每次用户服务发生变化都需要修改订单服务的代码并重新部署,这显然是不可接受的。

2.2 注册中心的核心业务流程

  1. 服务注册

    • 用户服务启动时,向注册中心注册自己的信息(如服务名、URL、端口号)。
    • 示例:用户服务启动时调用注册中心的注册接口。
  2. 状态同步

    • 用户服务定期向注册中心发送心跳,更新自己的状态。
    • 如果注册中心在一定时间内没有收到心跳,会将该服务标记为不可用。
  3. 服务发现

    • 订单服务需要调用用户服务时,先从注册中心获取可用的用户服务列表。
    • 然后使用负载均衡算法选择一个具体的服务实例进行调用。
  4. 服务下线

    • 当用户服务需要下线维护时,主动向注册中心发送下线请求。
    • 注册中心将该服务从可用列表中移除,确保不会有新的请求被路由到该服务。

2.3 注册中心的数据结构示例

{
  "userService": [
    {"url": "localhost", "port": 8080, "lastHeartbeat": "2024-09-10 10:58:00"},
    {"url": "localhost", "port": 8081, "lastHeartbeat": "2024-09-10 10:59:00"},
    {"url": "localhost", "port": 8082, "lastHeartbeat": "2024-09-10 10:59:30"}
  ]
}

2.4 使用Nacos作为注册中心

Nacos是一个功能强大的注册中心和配置管理平台。以下是在Spring Boot项目中使用Nacos的基本步骤:

  1. 添加依赖
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2021.1</version>
</dependency>
  1. 配置Nacos服务器地址

application.properties中添加:

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=user-service

服务启动后的访问地址:http://localhost:8848/nacos/
类似:
在这里插入图片描述

  1. 启用服务注册与发现

在主类上添加@EnableDiscoveryClient注解:

@SpringBootApplication
@EnableDiscoveryClient
public class UserServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserServiceApplication.class, args);
    }
}
  1. 服务调用

在订单服务中使用@LoadBalanced注解和RestTemplate进行服务调用:

@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@Service
public class OrderService {
    @Autowired
    private RestTemplate restTemplate;

    public void processOrder(int userId) {
        UserInfo userInfo = restTemplate.getForObject("http://user-service/user/info/" + userId, UserInfo.class);
        // 处理订单逻辑
    }
}

3. 实际业务中的最佳实践

  1. 选择合适的负载均衡策略

    • 对于无状态服务,可以使用轮询或加权轮询。
    • 对于有状态服务或需要会话保持的场景,考虑使用哈希策略。
  2. 实现智能健康检查

    • 不仅检查服务是否在线,还要检查服务的响应时间和错误率。
    • 当发现服务性能下降时,及时将其从可用列表中移除。
  3. 实现优雅的服务下线

    • 在服务下线前,先停止接收新请求,等待当前请求处理完毕后再下线。
  4. 采用蓝绿部署或金丝雀发布

    • 使用注册中心和负载均衡,可以方便地实现蓝绿部署或金丝雀发布,降低发布风险。
  5. 监控和告警

    • 对服务的健康状态、负载情况进行实时监控。
    • 设置合理的告警阈值,及时发现和解决问题。

结论

通过合理使用负载均衡和注册中心,我们可以构建一个更加健壮、可扩展的微服务架构。这不仅提高了系统的可用性,还大大增强了运维的灵活性。在实际业务中,要根据具体的场景选择合适的策略,并持续优化以应对不断变化的业务需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/881433.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTML5好看的水果蔬菜在线商城网站源码系列模板2

文章目录 1.设计来源1.1 主界面1.2 商品列表界面1.3 商品详情界面1.4 其他界面效果 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/142059220 HTML5好看的水果蔬菜在线商城…

并查集LRU cache

并查集的定义 将n个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这类问题的抽象数据类型称为并查集(unio…

2024华为杯研赛E题保姆级教程思路分析

E题题目&#xff1a;高速公路应急车道紧急启用模型 今年的E题设计到图像/视频处理&#xff0c;实际上&#xff0c;E题的难度相对来说较低&#xff0c;大家不用畏惧视频的处理&#xff0c;被这个吓到。实际上&#xff0c;这个不难&#xff0c;解决了视频的处理问题&#xff0c;…

Hazel 2024

不喜欢游戏的人也可以做引擎&#xff0c;比如 cherno 引擎的作用主要是有两点&#xff1a; 将数据可视化交互 当然有些引擎的功能也包含有制作数据文件&#xff0c;称之为资产 assets 不做窗口类的应用栈&#xff0c;可能要花一年才能做一个能实际使用的应用&#xff0c;只需…

笔记整理—内核!启动!—linux应用编程、网络编程部分(2)linux的文件管理策略

关于硬盘中的静态文件与inode&#xff1a;例如文件存储在扇区中&#xff0c;一个文件占用10个字节&#xff0c;一个扇区为512字节&#xff0c;这样的情况下一个扇区就只放了一个实际为10字节的文件&#xff0c;余下的502字节不可存放其他文件&#xff0c;因为扇区已经是可以访问…

机器学习 | Scikit Learn中的普通最小二乘法和岭回归

在统计建模中&#xff0c;普通最小二乘法&#xff08;OLS&#xff09;和岭回归是两种广泛使用的线性回归分析技术。OLS是一种传统的方法&#xff0c;它通过最小化预测值和实际值之间的平方误差之和来找到数据的最佳拟合线。然而&#xff0c;OLS可以遭受高方差和过拟合时&#x…

基于PHP的电脑线上销售系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于phpMySQL的电脑线上销售系…

【C语言】自定义类型——联合和枚举

目录 一、联合体&#xff08;共用体&#xff09; &#xff08;1&#xff09;联合体类型的声明 &#xff08;2&#xff09;联合体类型的特点 &#xff08;3&#xff09;联合体和结构体的比较 &#xff08;4&#xff09;联合体大小的计算 &#xff08;5&#xff09;联合体的…

RK3588/RK3588s运行yolov8达到27ms

前言 Hello&#xff0c;小伙伴们~~我最近做了一个比较有意思的东西&#xff0c;想起来也好久没有写博客了&#xff0c;就记录一下吧。希望和大家一起学习&#xff0c;一起进步&#xff01; 我简单介绍一下我最近做的这个东西的经过哈~上个月在B站上看到了一个博主发了一条视频关…

Qt 模型视图(四):代理类QAbstractItemDelegate

文章目录 Qt 模型视图(四):代理类QAbstractItemDelegate1.基本概念1.1.使用现有代理1.2.一个简单的代理 2.提供编辑器3.向模型提交数据4.更新编辑器的几何图形5.编辑提示 Qt 模型视图(四):代理类QAbstractItemDelegate ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方…

Docker笔记-容器数据卷

Docker笔记-容器数据卷 docker的理念将运行的环境打包形成容器运行&#xff0c;运行可以伴随容器&#xff0c;但是我们对数据的要求是希望持久化&#xff0c;容器 之间可以共享数据&#xff0c;Docker容器产生的数据&#xff0c;如果不通过docker commit生成新的镜像&#xf…

assign是赋值,不是连接

如下图是一个top文件的背压 如果把原本应该是外界输入的变量m_ip_hdr_ready通过phv_parser_hdr_ready来“赋值&#xff01;&#xff01;&#xff01;”&#xff0c;那么模块内部本该有的ready信号&#xff0c;就会是Z高阻态&#xff0c;因为没有给到值。 正确的赋值 将整个模…

【医疗大数据】医疗保健领域的大数据管理:采用挑战和影响

选自期刊**《International Journal of Information Management》**&#xff08;IF:21.0) 医疗保健领域的大数据管理&#xff1a;采用挑战和影响 1、研究背景 本研究的目标是调查阻止医疗机构实施成功大数据系统的组织障碍&#xff0c;识别和评估这些障碍&#xff0c;并为管理…

微信小程序拨打电话点取消报错“errMsg“:“makePhoneCall:fail cancel“

问题&#xff1a;微信小程序中拨打电话点取消&#xff0c;控制台报错"errMsg":"makePhoneCall:fail cancel" 解决方法&#xff1a;在后面加上catch就可以解决这个报错 wx.makePhoneCall({phoneNumber: 181********}).catch((e) > {console.log(e) //用…

调整pycharm中的字体大小

1.找到设置 2.打开setting &#xff0c;按照图示操作即可

YOLOv5白皮书-第Y1周:调用官方权重进行检测

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](小团体&#xff5e;第八波) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](K同学啊-CSDN博客)** 一、前言 拖了好久&#xff0c;终于要开始目标检测系列了。自己想过好几次&#xf…

中秋节特别游戏:给玉兔投喂月饼

&#x1f5bc;️ 效果展示 &#x1f4dc; 游戏背景 在中秋这个充满诗意的节日里&#xff0c;玉兔因为贪玩被赶下人间。在这个温柔的夜晚&#xff0c;我们希望通过一个小游戏&#xff0c;让玉兔感受到人间的温暖和关怀。&#x1f430;&#x1f319; &#x1f3ae; 游戏设计 人…

Broadcast:Android中实现组件及进程间通信

目录 一&#xff0c;Broadcast和BroadcastReceiver 1&#xff0c;简介 2&#xff0c;广播使用 二&#xff0c;静态注册和动态注册 三&#xff0c;无序广播和有序广播 1&#xff0c;有序广播的使用 2&#xff0c;有序广播的截断 3&#xff0c;有序广播的信息传递 四&am…

[产品管理-15]:NPDP新产品开发 - 13 - 产品创新流程 - 具体产品的创新流程:精益生产与敏捷开发

目录 前言&#xff1a;​ 一、集成产品开发IPD模型——集成跨功能团队的产品开发 1.1 概述 1、IPD模型的核心思想 2、IPD模型的主要组成部分 3、IPD模型的实施步骤 4、IPD模型的优点 1.2 基于IPD系统的组织实践等级 1.3 IPD的优缺点 二、瀑布开发模型 1、定义与特点…

21、Tomato

难度 低(个人认为中) 目标 root权限 一个flag 使用VMware启动 kali 192.168.152.56 靶机 192.168.152.66 信息收集 端口信息收集 可以看到有个ftp服务&#xff0c;2211实际是ssh协议端口&#xff0c;80、8888是一个web服务 web测试 80端口显示一个tomato 查看源码给了一些…