一键部署 SpringCloud 微服务,这套流程值得学习一波儿!
文章目录
转自:https://mp.weixin.qq.com/s/5zRgI079a6BNOO0MAppgjg
前言
一键部署 springcloud 微服务,需要用到 Jenkins K8S Docker等工具。
本文使用jenkins部署,流程如下图
- 开发者将代码push到git
- 运维人员通过jenkins部署,自动到git上pull代码
- 通过maven构建代码
- 将maven构建后的jar打包成docker镜像 并 push docker镜像到docker registry
- 通过k8s发起 发布/更新 服务 操作
其中 2~5步骤都会在jenkins中进行操作
1、开发者将代码PUSH到Git
这一步本文不做详细描述
2、通过Jenkins部署,自动到Git上PULL代码
这里需要用到Jenkins 的 pipeline插件
2.1、 配置SSH-KEY
因为jenkins需要pull
git上的代码,正常来说,代码都是私有的,git clone
操作的时候会需要密码,就不能完成自动化操作了。这里使用SSH-KEY
的方式,让git clone
操作无需密码就能完成克隆
2.1.1、生成/添加SSH公钥
在jenkins所在环境里执行
ssh-keygen -t ed25519 -C "xxxxx@xxxxx.com"
注意:这里的
xxxxx@xxxxx.com
只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱,现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱
按照提示完成三次回车,即可生成 ssh key
。通过查看 ~/.ssh/id_ed25519.pub
文件内容,获取到你的 public key
得到公钥 public key 内容
cat ~/.ssh/id_ed25519.pub
2.1.2、将公钥配置到git平台
git平台可以是github,gitee,也可以是自己搭建的gitlab等
我这里使用gitee
通过仓库主页 「管理
」->「部署公钥管理
」->「添加部署公钥
」 ,添加生成的 public key 添加到仓库中。
添加成功后,到jenkins所在环境运行
ssh -T git@gitee.com
首次使用需要确认并添加主机到本机SSH可信列表。若返回 Hi XXX! You’ve successfully authenticated, but Gitee.com does not provide shell access.
内容,则证明添加成功
2.1.3、测试
复制你项目的SSH链接
在jenkins所在环境
执行git clone git@gitee.com:xxxx.git
2.2、配置Jenkins的pipeline 自动clone代码
2.2.1、Jenkins创建任务
新建任务4
选择流水线 确定
这里勾选参数化构建,选择字符参数,用于输入构建代码的版本
默认值填master,根据自身项目实际填写
拉到最下面的流水线,写pipeline脚本,如果不知道怎么写,可以点击流水线语法进行参考
这是我的脚本, REPOSITORY
填写项目的ssh地址,REPOSITORY_VERSION
是刚刚配置的构建参数
pipeline {
agent any
environment {
REPOSITORY="git@gitee.com:xxxxxx/cloud-demo.git"
}
stages {
stage('拉代码') {
steps {
echo "start fetch code from git:${REPOSITORY}"
deleteDir()
git branch: "${REPOSITORY_VERSION}", url: "${REPOSITORY}"
}
}
}
}
保存
2.2.2、测试拉代码流程
返回Jenkins 首页,选择刚刚创建的项目
点击右边的运行按钮
输入代码分支版本
点击开始构建
看到这里就是已经构建成功了
根据日志提示的目录,可以看到目录下已经有代码了
3、通过maven构建代码
3.1、maven插件安装
因为这里使用到了maven,jenkins需要先安装maven工具
3.2、maven构建项目
补充pipeline脚本
pipeline {
agent any
environment {
REPOSITORY="git@gitee.com:xxxxxx/cloud-demo.git"
MODULE="cloud-demo-m-test-dubbo-service"
}
stages {
stage('拉代码') {
steps {
echo "start fetch code from git:${REPOSITORY}"
deleteDir()
git branch: "${REPOSITORY_VERSION}", url: "${REPOSITORY}"
}
}
stage('编译代码') {
steps {
echo "start compile"
sh "cd cloud-demo-project && mvn -U clean install"
echo "compile project ................................"
sh "cd cloud-demo-dependencies && mvn -U clean install"
echo "compile dependencies ................................"
sh "cd cloud-demo-common && mvn -U clean install"
echo "compile common ................................"
sh "cd cloud-demo-m-test && mvn -U -am clean install"
echo "compile m-test ................................"
sh "cd cloud-demo-m-test/cloud-demo-m-test-common && mvn -U -am clean install"
echo "compile m-test-dubbo-api ................................"
sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-api && mvn -U -am clean install"
echo "compile m-test-dubbo-service ................................"
sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service && mvn -U -am clean package"
}
}
}
}
这里补充了stage('编译代码') {}
部分,用于maven编译。具体编译脚本需要根据自己项目实际,这个是我项目的编译必须步骤。
3.3、测试拉代码流程+构建项目过程
重复2.2.2步骤,查看运行结果
构建成功
4、将maven构建后的jar打包成docker镜像 并 push docker镜像到docker registry
在jenkins环境下,创建目录用于存放脚本文件
mkdir /usr/local/project/.env/cloud-demo-m-test-dubbo-service/ -p
这个目录下存放4个文件
- build.sh
- Dockerfile
- application.properties
- bootstrap.properties
application.properties
和 bootstrap.properties
是springcloud的配置文件,内容根据自己项目情况
buils.sh 文件内容
#!/usr/bin/env bash
REPOSITORY_VERSION=$1
GIT_REVISION=`git log -1 --pretty=format:"%h"`
TIME=`date "+%Y.%m.%d.%H.%M"`
IMAGE_NAME=192.168.31.100:5000/cloud-demo/cloud-demo-m-test-dubbo-service
IMAGE_TAG=${REPOSITORY_VERSION}-${GIT_REVISION}-${TIME}
docker build -t ${IMAGE_NAME}:${IMAGE_TAG} .
docker push ${IMAGE_NAME}:${IMAGE_TAG}
echo "${IMAGE_NAME}:${IMAGE_TAG}" > IMAGE
## 内容说明
REPOSITORY_VERSION 是需要传入的参数,传项目git分支名,用于打标签使用
GIT_REVISION 是获取当前git的提交版本 如 c9c8525,线上问题可以根据这个版本查找具体代码问题
TIME 年.月.日.时.分 记录打包时间,也用于打标签使用
IMAGE_NAME 镜像名,这里前缀包含了192.168.31.100:5000 是因为我打包之后会push到192.168.31.100:5000,其他服务器可以到这里来pull镜像
docker build -t ${IMAGE_NAME}:${IMAGE_TAG} . 构建镜像
docker push ${IMAGE_NAME}:${IMAGE_TAG} 推送镜像
echo "${IMAGE_NAME}:${IMAGE_TAG}" > IMAGE 把镜像名:镜像标签 输出到IMAGE文件里,方便后续步骤获取
Dockerfile 文件内容
FROM openjdk:8u342-jdk
MAINTAINER yanger yanger@qq.com
COPY target/cloud-demo-m-test-dubbo-service-1.0-SNAPSHOT.jar /cloud-demo-m-test-dubbo-service.jar
COPY application.properties /application.properties
COPY bootstrap.properties /bootstrap.properties
ENTRYPOINT ["java", "-jar", "/cloud-demo-m-test-dubbo-service.jar"]
## 内容说明
FROM openjdk:8u342-jdk 使用openjdk:8u342-jdk 作为基础镜像
COPY 文件到镜像
ENTRYPOINT ["java", "-jar", "/cloud-demo-m-test-dubbo-service.jar"] 启动时运行 java -jar /cloud-demo-m-test-dubbo-service.jar
这里用到了docker registry
如果还没有registry 请先启动,可以用docker的方式启动
docker run -d -p 5000:5000 --name registry registry
build.sh
文件需要可执行权限
chmod 755 build.sh
补充pipeline脚本
pipeline {
agent any
environment {
REPOSITORY="git@gitee.com:xxxxxx/cloud-demo.git"
SCRIPT_PATH="/usr/local/project/.env/cloud-demo-m-test-dubbo-service/"
}
stages {
stage('拉代码') {
steps {
echo "start fetch code from git:${REPOSITORY}"
deleteDir()
git branch: "${REPOSITORY_VERSION}", url: "${REPOSITORY}"
}
}
stage('编译代码') {
steps {
echo "start compile"
sh "cd cloud-demo-project && /usr/local/maven/bin/mvn -U clean install"
echo "compile project ................................"
sh "cd cloud-demo-dependencies && /usr/local/maven/bin/mvn -U clean install"
echo "compile dependencies ................................"
sh "cd cloud-demo-common && /usr/local/maven/bin/mvn -U clean install"
echo "compile common ................................"
sh "cd cloud-demo-m-test && /usr/local/maven/bin/mvn -U -am clean install"
echo "compile m-test ................................"
sh "cd cloud-demo-m-test/cloud-demo-m-test-common && /usr/local/maven/bin/mvn -U -am clean install"
echo "compile m-test-dubbo-api ................................"
sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-api && /usr/local/maven/bin/mvn -U -am clean install"
echo "compile m-test-dubbo-service ................................"
sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service && /usr/local/maven/bin/mvn -U -am clean package"
}
}
stage('构建镜像') {
steps {
echo "start build image"
sh "cp ${SCRIPT_PATH}/build.sh cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"
sh "cp ${SCRIPT_PATH}/Dockerfile cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"
sh "cp ${SCRIPT_PATH}/application.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"
sh "cp ${SCRIPT_PATH}/bootstrap.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"
sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/ && ./build.sh ${REPOSITORY_VERSION}"
}
}
}
}
补充了stage(‘构建镜像’){}
内容和environment
部分加了个参数 SCRIPT_PATH
SCRIPT_PATH
参数是上面创建的文件夹路径
stage(‘构建镜像’){}
这一步是复制相应文件到项目目录下,并且执行build.sh脚本
测试
可以看到镜像已经打包好,并且已经push到registry了
- 浏览器访问
http://192.168.31.100:5000/v2/cloud-demo/cloud-demo-m-test-dubbo-service/tags/list
可以看到registry有cloud-demo/cloud-demo-m-test-dubbo-service:master-7012e1d-2023.05.01.10.16
这个镜像
5、通过k8s发起 发布/更新 服务 操作
5.1、配置构建K8S资源的描述文件
- 在
/usr/local/project/.env/cloud-demo-m-test-dubbo-service/
目录新增文件cloud-demo-m-test-dubbo-service.yaml
文件内容
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: cloud-demo-m-test-dubbo-service
name: cloud-demo-m-test-dubbo-service
spec:
replicas: 1
selector:
matchLabels:
app: cloud-demo-m-test-dubbo-service
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: cloud-demo-m-test-dubbo-service
spec:
containers:
- image: IMAGE_AND_TAG
name: cloud-demo-m-test-dubbo-service
resources: {}
volumeMounts:
- name: log-path
mountPath: /logs
volumes:
- name: log-path
hostPath:
path: /root/k8s/cloud-demo-m-test-dubbo-service/logs
status: {}
---
apiVersion: v1
kind: Service
metadata:
creationTimestamp: null
labels:
app: cloud-demo-m-test-dubbo-service
name: cloud-demo-m-test-dubbo-service
spec:
ports:
- port: 20881
protocol: TCP
targetPort: 20881
selector:
app: cloud-demo-m-test-dubbo-service
type: NodePort
status:
loadBalancer: {}
这个文件是构建K8S资源的描述文件,创建deployment
和service
,暴露端口20881,挂载/logs目录到主机
其中 IMAGE_AND_TAG
是需要替换为相应 容器名:容器标签
的
5.2、完善jenkins步骤
pipeline {
agent any
environment {
REPOSITORY="git@gitee.com:xxxxxx/cloud-demo.git"
SCRIPT_PATH="/usr/local/project/.env/cloud-demo-m-test-dubbo-service"
IMAGE=""
}
stages {
stage('拉代码') {
steps {
echo "start fetch code from git:${REPOSITORY}"
deleteDir()
git branch: "${REPOSITORY_VERSION}", url: "${REPOSITORY}"
}
}
stage('编译代码') {
steps {
echo "start compile"
sh "cd cloud-demo-project && /usr/local/maven/bin/mvn -U clean install"
echo "compile project ................................"
sh "cd cloud-demo-dependencies && /usr/local/maven/bin/mvn -U clean install"
echo "compile dependencies ................................"
sh "cd cloud-demo-common && /usr/local/maven/bin/mvn -U clean install"
echo "compile common ................................"
sh "cd cloud-demo-m-test && /usr/local/maven/bin/mvn -U -am clean install"
echo "compile m-test ................................"
sh "cd cloud-demo-m-test/cloud-demo-m-test-common && /usr/local/maven/bin/mvn -U -am clean install"
echo "compile m-test-dubbo-api ................................"
sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-api && /usr/local/maven/bin/mvn -U -am clean install"
echo "compile m-test-dubbo-service ................................"
sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service && /usr/local/maven/bin/mvn -U -am clean package"
}
}
stage('构建镜像') {
steps {
echo "start build image"
sh "cp ${SCRIPT_PATH}/build.sh cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"
sh "cp ${SCRIPT_PATH}/Dockerfile cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"
sh "cp ${SCRIPT_PATH}/application.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"
sh "cp ${SCRIPT_PATH}/bootstrap.properties cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"
sh "cd cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/ && ./build.sh ${REPOSITORY_VERSION}"
}
}
stage('发布') {
steps {
echo "start deploy"
script {
IMAGE = readFile "cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/IMAGE"
IMAGE = IMAGE.trim()
if (IMAGE == "") {
throw new Exception("获取镜像名文件失败,请重试")
}
}
echo "IMAGE: -- ${IMAGE}"
sh "cp ${SCRIPT_PATH}/cloud-demo-m-test-dubbo-service.yaml cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/"
sh "sed -i \"s#IMAGE_AND_TAG#${IMAGE}#g\" cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/cloud-demo-m-test-dubbo-service.yaml"
sh "kubectl apply -f cloud-demo-m-test/dubbo/cloud-demo-m-test-dubbo-service/cloud-demo-m-test-dubbo-service.yaml"
}
}
}
}
添加了 stage('发布') {}
部分
- 通过读取IMAGE文件,获取
镜像名:镜像标签
- 如果获取不到
镜像名:镜像标签
,抛出异常 - 将
cloud-demo-m-test-dubbo-service.yaml
文件复制到工作目录 - 用镜像名:镜像标签 替换掉
IMAGE_AND_TAG
- 使用kubectl命令发布/更新服务
5.3、测试
在jenkins上构建项目
在K8S master服务器上,执行
kubectl get all
搞定!
相关文章:

