微服务 分片 运维管理(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 微服务 分片 运维管理(上)


分片

分片的概念

当只有一台机器的情况下,给定时任务分片四个,在机器A启动四个线程,分别处理四个分片的内容


当有两台机器的情况下,分片由两个机器进行分配,机器A负责索引为0,1分片内容,机器B负责2,3分片内容


当有三台机器的时候,情况如图所示

当有四台机器的时候


当有五台机器的时候


当分片消耗资源少的时候,第一种情况和第二种情况没有太大区别,反之,如果消耗资源很大的时候,CPU的利用率效率会降低
分片数建议服务器个数倍数


分片案例环境搭建

案例需求
数据库中有一些列的数据,需要对这些数据进行备份操作,备份完之后,修改数据的状态,标记已经备份了

第一步:添加依赖

<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.1.10</version>
</dependency>
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.2.0</version>
</dependency>
<!--mysql驱动-->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>

第二步:添加配置

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/elastic-job-demo?serverTimezone=GMT%2B8
    driverClassName: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
    username: root
    password: 2022

第三步:添加实体类

@Data
    public class FileCustom {
        //唯⼀标识
        private Long id;
        //⽂件名
        private String name;
        //⽂件类型
        private String type;
        //⽂件内容
        private String content;
        //是否已备份
        private Boolean backedUp = false;
        public FileCustom(){}
        public FileCustom(Long id, String name, String type, String content){
            this.id = id;
            this.name = name;
            this.type = type;
            this.content = content;
        }
    }

第四步:添加任务类

        @Autowired
        private FileCustomMapper fileCustomMapper;
        @Override
        public void execute(ShardingContext shardingContext) {
            doWork();
        }
        private void doWork() {
            //查询出所有的备份任务
            List<FileCustom> fileCustoms = fileCustomMapper.selectAll();
            for (FileCustom custom:fileCustoms){
                backUp(custom);
            }
        }
        private void backUp(FileCustom custom){
            System.out.println("备份的方法名:"+custom.getName()+"备份的类型:"+custom.getType());
            System.out.println("=======================");
            //模拟进行备份操作
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            fileCustomMapper.changeState(custom.getId(),1);
        }
    }

第五步: 添加任务调度配置

@Bean(initMethod = "init")
    public SpringJobScheduler fileScheduler(FileCustomElasticjob job, CoordinatorRegistryCenter registryCenter){
        LiteJobConfiguration jobConfiguration = createJobConfiguration(job.getClass(),"0/5 * * * * ?",1);
        return new SpringJobScheduler(job,registryCenter,jobConfiguration);
    }

案例改造成任务分片

第一步:修改任务配置类

@Configuration
    public class JobConfig {
        @Bean
        public static CoordinatorRegistryCenter registryCenter(@Value("${zookeeper.url}") String url, @Value("${zookeeper.groupName}") String groupName) {
            ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration(url, groupName);
            //设置节点超时时间
            zookeeperConfiguration.setSessionTimeoutMilliseconds(100);
            //zookeeperConfiguration("zookeeper地址","项目名")
            CoordinatorRegistryCenter regCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
            regCenter.init();
            return regCenter;
        }
        //功能的方法
        private static LiteJobConfiguration createJobConfiguration(Class clazz, String corn, int shardingCount,String shardingParam) {
            JobCoreConfiguration.Builder jobBuilder = JobCoreConfiguration.newBuilder(clazz.getSimpleName(), corn, shardingCount);
            if(!StringUtils.isEmpty(shardingParam)){
                jobBuilder.shardingItemParameters(shardingParam);
            }
            //定义作业核心配置newBuilder("任务名称","corn表达式","分片数量")
            JobCoreConfiguration simpleCoreConfig = jobBuilder.build();
            // 定义SIMPLE类型配置 cn.wolfcode.MyElasticJob
            System.out.println("MyElasticJob.class.getCanonicalName---->"+ MyElasticJob.class.getCanonicalName());
            SimpleJobConfiguration simpleJobConfig = new SimpleJobConfiguration(simpleCoreConfig,clazz.getCanonicalName());
            //定义Lite作业根配置
            LiteJobConfiguration simpleJobRootConfig = LiteJobConfiguration.newBuilder(simpleJobConfig).overwrite(true).build();
            return simpleJobRootConfig;
        }
        @Bean(initMethod = "init")
        public SpringJobScheduler fileScheduler(FileCustomElasticjob job, CoordinatorRegistryCenter registryCenter){
            LiteJobConfiguration jobConfiguration = createJobConfiguration(job.getClass(),"0/10 * * * * ?",4,"0=text,1=image,2=radio,3=vedio");
            return new SpringJobScheduler(job,registryCenter,jobConfiguration);
        }
    }

第二步:修改任务类

@Component
    @Slf4j
    public class FileCustomElasticjob implements SimpleJob {
        @Autowired
        private FileCustomMapper fileCustomMapper;
        @Override
        public void execute(ShardingContext shardingContext) {
            doWork(shardingContext.getShardingParameter());
            log.info("线程ID:{},任务的名称:{},任务的参数:{},分片个数:{},分片索引号:{},分片参数:{}",
                     Thread.currentThread().getId(),
                     shardingContext.getJobName(),
                     shardingContext.getJobParameter(),
                     shardingContext.getShardingTotalCount(),
                     shardingContext.getShardingItem(),
                     shardingContext.getShardingParameter());
        }
        private void doWork(String shardingParameter) {
            //查询出所有的备份任务
            List<FileCustom> fileCustoms = fileCustomMapper.selectByType(shardingParameter);
            for (FileCustom custom:fileCustoms){
                backUp(custom);
            }
        }
        private void backUp(FileCustom custom){
            System.out.println("备份的方法名:"+custom.getName()+"备份的类型:"+custom.getType());
            System.out.println("=======================");
            //模拟进行备份操作
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            fileCustomMapper.changeState(custom.getId(),1);
        }
    }

