Bootstrap

Jenkins-Zookeeper-Docker-XXLJOB-Rancher

Jenkins

实战

1 新建任务需要的配置pipeline

该代码是Jenkinsfile,用于定义一个持续集成/持续交付(CI/CD)的流水线;

pipeline {
    agent any
    // 表示该流水线可以在任何可用的Jenkins节点上执行;
    
    // 定义变量
    // JOB_NAME  任务名称,对应容器服务名,例如:market_ods/mms_api
    // RegistryUrl 在全局环境变量中配置
    // ImageVer 容器版本,格式yyyyMMddHHmm,插件 Timestamp
    // 
    // 创建访问Git全局凭据, credentialsId: 'gitpw-3789060f-ecb5-468e-c161-32076710d930'
    // 创建访问私有镜像仓库全局凭据, credentialsId: 'imagepw-8a88451c-0565-6f0d-694c-fa20344a3179'

    environment { // 定义环境变量
        PLAT="as"    // 定义平台
        PROJECT="jenkins_xxx"    // 定义项目程序
        PROJECT_GIT="project_xxx"    // 定义项目程序
        GIT_URL="http://gitlab地址/${PROJECT_GIT}.git" // git仓库链接
        JAVA_HOME="/usr/local/jdk1.8.0_361"
        MAVEN_HOME="/usr/local/maven3.6"
                PATH="$MAVEN_HOME/bin:$PATH"
    }
    options{ 
        // 插件:Build Timestamp 
        timestamps() // 用于在构建日志中添加时间戳;
    }
    parameters {
        // 插件:Git Parameter  http://www.manongjc.com/detail/63-ncmakycccpkqxsr.html
        gitParameter (name: 'Git_Branch', defaultValue: 'master', type: 'PT_BRANCH', useRepository: env.GIT_URL, description: '请选择项目GIT分支', branchFilter: 'origin/(.*)', branch:'', quickFilterEnabled: true, selectedValue: 'TOP', sortMode: 'NONE', tagFilter: '*')
        // 构建Git_Rranch,用户可以在构建时选择不同的Git分支。
    } 
    stages { // 定义流水线的各个阶段;
        stage('脚本执行环境'){
            steps {
                sh """
                    echo "$JAVA_HOME"
                    java --version
                    mvn --version
                    git version
                    docker -v
                """
                script {
                    buildName "#${BUILD_NUMBER} ${RegistryUrl}/${PLAT}/${PROJECT}:${ImageVer}"
                }
            }
        }
        // 删除当前目录(${WORKSPACE})下内容,通常用在构建完毕之后清空工作空间
        stage('Delete Workspace') { 
            steps {
                echo "清理工作目录: ${WORKSPACE}"
                deleteDir()
            }
        }
        // 拉取代码 http://www.manongjc.com/detail/63-ncmakycccpkqxsr.html
        stage('Checkout') {      
            steps {
                checkout([$class: 'GitSCM', 
                    branches: [[name: "${params.Git_Branch}"]],
                    userRemoteConfigs: [[credentialsId: 'gitpw-3789060f-ecb5-468e-c161-32076710d930', url: env.GIT_URL]],
                    submoduleCfg: [], 
                    doGenerateSubmoduleConfigurations: false, 
                    extensions: [[$class: 'CloneOption', depth: 1, noTags: false, reference: '', shallow: true]]
                ])
            }
        }
        // mvn打包
        stage('Packaging project') {        
            steps {
                script {
                    sh 'mvn clean install'
                }
            }
        }
        //构建并推送镜像
        stage('Build & Push Image to nexus') {
            steps {
                script {
                     // 第一个参数是私有仓库地址,注意要带http(s),第二个参数是账号密码登录凭证,需要提前创建
                    docker.withRegistry("https://${RegistryUrl}", 'imagepw-8a88451c-0565-6f0d-694c-fa20344a3179') {
                        def image = docker.build("${RegistryUrl}/${PLAT}/${PROJECT}:${ImageVer}", "${WORKSPACE}")
                        image.push()
                    }
                }
            }
        }
        stage('Deploy to the Target server') {
            steps {
                echo '部署到目标服务器'
                withCredentials([file(credentialsId: 'k8s_config', variable: 'KUBECONFIG')]) {
                    sh 'kubectl set image deployment/${PROJECT} ${PROJECT}=${RegistryUrl}/${PLAT}/${PROJECT}:${ImageVer} -ndev'

                }
            }
        }
    }
}

Zookeeper

基础

是什么?

Leaf分布式ID生成系统在Spring Boot或类似的微服务架构中的集成配置。Leaf是由滴滴出行开源的一套分布式ID生成解决方案,旨在为分布式系统提供高效、高可用的ID生成服务。