Yolov11-detect训练自己的数据集
至此,整个YOLOv11的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

SpringCloud Alibaba集成 Gateway(自定义负载均衡器)、Nacos(配置中心、注册中心)、Loadbalancer
要为未被某些网关路由谓词处理的请求提供相同的CORS配置,请将属性spring.cloud.gateway.globalcors.add-to-simple-url-handler-mapping设置为true。断言(Predicate):Java8中的断言函数,Spring Cloud Gateway中的断言函数输入类型是 Spring5.0框架中的ServerWebExchange。对于所有GET请求的路径,来自docs.spring.io的请求都将允许CORS请求。

zookeeper集群部署以及zookeeper原理
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。ZooKeeper的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。ZooKeeper包含一个简单的原语集,提供Java和C的接口。

HackQuest介绍 web3 学习平台
官网地址: https://www.hackquest.io/zhHackQuest是一个专注于Web3技术教育的在线学习平台,旨在帮助全球开发者掌握区块链、加密货币和去中心化应用(DApps)领域的最新技能。该平台汇聚了超过14000名活跃开发者,与100多个领先的Web3生态系统和项目紧密合作,为用户提供全面的教育资源。

YOLOv10训练自己的数据集
至此,整个YOLOv10的训练预测阶段完成,与YOLOv8差不多。欢迎各位批评指正。