第三步:修改Mapper映射文件

@Mapper
    public interface FileCustomMapper {
        @Select("select * from t_file_custom where backedUp = 0")
        List<FileCustom> selectAll();
        @Update("update t_file_custom set backedUp = #{state} where id = #{id}")
        int changeState(@Param("id") Long id, @Param("state")int state);
        @Select("select * from t_file_custom where backedUp = 0 and type = #{type}")
        List<FileCustom> selectByType(String shardingParameter);
    }
相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
存储 运维 数据安全/隐私保护
微服务应用运维入门
微服务应用运维入门
|
6月前
|
运维 监控 Docker
构建高效微服务架构:从理论到实践构建高效自动化运维体系:Ansible与Docker的完美融合
【5月更文挑战第31天】 在当今软件开发的世界中,微服务架构已经成为了实现可伸缩、灵活且容错的系统的关键策略。本文将深入探讨如何从零开始构建一个高效的微服务系统,涵盖从概念理解、设计原则到具体实施步骤。我们将重点讨论微服务设计的最佳实践、常用的技术栈选择、以及如何克服常见的挑战,包括服务划分、数据一致性、服务发现和网络通信等。通过实际案例分析,本文旨在为开发者提供一套实用的指南,帮助他们构建出既健壮又易于维护的微服务系统。
|
25天前
|
运维 资源调度 调度
容器微服务运维
【10月更文挑战第16天】业务容器化后,运维需采用面向容器的新型平台,主要由镜像仓库、资源调度、容器调度、调度策略和服务编排组成。镜像仓库负责存储与分发容器镜像,支持权限控制、镜像同步和高可用性设计;资源调度解决不同环境下的机器部署问题;容器调度实现容器在主机上的合理分配;调度策略优化容器主机选择;服务编排则处理服务间的依赖关系和服务发现,支持自动扩缩容以适应业务需求变化。
|
2月前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
196 3
|
6月前
|
人工智能 运维 监控
构建高性能微服务架构:现代后端开发的挑战与策略构建高效自动化运维系统的关键策略
【2月更文挑战第30天】 随着企业应用的复杂性增加,传统的单体应用架构已经难以满足快速迭代和高可用性的需求。微服务架构作为解决方案,以其服务的细粒度、独立性和弹性而受到青睐。本文将深入探讨如何构建一个高性能的微服务系统,包括关键的设计原则、常用的技术栈选择以及性能优化的最佳实践。我们将分析微服务在处理分布式事务、数据一致性以及服务发现等方面的挑战,并提出相应的解决策略。通过实例分析和案例研究,我们的目标是为后端开发人员提供一套实用的指南,帮助他们构建出既能快速响应市场变化,又能保持高效率和稳定性的微服务系统。 【2月更文挑战第30天】随着信息技术的飞速发展,企业对于信息系统的稳定性和效率要求
|
3月前
|
运维 Cloud Native 持续交付
"揭秘云原生技术:从容器化到微服务,自动化运维如何重塑未来应用架构?悬念重重,等你来探!"
【8月更文挑战第21天】随着云计算的迅猛发展,云原生技术作为设计云应用的最佳实践,正驱动企业数字化转型。本文解析云原生技术概念与特性,通过容器化(如Docker)、微服务架构(如Spring Boot)、自动化运维(如Jenkins)及持续交付等关键领域,并辅以代码实例,探讨云原生在电商等行业的应用,展现其如何助力企业实现高效、灵活与可靠的系统构建,促进业务增长。
78 0
|
4月前
|
Kubernetes Cloud Native 持续交付
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
|
5月前
|
运维 Kubernetes 云计算
云计算时代的运维革新:容器化与微服务架构的融合之道
在云计算技术飞速发展的当下,企业IT运维面临前所未有的挑战与机遇。传统的运维模式已难以满足现代业务对敏捷性、可伸缩性和自动化的需求。本文深入探讨了容器化技术和微服务架构如何共同推动运维领域的革命,通过数据支持和科学分析,揭示了这一融合趋势如何提高运维效率、降低风险并促进创新。
|
6月前
|
敏捷开发 运维 监控
【专栏】微服务架构,以敏捷、灵活著称,通过拆分大型应用为小型自治服务,简化开发运维
【4月更文挑战第27天】微服务架构,以敏捷、灵活著称,通过拆分大型应用为小型自治服务,简化开发运维。本文探讨其基本概念、起源,核心优势(如敏捷开发、高可伸缩性)及挑战(系统复杂度、数据一致性),并分享实施策略(服务划分、技术选型、CI/CD)与实践案例(Netflix、Uber、Spotify),展示微服务如何重塑软件开发,并成为未来复杂应用系统的基础。
137 1
|
6月前
|
运维 网络协议 Linux
2024年最全CentOS8 Consul微服务架构安装(1)_agent(1),Linux运维开发面试
2024年最全CentOS8 Consul微服务架构安装(1)_agent(1),Linux运维开发面试