【DevOps系列】构建Devops系统
开始介绍
那就着手开始干吧。先介绍一下我们的工具链。
主要工具:GitHub、Jenkins、Kubernetes、Ansible、Prometheus和JMeter
着手动
1. 设置GitHub作为源代码仓库
-
登录GitHub: 打开浏览器并访问 https://github.com,使用您的GitHub账户登录。
-
创建新的仓库: 登录后,您应该能看到GitHub的主页。点击页面右上角的 "+" 符号,然后选择 "New repository" 或直接在导航栏中找到 "Repositories" 并点击 "New"。
-
填写仓库信息: 在新弹出的页面中,您会被要求填写一些关于仓库的基本信息:
- Repository name: 输入仓库的名称。这将是您的项目在GitHub上的标识。
- Description: 可选地,您可以为仓库添加一个描述,解释其用途或内容。
- Visibility: 选择仓库的可见性。您可以选择 "Public"(公开)或 "Private"(私有)。私有仓库需要付费订阅。
- Add a README file: 选中此选项将自动为您的仓库添加一个README文件,这是仓库的默认说明文件。
- Add .gitignore: 如果适用,可以选择添加一个.gitignore文件,这将帮助您忽略特定类型的文件或目录,例如编译后的文件或操作系统特定的缓存文件。
- Add a license: 如果您的项目遵循某种开源许可证,这里可以选择添加一个许可证模板。
-
创建仓库: 填写完所有必要的信息后,点击页面底部的 "Create repository" 按钮。
-
初始化本地仓库: 创建仓库后,GitHub会显示初始化本地仓库的命令。您需要在本地机器上安装Git,并在您希望存放项目代码的目录中运行以下命令:
git init初始化完成后,使用以下命令将本地仓库与GitHub仓库关联:
git remote add origin https://github.com/yourusername/your-reponame.git -
推送代码到GitHub: 将您的代码添加到本地仓库中,然后使用以下命令将代码推送到GitHub:
git add . git commit -m "Initial commit" git push -u origin main
2. 配置Jenkins作为持续集成/持续交付服务器
步骤1: 安装Jenkins
- 下载Jenkins: 访问Jenkins官方网站 Download and deploy 下载适合您操作系统的Jenkins安装包。
- 安装Jenkins:
- Linux: 使用RPM或DEB包安装,或通过Docker容器运行。
- Windows: 下载Windows安装程序并运行。
- macOS: 可以通过Homebrew安装。
- 启动Jenkins: 根据您的操作系统,使用相应的命令或服务管理工具启动Jenkins。
- 初始化Jenkins: 第一次启动时,Jenkins会引导您完成初始化过程,包括解锁Jenkins和设置管理员密码。
步骤2: 配置Jenkins
A. 解锁Jenkins
- 获取初始管理员密码: Jenkins会提示您从
/var/lib/jenkins/目录下的密钥文件中获取初始密码。 - 输入密码解锁: 在浏览器中输入密码解锁Jenkins。
B. 安装插件
- 安装推荐插件: Jenkins会推荐一组插件,选择 “Install” 安装它们。
- 安装额外插件: 根据项目需求,可能需要安装额外的插件,如 GitHub Plugin, Git Plugin, Kubernetes Plugin, Docker Pipeline Plugin 等。
C. 创建第一个管理员用户
- 设置用户名和密码: 创建一个新的管理员账户。
- 保存设置: 完成后,保存并完成初始化过程。
步骤3: 创建Jenkins Job
- 新建Job: 在Jenkins主页点击 “New Item”。
- 选择Job类型: 选择适合的类型,如 “Freestyle project” 或者 “Pipeline”。
- 配置Job:
- General: 给Job命名,添加描述。
- Source Code Management: 配置源代码管理,如 Git,指定仓库URL、分支等。
- Build Triggers: 设置触发构建的条件,如代码提交、定时任务等。
- Build Environment: 可以在这里设置环境变量或脚本。
- Build Steps: 添加构建步骤,如执行shell命令、调用Maven或Gradle命令等。
- Post-build Actions: 配置构建后的动作,如发送邮件通知、部署到Kubernetes等。
- Save: 保存配置。
步骤4: 集成GitHub
- 安装GitHub Plugin: 如果还未安装,确保已经安装了GitHub Plugin。
- 配置GitHub Credentials: 在Jenkins的全局配置中添加GitHub的访问令牌。
- 配置Job: 在Job配置中,选择GitHub作为源代码管理,并使用前面创建的Credentials。
步骤5: 测试和优化
- 手动触发构建: 开始手动触发构建,检查是否一切正常。
- 自动化构建: 设置自动化触发,如通过GitHub webhook来自动触发构建。
- 监控和日志: 查看构建日志,监控构建状态,确保没有错误发生。
步骤6: 部署至Kubernetes
- 配置Kubernetes Plugin: 安装Kubernetes Plugin,如果还未安装的话。
- 添加Kubernetes Credentials: 在Jenkins中添加Kubernetes集群的凭证。
- 配置部署步骤: 在Job的构建步骤中添加Kubernetes部署命令。
通过以上步骤,就可以配置好Jenkins作为持续集成和持续交付的服务器了。确保在实际操作中,根据您的具体需求和环境进行适当的调整。
3. 部署Kubernetes集群
配置Kubernetes集群,对于一个普通的团队而言,最划算的是直接使用云服务商提供的云服务器,这样也不用麻烦自己搭建。但是如果想要自己搭建的话,也是可以的,这边介绍使用kubeadm来搭建kubernetes集群。
准备工作
-
服务器准备:
- 确保每台服务器或虚拟机都满足Kubernetes的系统要求。
- 每台机器上都需要安装Linux操作系统(如CentOS、Ubuntu等)。
-
关闭防火墙和SELinux: 这是为了简化安装过程,但在生产环境中,你可能需要配置防火墙规则而不是完全禁用它。
sudo systemctl stop firewalld sudo systemctl disable firewalld sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config -
禁用Swap: Kubernetes不支持在有活跃swap的系统上运行。
sudo swapoff -a
安装Kubernetes
-
安装必要的软件包:
sudo apt-get update && sudo apt-get install -y apt-transport-https curl -
添加Kubernetes的GPG密钥:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - -
添加Kubernetes的APT仓库:
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF -
安装Kubernetes的组件:
sudo apt-get update && sudo apt-get install -y kubelet kubeadm kubectl
配置和初始化主节点
-
初始化Master节点:
sudo kubeadm init --pod-network-cidr=<CIDR><CIDR>应替换为你的Pod网络CIDR,例如10.244.0.0/16。 -
设置kubeconfig: 初始化完成后,
kubeadm init会输出一些信息,包括一个kubectl配置文件的位置。你需要把这个配置文件复制到你的用户主目录下。mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
加入Worker节点
- 运行
kubeadm join命令: 在初始化Master节点后,kubeadm init会输出一个kubeadm join命令。在每个Worker节点上运行这个命令以加入集群。
配置网络插件
- 安装网络插件: 通常使用像Flannel、Calico或Weave Net这样的网络插件。以Flannel为例:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
验证集群状态
-
检查节点状态:
kubectl get nodes -
检查集群状态:
1kubectl cluster-info
以上步骤提供了搭建Kubernetes集群的基本流程。在生产环境中,你可能还需要考虑更多因素,如高可用性、安全性和性能优化等。另外,许多云服务商如AWS、Google Cloud和Azure都提供了托管的Kubernetes服务,可以大大简化部署和维护的复杂度。
4. 使用Ansible自动化部署
配置Ansible用于自动化部署通常涉及到以下几个关键步骤:
-
安装Ansible 首先确保Ansible已经安装在你的控制节点(即运行Ansible命令的机器)上。如果你还没有安装,可以在Linux系统上使用如下命令进行安装:
sudo apt update sudo apt install ansible -
配置Ansible Ansible的配置文件通常位于
/etc/ansible/ansible.cfg,你可以在此文件中修改一些默认配置,例如SSH超时时间、重试次数等。 -
创建Inventory文件 Inventory文件是用来定义目标主机列表以及它们的变量的地方。可以使用INI格式或YAML格式。例如:
[webservers] host1.example.com host2.example.com[dbservers] db1.example.com db2.example.com或者使用动态inventory脚本。
-
编写Playbooks Playbooks是Ansible的核心,使用YAML语法编写,用来定义要执行的任务序列。例如,一个简单的playbook可能看起来像这样:
- name: Deploy web applicationhosts: webserversbecome: yestasks:- name: Update apt cacheapt:update_cache: yes- name: Install Apacheapt:name: apache2state: latest- name: Copy HTML filescopy:src: ./html_files/dest: /var/www/html/owner: www-datagroup: www-datamode: 0644- name: Restart Apacheservice:name: apache2state: restartedenabled: yes -
执行Playbook 使用
ansible-playbook命令来执行playbook:1ansible-playbook -i inventory.ini deploy_webapp.yml -
使用Role和Modules Ansible的Role提供了一种组织playbook的方式,使得代码更加模块化和可重用。Modules则是Ansible执行特定任务的小型程序。
-
测试和调试 使用
--check选项来测试playbook是否会按预期工作,而不做任何更改:1ansible-playbook -i inventory.ini deploy_webapp.yml --check -
优化和维护 随着Ansible playbooks的增加,你可能需要优化它们以适应不断变化的需求,比如添加错误处理、使用变量、模板化配置文件等。
-
集成CI/CD 将Ansible集成到持续集成/持续交付(CI/CD)管道中,例如与Jenkins、GitLab CI/CD或CircleCI配合使用,以便在代码变更时自动执行部署。
-
安全和权限 确保Ansible操作的安全性,例如使用
become关键字来提升权限,使用Vault加密敏感信息,以及限制谁可以执行Ansible操作。
5. 配置Prometheus和Grafana进行监控
1. 安装Prometheus
首先,你需要在一台服务器上安装Prometheus。Prometheus可以从其官方网站下载适用于不同操作系统的二进制文件。以下是在Linux上安装Prometheus的简要步骤:
下载Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v<version>/prometheus-<version>.linux-amd64.tar.gz
tar xvfz prometheus-<version>.linux-amd64.tar.gz
移动文件到适当位置
sudo mv prometheus-<version>.linux-amd64/prometheus /usr/local/bin/prometheus
sudo mv prometheus-<version>.linux-amd64/promtool /usr/local/bin/promtool
sudo rm -rf prometheus-<version>.linux-amd64
创建配置文件
sudo nano /etc/prometheus/prometheus.yml
然后在配置文件中添加目标监控的job和scrape配置。
2. 启动Prometheus
启动Prometheus,通常使用systemd或作为Docker容器运行。
使用systemd
sudo nano /etc/systemd/system/prometheus.service
在文件中添加Prometheus服务的定义,保存并重新加载systemd配置,然后启动Prometheus。
sudo systemctl daemon-reload
sudo systemctl start prometheus
sudo systemctl enable prometheus
3. 安装Grafana
Grafana可以从其官方网站下载或通过包管理器安装。
使用APT安装
1sudo apt-get install -y adduser libfontconfig1
2wget https://dl.grafana.com/oss/release/grafana_8.0.0_amd64.deb
3sudo dpkg -i grafana_8.0.0_amd64.deb
启动Grafana
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
4. 配置Grafana
打开浏览器,访问Grafana的Web界面,默认地址是 http://localhost:3000,使用默认的用户名和密码登录(admin/admin)。
添加数据源
在Grafana中添加Prometheus作为数据源。
创建仪表板
使用Grafana创建新的仪表板,并添加图表来展示Prometheus收集的数据。
5. 配置Exporter和Target
如果需要监控特定的应用或服务,可能需要安装相应的Exporter。例如,对于Node Exporter、Blackbox Exporter或其他特定的服务Exporter。
6. 配置Alerting(可选)
如果需要配置警报,可以使用Prometheus的Alertmanager,配置规则并设定警报条件。
请注意,实际配置可能会因具体需求和环境而异,上述步骤提供了基础框架。在生产环境中,你可能需要更详细的规划,如安全性、持久存储、高可用性和扩展性等方面的考虑。
6. 使用JMeter进行性能测试
6. 运行测试计划
完成配置后,点击工具栏上的绿色三角形图标(运行按钮)或选择 "Run -> Start" 来运行测试计划。
7. 分析结果
测试运行完成后,使用 "View Results Tree" 或 "Aggregate Report" 等监听器来查看和分析测试结果。
-
1. 安装 Java
JMeter 是基于 Java 构建的,因此首先需要在你的计算机上安装 Java Development Kit (JDK)。你可以从 Oracle 的官方网站下载最新版本的 JDK,并按照指示进行安装。安装完成后,确保设置好环境变量,使
java命令可以在命令行中全局调用。2. 下载和安装 JMeter
访问 Apache JMeter 的官方网站下载最新版本的 JMeter ZIP 包。解压缩下载的 ZIP 文件到你希望存放 JMeter 的目录。
3. 配置 JMeter 属性
在 JMeter 目录下的
bin文件夹中,找到jmeter.properties文件。使用文本编辑器打开它,你可以在这里配置各种 JMeter 的行为。例如,如果你想将界面语言更改为中文,可以取消注释language=zh_CN这一行。4. 运行 JMeter
打开命令行或终端,导航到 JMeter 的
bin目录,并运行jmeter.sh(Unix/Linux)或jmeter.bat(Windows)。这将启动 JMeter 的图形界面。5. 创建测试计划
一旦 JMeter 运行起来,你可以开始创建测试计划。测试计划是所有测试元素的容器,包括线程组、采样器、监听器等。
步骤如下:
-
新建测试计划:
- 选择 "Test Plan" 并从上下文菜单中选择 "Add -> Logic Controller -> Simple Controller" 来添加逻辑控制器(如果需要)。
-
添加线程组:
- 在测试计划或逻辑控制器下添加 "Thread Group",这将定义测试的并发用户数和循环次数。
-
添加采样器:
- 在线程组下添加 "Sampler",如 "HTTP Request Default",用于向目标服务器发送请求。
- 配置请求的 URL、方法、参数等。
-
添加监听器:
- 添加 "Listener" 如 "View Results Tree" 或 "Summary Report",以便观察和分析测试结果。
-
配置其他元素:
- 根据需要添加断言、定时器、配置元件等。
7. 整合所有组件
使用Jenkins Pipeline as Code功能,可以将构建、测试和部署的步骤整合成一个自动化流水线。下面是一个示例,展示了如何使用Declarative Pipeline语法来实现这一过程,该流水线包括构建、单元测试、集成测试、静态代码分析、打包、部署以及使用Prometheus和Grafana进行监控。
Jenkinsfile 示例
在项目根目录中创建一个名为 Jenkinsfile 的文件,然后输入以下内容:
pipeline {agent anyenvironment {DOCKER_REGISTRY = "your-docker-registry-url"IMAGE_NAME = "your-image-name"TAG = "${env.BUILD_NUMBER}"}stages {stage('Build') {steps {script {sh 'mvn clean package'}}}stage('Test') {steps {script {sh 'mvn test'}}post {always {junit 'target/surefire-reports/*.xml'}}}stage('Static Analysis') {steps {script {sh 'mvn checkstyle:checkstyle'}}post {always {archiveArtifacts 'target/checkstyle-result.xml'publishHTML target: [allowMissing: true,alwaysLinkToLastBuild: false,keepAll: true,reportDir: 'target/site/checkstyle',reportFiles: 'index.html',reportName: 'Checkstyle Report',reportTitles: '']}}}stage('Package') {steps {script {sh 'docker build -t ${IMAGE_NAME}:${TAG} .'sh 'docker tag ${IMAGE_NAME}:${TAG} ${DOCKER_REGISTRY}/${IMAGE_NAME}:${TAG}'sh 'docker push ${DOCKER_REGISTRY}/${IMAGE_NAME}:${TAG}'}}}stage('Deploy') {steps {script {sh 'kubectl apply -f kubernetes/deployment.yaml'sh 'kubectl apply -f kubernetes/service.yaml'}}}stage('Prometheus & Grafana Setup') {steps {script {sh 'kubectl apply -f monitoring/prometheus.yml'sh 'kubectl apply -f monitoring/grafana.yml'}}}}options {timeout(time: 30, unit: 'MINUTES')}triggers {pollSCM('*/30 * * * *')}
}
- Agent:指定流水线应该在哪个节点上运行。
- Environment:定义流水线中使用的环境变量。
- Stages:流水线中的各个阶段。
- Steps:每个阶段执行的具体操作。
- Post:阶段结束后执行的操作,例如收集测试报告、静态分析报告等。
- Options:定义流水线的额外选项,例如超时时间。
- Triggers:触发流水线执行的条件,例如定期执行或代码提交时。
这样,整条流水线就可以转起来了。当然,中间的细节,需要依照实际的情况进行调整,不过这边整个devops平台基本就是 完整了。
相关文章:
【DevOps系列】构建Devops系统
开始介绍 那就着手开始干吧。先介绍一下我们的工具链。 主要工具:GitHub、Jenkins、Kubernetes、Ansible、Prometheus和JMeter 着手动 1. 设置GitHub作为源代码仓库 登录GitHub: 打开浏览器并访问 https://github.com,使用您的GitHub账户登录。 创建…...
ABAP打印WORD的解决方案
客户要求按照固定格式输出到WORD模板中,目前OLE和DOI研究了均不太适合用于这种需求。 cl_docx_document类可以将WORD转化为XML文件,利用替换字符串方法将文档内容进行填充同 时不破坏WORD现有格式。 首先需要将WORD的单元格用各种预定义的字符进行填充,为后续替换作准备…...
emr部署hive并适配达梦数据库
作者:振鹭 一、达梦 用户、数据库初始化 1、创建hive的元数据库 create tablespace hive_meta datafile /dm8/data/DAMENG/hive_meta.dbf size 100 autoextend on next 1 maxsize 2048;2、创建数据库的用户 create user hive identified by "hive12345&quo…...
王春城:怎么用精益思维重塑企业战略规划格局?
当下,企业战略规划的灵活性和适应性变得至关重要。传统的战略规划方法往往过于僵化和静态,难以应对市场的不确定性和变化。因此,引入精益思维来重塑企业战略规划格局,成为了许多企业寻求突破和创新的途径。具体步骤如深圳天行健企…...
git reset
git reset [--soft | --mixed | --hard] [HEAD] 表格版 原始内容reset前reset命令reset后本地工作区暂存区本地仓库本地工作区暂存区本地仓库本地工作区暂存区本地仓库READMEREADMEREADMEREADMEREADMEREADME--soft HEADREADMEREADMEREADMEa.txta.txtb.txtb.txtb.txtb.txtc.tx…...
E17.【C语言】练习:sizeof和strlen的辨析
先回顾http://t.csdnimg.cn/aYHl6 1. char acX[] "abcdefg"; char acY[] { a,b,c,d,e,f,g}; 以下说法正确的是( ) A.数组acX和数组acY等价 B.数组acX和数组acY的长度相同 C.sizeof(acX)>sizeof (acY) D.strlen (acX)>strlen (acY) 分析:…...
便携气象站:科技助力气象观测
在科技飞速发展的今天,便携气象站以其轻便、高效、全面的特点,正逐渐改变着气象观测的传统模式。这款小巧而强大的设备,不仅为气象学研究和气象灾害预警提供了有力支持,更为户外活动、农业生产等领域带来了诸多便利。 便携气象站是…...
php 存储复杂的json格式查询(如:经纬度)
在开发中,有时我们可能存了一些复杂json格式不知道怎么查。我这里提供给大家参考下: 一、先上表数据格式(location字段的possiton经纬度以逗号分开的) {"title":"澳海文澜府","position":"11…...
UDP网口(1)概述
文章目录 1.计算机网络知识在互联网中的应用2.认识FPGA实现UDP网口通信3.FPGA实现UDP网口通信的方案4.FPGA实现UDP网口文章安排5.传送门 1.计算机网络知识在互联网中的应用 以在浏览器中输入淘宝网为例,介绍数据在互联网是如何传输的。我们将要发送的数据包称作A&a…...
Linux - 进程的概念、状态、僵尸进程、孤儿进程及进程优先级
进程基本概念 课本概念:在编程或软件工程的上下文中,进程通常被视为正在执行的程序的实例。当你启动一个应用程序时,操作系统会为这个程序创建一个进程。每个进程都有自己的独立内存空间,可以运行自己的指令序列,并可能…...
Gradle依赖报告:项目依赖树的X光机
Gradle依赖报告:项目依赖树的X光机 在复杂的软件项目中,依赖管理是确保应用正常构建和运行的关键。Gradle作为一个强大的构建工具,提供了依赖报告功能,帮助开发者分析和理解项目的依赖树。本文将详细介绍如何在Gradle中使用依赖报…...
开源XDR-SIEM一体化平台 Wazuh (1)基础架构
简介 Wazuh平台提供了XDR和SIEM功能,保护云、容器和服务器工作负载。这些功能包括日志数据分析、入侵和恶意软件检测、文件完整性监控、配置评估、漏洞检测以及对法规遵从性的支持。详细信息可以参考Wazuh - Open Source XDR. Open Source SIEM.官方网站 Wazuh解决…...
从零开始:构建基于深度学习的实时跌倒检测系统(UI界面+YOLO代码+数据集)
注意看文末的结局与声明 一、引言 1. 项目背景与动机 在老年人和高危职业环境中,跌倒是一种常见的事故,可能导致严重的伤害甚至致命。实时跌倒检测系统可以及时发现并报警,提供紧急救助。通过深度学习技术,可以提高跌倒检测的准…...
【策略模式在项目中的实际应用】
业务场景 最最近项目中有这样的一个业务场景: 用户下单->管理员审核->配送员接单->配送中->送达–>签收->完成 整个业务以这种流程的形式存在,每个流程状态的业务不一样,考虑到多种状态如果直接写一个接口肯定会嵌套太多…...
昇思25天学习打卡营第14天|计算机视觉
昇思25天学习打卡营第14天 文章目录 昇思25天学习打卡营第14天FCN图像语义分割语义分割模型简介网络特点数据处理数据预处理数据加载训练集可视化 网络构建网络流程 训练准备导入VGG-16部分预训练权重损失函数自定义评价指标 Metrics 模型训练模型评估模型推理总结引用 打卡记录…...
将json数组格式转成数组
start cmd [ 27 01 f7 01 24 38 02 b7 42 6e ee 2f 69 46 72 21 74 44 c4 22 7a 92 d8 6a de 66 61 b1 1e 2f de ee 5c 31 57 db df 01 31 2d c9 01 01 c0 FB ] set_ulpk {“jsonrpc”:“2.0”,“type”:2,“id”:0,“method”:“method”,“message”:{“VALUE”:[56,2,183,66…...
接口测试之测试原则、测试用例、测试流程详解
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、接口的介绍 软件测试中,常说的接口有两种:图形用户接口(GUI,人与程序的接口)、应用程序编程接口&…...
证书上的服务器名错误解决方法
方法 win r ,输入mmc 点击文件——>添加/删除管理单元 找到证书——> 添加 根据自己的存放选择存放位置 点击控制台根节点——> 受信任的根证书颁发机构——>导入 若还出现问题,则参考https://blog.csdn.net/mm120138687/article/details/…...
前端:上传2进制图片
1、let formData new FormData(); 2、添加要传的字段:formData.append("avatarfile", data); (key,value) 3、上传文件 function uploadImg() {// 1定义FormDatalet formData new FormData();// 2添加字段formData.append("…...
web前端 React 框架面试200题(三)
面试题 65. 在使用 React Router时,如何获取当前页面的路由或浏览器中地址栏中的地址? 参考回答: 在当前组件的 props中,包含 location属性对象,包含当前页面路由地址信息,在 match中存储当前路由的参数等…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