YOLOv10环境搭建、模型预测和ONNX推理
运行后会在文件yolov10s.pt存放路径下生成一个的yolov10s.onnxONNX模型文件。安装完成之后,我们简单执行下推理命令测试下效果,默认读取。终端,进入base环境,创建新环境。(1)onnx模型转换。

Zookeeper概要、协议、应用场景
Zoopkeeper提供了一套很好的分布式集群管理的机制,就是它这种基于层次型的目录树的数据结构并对树中的节点进行有效管理,从而可以设计出多种多样的分布式的数据管理模型,作为分布式系统的沟通调度桥梁。

SSO 单点登录和 OAuth2.0 有何区别?
此方法的缺点是它依赖于浏览器和会话状态,对于分布式或者微服务系统而言,可能需要在服务端做会话共享,但是服务端会话共享效率比较低,这不是一个好的方案。在单点登录的上下文中,OAuth 可以用作一个中介,用户在一个“授权服务器”上登录,并获得一个访问令牌,该令牌可以用于访问其他“资源服务器”上的资源。首先,SSO 主要关注用户在多个应用程序和服务之间的无缝切换和保持登录状态的问题。这种方法通过将登录认证和业务系统分离,使用独立的登录中心,实现了在登录中心登录后,所有相关的业务系统都能免登录访问资源。