配置内容?

  leaf:
  // Leaf ID生成系统的顶级配置
    snowflake:
    // Leaf提供了两种ID生成模式,一种是基于Twitter Snowflake算法的snowflake模式,另一种是基于数据库的segment模式。这里的配置是针对Snowflake模式的。
      enabled: true
      // 启用Snowflake模式的ID生成器
      name: associated_api
      // Snowflake worker的名称,用于标识不同的业务或者服务。在多服务共用一套Leaf集群的情况下,通过名称区分不同来源的ID请求,确保ID的唯一性和可追踪性。
      zkAddress: 127.0.0.1:2181
      // 配置了Zookeeper的地址。Leaf的Snowflake模式依赖于Zookeeper作为服务发现和分布式协调工具,用来管理worker的分配与状态同步。

Docker

基础

核心概念

image:镜像
	docker镜像是一个只读的模板,类似于面向对象编程中的类和实例中的类;
	通常是由dockerfile构建;
	镜像用于部署容器;
container:容器
	容器是从镜像启动的一个运行实例,将镜像的文件系统映射到一个隔离的进程空间中,提供一个运行环境给应用程序;
	

常用命令

docker version
# 获取docker的版本信息
docker exec -it 容器id /bin/bash
# 启动image 创建容器

实操

1:windows11 docker mysql

参考博客1:https://blog.csdn.net/nmajsjpy/article/details/130183104
参考博客2:https://blog.csdn.net/joeyoj/article/details/136427362

2:docker部署 xxljob

见目录中的《本地配置XXL-JOB》

container间调用异常问题
描述:
可以打开xxl-job网页,但是没有办法登录;
网址是:http://127.0.0.1:9056/xxl-job-admin/toLogin
无法实现登录

分析:
数据库连接出现问题,原因是项目中配置的数据库账号密码与本地的不相同,但是镜像中的xxl-job又不能进行修改,所以需要重新搭建匹配xxl-job的mysql数据库;
下载xxl-job项目代码,按照properties配置文件定义mysql;

总结:
xxl-job和mysql分别都属于不同的contains,这样不能实现xxl-job项目调用mysql数据库,可以本地电脑运行xxl-job项目,调用docker中的数据库;

Dockerhouse

Dockerhub

xxl-Job

基础

简介

XXL-JOB 
	是一个分布式任务调度平台,核心设计目标是开发迅速、学习简单、轻量级、易扩展;
	
@XxlJob 以声明的形式定义和管理任务,无需编写复杂的调度逻辑,简化了定时任务和分布式任务的开发过程;

参考:https://www.xuxueli.com/xxl-job/#3.3%20GLUE%E6%A8%A1%E5%BC%8F

配置文件

xxl.job: 
# 分布式任务调度平台,包含一个调度中心以及多个执行器节点;
  admin.addresses: 
  # 配置调度中心的地址列表,格式一般为http://ip:port
  executor:
  # 配置关于执行器节点的设置
    appname: qh-opn-api
    # 执行器的名称,用于在调度中心显示和识别
    ip:
    # 执行器所在的机器IP地址
    # 默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;
    # 地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
    port: 9992
    # 执行器监听的任务调度端口,单机部署多个执行器时,注意要配置不同执行器端口;
    logpath: /data/qh/opn/api/xxl-job/jobhandler
    # 任务执行日志的保存路径
    logretentiondays: 3
    # 日志文件保留天数,超过这个期限的日志文件会被清理
  accessToken: cde0ca3b87144737857c18b092f7f9a4
  # 安全令牌,用于身份验证,确保调度中心和执行器之间的通信安全,是一个密钥。

XXL-JOB页面配置

执行流程:

先创建执行器,然后在执行器中创建任务;

在这里插入图片描述
创建执行器:
在这里插入图片描述
注意:

注册方式:选择自动注册,当测试服务器该项目正常运行后,会自动分配ip以及port,并将该port配置到代码中的对应位置。

创建任务:
在这里插入图片描述

本地docker配置XXL-JOB

参考博客:
https://blog.csdn.net/TM007_/article/details/134186550

配置过程:

打开docker,拉去镜像;
	docker pull xuxueli/xxl-job-admin:2.2.0
运行docker,创建容器:
	docker run -d 
	-e PARAMS="--spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-		8&autoReconnect=true&serverTimezone=UTC 
	--spring.datasource.username=root 
	--spring.datasource.password=root_pwd 
	--spring.datasource.driver-class-name=com.mysql.jdbc.Driver" 
	-p  9056:8080 
	-v /home/gxm/docker:/data/applogs 
	--name my-xxl-job-admin-2.4.0  
	-d xuxueli/xxl-job-admin:2.4.0
	// 创建容器对应的id d5edf1339ec6bce60843d50216e49fa881ae3fd79dead98e1cdc1b23ee645885
// 注意:将mysql的ip;port配置成本地电脑中docker中的对应内容。

将本地打包的镜像,放入docker desktop中
	docker load -i xxx.tar文件,不支持.jar

结果:
不能运行,失败。

实战