微服务全做错了!谷歌提出新方法,成本直接降9倍!
一位DataDog的客户收到6500万美元的云监控账单的消息,也再次让业界无数人惊到了。事实上有些团队在将集中式单体应用拆分为微服务时,首先进行的往往不是建立领域模型,而只是按照业务功能将原来单体应用的一个软件包拆分成多个所谓的“微服务”软件包,而这些“微服务”内的代码高度耦合,逻辑边界不清晰,长期以来,不管大厂还是小厂,微服务都被认为是云原生服务应用程序架构的事实标准,然而2023,不止那位37signals的DHH决心下云,放弃微服务,就连亚马逊和谷歌等这些云巨头,正在带头开始革了微服务的命。

SpringCloud远程调用为啥要采用HTTP,而不是RPC?
通俗的说法就是:比如说现在有两台服务器A和B,一个应用部署在A服务器上,另一个应用部署在B服务器上,如果A应用想要调用B应用提供的方法,由于他们不在一台机器下,也就是说它们不在一个JVM内存空间中,是无法直接调用的,需要通过网络进行调用,那这个调用过程就叫做RPC。建立Socket连接至少需要一对套接字,其中一个运行于客户端,称为ClientSocket ,另一个运行于服务器端,称为ServerSocket ,套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

一键部署 SpringCloud 微服务,这套流程值得学习一波儿!
一键部署 springcloud 微服务,需要用到 Jenkins K8S Docker等工具。本文使用jenkins部署,流程如下图开发者将代码push到git运维人员通过jenkins部署,自动到git上pull代码通过maven构建代码将maven构建后的jar打包成docker镜像 并 push docker镜像到docker registry通过k8s发起 发布/更新 服务 操作其中 2~5步骤都会在jenkins中进行操作。

YOLOv7-Pose 姿态估计-环境搭建和推理
终端,进入base环境,创建新环境,我这里创建的是p38t17(python3.8,pytorch1.7)安装pytorch:(网络环境比较差时,耗时会比较长)下载好后打开yolov7-pose源码包。imgpath:需要预测的图片的存放路径。modelpath:模型的存放路径。Yolov7-pose权重下载。打开工程后,进入设置。

Springboot + oauth2 单点登录 - 原理篇
OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0。授权码模式(authorization code)密码模式(resource owner password credentials)客户端模式(client credentials) 不常用。

JAVA 中 13 种锁的实现方式
分布式系统时代,线程并发,资源抢占,慢慢变得很重要。那么常见的锁都有哪些?

三种方式实现分布式锁
通过以上过程你可以发现锁的获取是按照创建时间来的,谁先来争取锁谁就先获得锁,因此它实现的是公平锁。答案是不能,以Synchronized关键字为例,Synchronized关键字无论是在偏向锁、轻量级锁还是重量级锁状态都不能实现这点,如重量级锁,重量级锁是靠系统底层的互斥量Mutex实现的,也就是说每个节点(服务器)所使用的互斥量是分开的,节点A的互斥量是无法锁住节点B的线程访问临界区,因此Synchronized关键字只能保证单服务器内的JVM进程的不同线程同步,是不能用做分布式环境中来保证线程同步。