1:@XxlJob注解

@XxlJob(value = "shardFetchKeysIntoCache") 
// 理解:
注解@XxlJob,用于标识一个任务处理方法;
value属性,给这个任务命名;

2:XxlJobHelper的getxxx方法

int shardIndex = XxlJobHelper.getShardIndex();
int shardTotal = XxlJobHelper.getShardTotal(); 
// 理解:
XxlJobHelper.getShardIndex() --》当前执行任务的分片索引;  
XxlJobHelper.getShardTotal() --》当前总的分片数量;

XxlJob是一个开源的分布式任务调度平台,常用于Java应用中实现定时任务的调度和管理。
XxlJobHelper类,应该是任务调度框架中的辅助类,用于处理任务分片。

3:XxlJobLogger和XxlJobHelper的区别与联系

两者在分布式任务调度平台中用于不同的目的,核心区别在于日志记录方面;
XxlJobLogger:
	早期版本,用于日志记录的组件,提供一个简单的接口来记录任务执行时的信息,通常在执行器端记录日志,便于监控和协调;在后续xxx版本中已经被废弃,被XxlJobHelper替代;
	目前已知的是 2.3.0版本是没有该类的,也就是可能从该版本之后就没有了。
XxlJobHelper:
	日志工具,并包含了多种功能的辅助类,旨在简化任务执行过程中的常见操作。

4:雪花算法 snowflakeID

snowflakeID.getWorkerId()
snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。
其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096ID),最后还有一个符号位,永远是0。
一共有64bit。

5:DistributedLock

DistributedLock是一个.NET库,基于各种底层技术提供强大且易于使用的分布式互斥体、读写器锁和信号量。
是一个抽象的概念,表示一种可以跨多个服务实例或进程协调的锁定机制。在分布式环境中,这种锁是必要的,因为它可以确保即使在网络分区或高并发情况下,资源的访问也是安全和有序的。

DistributedLock.methodLock(xxx):
methodLock 特别指在方法级别应用的分布式锁。这意味着每当调用带有这种方法锁的方法时,系统会自动尝试获取锁。
DistributedLock.redisUnlock(xxx):
这个方法通常是指在使用Redis作为分布式锁的实现时,用来释放之前获取的锁。
在分布式系统中,当多个服务实例尝试访问共享资源时,分布式锁可以确保一次只有一个服务实例能够进行修改,从而避免竞态条件和数据不一致性。

6:ReturnT

ReturnT<T>是一个通用的返回对象类型,通常在JavaRESTful API、微服务架构或RPC(远程过程调用)框架中使用,比如在dubbo、spring cloud等服务框架中。它被设计为一个容器,用于封装方法调用的结果,包括数据、状态码和错误信息等,使得调用者能够清晰地了解调用结果的状态。

ReturnT<T> 通常包含以下几个关键部分:
泛型参数 T:表示返回的数据类型,它可以是任何类型的对象,包括基本类型、自定义对象、集合等。
状态码 code:表示调用是否成功,通常0表示成功,非0表示失败或异常。
消息 msg:描述调用的结果,比如“操作成功”、“参数错误”等。
数据 data:包含调用的实际结果数据,如果没有数据,可以为空或null

7:调度失败,执行器地址为空

描述:
在这里插入图片描述
分析:

在xxl-job项目以及功能项目中的,xxl.job.accessToken设置成相同的参数,就可以解决该问题。

8:执行结果失败

描述:

java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.xxl.job.core.handler.impl.MethodJobHandler.execute(MethodJobHandler.java:29) at com.xxl.job.core.thread.JobThread.run(JobThread.java:166) Caused by: java.lang.NullPointerException at com.unicom.autoconfigure.leaf.core.IdWorker.getWorkerId(IdWorker.java:40) at com.unicom.anon.sub.local.dispather.ApplyIpDispather.applyIpCacheHandler(ApplyIpDispather.java:30) ... 6 more

分析:

Rancher

基础

思考

  1. Rancher与Kubernetes之间关系?
RancherKubernetes都是容器编排和管理的强大工具,但它们在设计理念和实际应用上有一些区别。
Rancher着重于用户体验,而Kubernetes则更多被视为一个可扩展的平台。

实战

1:Rancher的某个namespace的scale为0

在这里插入图片描述
在Rancher中,scale通常指的是Deployment、ReplicaSet或者StatefulSet,这类工作负载资源的副本数量;
某个namespace的scale=0,表示这个namespace下的某类工作负载的副本数量被设置为0;
这将产生如下情况:

资源不运行任何副本:没有Pod实例正在运行,不会对外提供服务;
节省资源:没有运行Pod,集群的计算和内存资源可以被释放或用于其他任务;
停止服务:任何试图想访问该服务的请求都将无法得到响应;
更新和维护:scale=0 可以进行应用更新或维护的一种策略,以确保在更改过程中没有活跃流量;

名词概念解释:



;