浅谈Java分布式与集群
在日常操作中,相信很多人在怎么理解Java分布式与集群问题上存在疑惑,今天就大概说说,不注意听,觉得两个可能是同一个东西,其实这个是两个概念。一句话概括:分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率。

java面试题:分布式和微服务的区别
分布式架构解决的是如何将一个大的系统划分为多个业务模块这些业务模块会分别部署到不同的机器上,通过接口进行数据交互的问题。微服务是指很小的服务,可以小到只完成一个功能,这个服务可以单独部署运行,不同服务之间通过rpc调用。分布式架构是将一个大的系统划分为多个业务模块,这些业务模块会分别部署到不同的机器上,通过接口进行数据交互。微服务架构是架构设计方式,是设计层面的东西,一般考虑如何将系统从逻辑上进行拆分,也就是垂直拆分。分布式系统是部署层面的东西,即强调物理层面的组成,即系统的各子系统部署在不同计算机上。

深度学习硬件基础:CPU与GPU
CPU:叫做中央处理器(central processing unit)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。[^3]可以形象的理解为有25%的ALU(运算单元)、有25%的Control(控制单元)、50%的Cache(缓存单元)GPU:叫做图形处理器。

k8s搭建部署(超详细)
Kubernetes是Google 2014年创建管理的,是Google 10多年大规模容器管理技术Borg的开源版本。它是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。快速部署应用快速扩展应用无缝对接新的应用功能节省资源,优化硬件资源的使用可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)可扩展: 模块化, 插件化, 可挂载, 可组合自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展。

YOLOv8-Detect训练CoCo数据集+自己的数据集
至此,整个训练预测阶段完成。此过程同样可以在linux系统上进行,在数据准备过程中需要仔细,保证最后得到的数据准确,最好是用显卡进行训练。有问题评论区见!

NRF24L01模块传输MPU6050数据,接收端数据一直为0问题记录
问题描述:一、发射端1、正确配置NRF模块,以及测试过能够正常通信,在发射端的发射线程中进行了如下操作2、这里是获取了陀螺仪的x轴数据,将其而分为两个8位的数据存入发送缓冲区中。因为一个陀螺仪x轴数据是16位的,所以对其进行了拆分,这里只获取gyro的x轴数据进行发送,目的是进行测试。3、这个是发送函数,只要把发送缓冲区的地址作为参数传入就可以发送了。二、接收端1、接收端的NRF24L01模块也正确配置后,在接收线程中进行如下操作2、读取NRF传输过来的数据,存到接收BUF中,然后打印

YOLOv5中Ghostbottleneck结构shortcut=True和shortcut=False有什么区别
GhostBotleneck结构中的shodcut=True和shorcut=False的区别在干是否使用残差连接。当shorcu=True时,使用残差连接,可以以加速模型的收敛速度和提高模型的准确率,当shorcu=False时,不使用残差连接,可以减少模型的参数数量和计算量。实际上不只是Ghostbottleneck具有残差连接,在C3、C2f等具有Bottleneck模块的结构均可根据此例举一反三。残差块是深度卷积神经网络中的一种基本模块,可以有效地解决梯度消失和梯度爆炸的问题。

什么是数据中台?
说完了数据中台诞生的历史背景,现在,我们应该对数据中台有了一定的了解,那我们现在给数据中台下个定义。自2016年,数据中台被提出以来,不同的人对数据中台有不同的理解,就像一千个读者心中有一千个哈姆雷特,因此也有许多不同的定义,以下是我从一些文章、书籍中搜集到的关于数据中台的定义:数据中台是DT时代的大背景下,为实现数据快(快速)、准(准确)、省(低成本)赋能业务发展的目标,将企业的数据统一整合起来,基于Onedata方法论借助大数据平台完成数据的统一加工处理,对外提供数据服务的一套机制。

python基础小知识:引用和赋值的区别
通过引用,就可以在程序范围内任何地方传递大型对象而不必在途中进行开销巨大的赋值操作。不过需要注意的是,这种赋值仅能做到顶层赋值,如果出现嵌套的情况下仍不能进行深层赋值。赋值与引用不同,复制后会产生一个新的对象,原对象修改后不会影响到新的对象。如果在原位置修改这个可变对象时,可能会影响程序其他位置对这个对象的引用

这些年背过的面试题——架构设计篇
对技术人来说,面试成功的道路只有一条,就是好好准备技术基础。本文是面试系列文章架构设计篇,作者把自己的八股文和一些经验总结汇总在一起,供大家参考。

基于深度学习的细胞感染性识别与判定
通过引入深度学习技术,我们能够更精准地识别细胞是否受到感染,为医生提供更及时的信息,有助于制定更有效的治疗方案。基于深度学习的方法通过学习大量样本,能够自动提取特征并进行准确的感染性判定,为医学研究提供了更高效和可靠的手段。通过引入先进的深度学习技术,我们能够实现更快速、准确的感染性判定,为医学研究和临床实践提供更为可靠的工具。其准确性和效率将为医学研究带来新的突破,为疾病的早期诊断和治疗提供更可靠的支持。通过大规模的训练,模型能够学到细胞感染的特征,并在未知数据上做出准确的预测。

C#winform上位机开发学习笔记3-串口助手的信息保存功能添加
上位机开发的系列学习笔记,避免遗忘多记录多补充多优化

Redis的key过期策略是怎么实现的
这是一道经典的Redis面试题,一个Redis中可能存在很多很多的key,这些key中可能有很大一部分都有过期时间,此时Redis服务器咋知道哪些key已经过期,哪些还没过期呢?如果直接遍历所有的key,这显然是行不通的,效率非常低!!Redis整体的策略是定期删除和惰性删除相结合。举个栗子:假如我去小卖铺买东西,付款的时候,发现东西过期了。就告知老板,于是老板下架此产品。消费者发现过期了,才去下架,这就叫。小卖铺老板主动定期抽取一部分商品,进行筛查,这就叫定期删除。

一键式Excel分词统计工具:如何轻松打包Python脚本为EXE
最近,表姐遇到了一个挑战:需要从Excel文件中统计出经过分词处理的重复字段,但由于数据隐私问题,这些Excel文件不能外传。这种情况下,直接使用Excel内置功能好像是行不通的,需要借助Python脚本来实现。为了解决这个问题,我写了一个简单的数据分析和自动化办公脚本,以方便使用。想象一下,即使电脑上没有安装Python,也能通过一个简单的EXE文件轻松完成工作,这是多么方便!因此,我决定不仅要写出这个脚本,还要学会如何将其打包成一个独立的EXE文件。这样,无需Python环境的电脑也能直接运行它

STM32 SPI通信协议3——读取MAX6675温度传感器
无论是发送还是接收都要判断一下标志位,因为串行通信的缓冲区只有一个,即是发送缓冲区,也是接收缓冲区。接收的时候也是如此。==0的时候,MAX6675启动,此时你需要发送一个激励给他,让他启动,启动后MAX6675开始发送数据,这时候就要用到SPI_I2S_ReceiveData开始接收数据。从MAX6675的数据手册能看到D15是虚假的位,D14-D3是我们的温度数据位,D2在正常工作时为0(低电平)。==0的时候SCK启动,数据线开始发送信息,此时可以读取数据,当数据读完后,再拉高电平停止发送。