搭建RAGFlow
RAGFlow 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂格式数据提供可靠的问答以及有理有据的引用。
前提条件
- CPU >= 4 核
- RAM >= 16 GB
- Disk >= 50 GB
- Docker >= 24.0.0 & Docker Compose >= v2.26.1
如果你并没有在本机安装 Docker(Windows、Mac,或者 Linux), 可以参考文档 Install Docker Engine 自行安装。
🚀 启动服务器
-
确保
vm.max_map_count
不小于 262144:如需确认
vm.max_map_count
的大小:$ sysctl vm.max_map_count
如果
vm.max_map_count
的值小于 262144,可以进行重置:# 这里我们设为 262144: $ sudo sysctl -w vm.max_map_count=262144
你的改动会在下次系统重启时被重置。如果希望做永久改动,还需要在 /etc/sysctl.conf 文件里把
vm.max_map_count
的值再相应更新一遍:vm.max_map_count=262144
-
克隆仓库:
$ git clone https://github.com/infiniflow/ragflow.git
-
进入 docker 文件夹,利用提前编译好的 Docker 镜像启动服务器:
运行以下命令会自动下载 dev 版的 RAGFlow slim Docker 镜像(
dev-slim
),该镜像并不包含 embedding 模型以及一些 Python 库,因此镜像大小约 1GB。$ cd ragflow/docker $ docker compose -f docker-compose.yml up -d
- 如果你想下载并运行特定版本的 RAGFlow slim Docker 镜像,请在 docker/.env 文件中找到
RAGFLOW_IMAGE
变量,将其改为对应版本。例如RAGFLOW_IMAGE=infiniflow/ragflow:v0.13.0-slim
,然后再运行上述命令。 - 如果您想安装内置 embedding 模型和 Python 库的 dev 版本的 Docker 镜像,需要将 docker/.env 文件中的
RAGFLOW_IMAGE
变量修改为:RAGFLOW_IMAGE=infiniflow/ragflow:dev
。 - 如果您想安装内置 embedding 模型和 Python 库的指定版本的 RAGFlow Docker 镜像,需要将 docker/.env 文件中的
RAGFLOW_IMAGE
变量修改为:RAGFLOW_IMAGE=infiniflow/ragflow:v0.13.0(当前改的这个)
。修改后,再运行上面的命令。 注意: 安装内置 embedding 模型和 Python 库的指定版本的 RAGFlow Docker 镜像大小约 9 GB,可能需要更长时间下载,请耐心等待。
- 如果你想下载并运行特定版本的 RAGFlow slim Docker 镜像,请在 docker/.env 文件中找到
-
服务器启动成功后再次确认服务器状态:
$ docker logs -f ragflow-server
出现以下界面提示说明服务器启动成功:
____ ___ ______ ______ __ / __ \ / | / ____// ____// /____ _ __/ /_/ // /| | / / __ / /_ / // __ \| | /| / // _, _// ___ |/ /_/ // __/ / // /_/ /| |/ |/ / /_/ |_|/_/ |_|\____//_/ /_/ \____/ |__/|__/ * Running on all addresses (0.0.0.0)* Running on http://127.0.0.1:9380* Running on http://x.x.x.x:9380INFO:werkzeug:Press CTRL+C to quit
如果您跳过这一步系统确认步骤就登录 RAGFlow,你的浏览器有可能会提示
network anormal
或网络异常
,因为 RAGFlow 可能并未完全启动成功。 -
在你的浏览器中输入你的服务器对应的 IP 地址并登录 RAGFlow。
上面这个例子中,您只需输入 http://IP_OF_YOUR_MACHINE 即可:未改动过配置则无需输入端口(默认的 HTTP 服务端口 80)。
-
在 service_conf.yaml 文件的
user_default_llm
栏配置 LLM factory,并在API_KEY
栏填写和你选择的大模型相对应的 API key。详见 llm_api_key_setup。
好戏开始,接着奏乐接着舞!
🔧 系统配置
系统配置涉及以下三份文件:
- .env:存放一些基本的系统环境变量,比如
SVR_HTTP_PORT
、MYSQL_PASSWORD
、MINIO_PASSWORD
等。 - service_conf.yaml:配置各类后台服务。
- docker-compose.yml: 系统依赖该文件完成启动。
请务必确保 .env 文件中的变量设置与 service_conf.yaml 文件中的配置保持一致!
如果不能访问镜像站点hub.docker.com或者模型站点huggingface.co,请按照.env注释修改RAGFLOW_IMAGE
和HF_ENDPOINT
。
./docker/README 文件提供了环境变量设置和服务配置的详细信息。请一定要确保 ./docker/README 文件当中列出来的环境变量的值与 service_conf.yaml 文件当中的系统配置保持一致。
如需更新默认的 HTTP 服务端口(80), 可以在 docker-compose.yml 文件中将配置 80:80
改为 <YOUR_SERVING_PORT>:80
。
所有系统配置都需要通过系统重启生效:
$ docker compose -f docker-compose.yml up -d
按照上面的文档默认启动后,检查日志是有报错的。
错误信息:
处理办法:更换镜像版本,注意查看红色的代码位置
最终的文件修改如下:
root@node11:~/ragflow/docker# ll
total 6656
drwxr-xr-x 4 root root 4096 11月 18 12:32 ./
drwxr-xr-x 16 root root 4096 11月 13 15:01 ../
-rw-r--r-- 1 root root 924 11月 13 15:01 docker-compose-admin-tool.yml
-rw-r--r-- 1 root root 3416 11月 18 10:24 docker-compose-base.yml
-rw-r--r-- 1 root root 767 11月 13 15:01 docker-compose-CN-oc9.yml
-rw-r--r-- 1 root root 925 11月 13 15:01 docker-compose-gpu-CN-oc9.yml
-rw-r--r-- 1 root root 853 11月 18 10:36 docker-compose-gpu.yml
-rw-r--r-- 1 root root 1059 11月 13 15:01 docker-compose.yml
-rwxr-xr-x 1 root root 841 11月 13 15:01 entrypoint.sh*
-rw-r--r-- 1 root root 4407 11月 18 12:32 .env
-rwxr-xr-x 1 root root 2631 11月 13 15:01 init-kibana.sh*
-rw-r--r-- 1 root root 53 11月 13 15:01 init.sql
-rw-r--r-- 1 root root 2733 11月 13 15:01 launch_backend_service.sh
drwxr-xr-x 2 root root 4096 11月 13 15:01 nginx/
-rw-r--r-- 1 root root 4582686 11月 15 09:49 r1.log
-rw-r--r-- 1 root root 2107770 11月 14 00:28 rag1.log
drwxr-xr-x 4 root root 4096 11月 18 12:29 ragflow-logs/
-rw-r--r-- 1 root root 5037 11月 13 15:58 rag.log
-rwxr-xr-x 1 root root 198 11月 13 16:14 rag.sh*
-rw-r--r-- 1 root root 6864 11月 13 15:01 README.md
-rw-r--r-- 1 root root 945 11月 16 19:41 r.log
-rwxr-xr-x 1 root root 84 11月 14 09:03 r.sh*
-rw-r--r-- 1 root root 1740 11月 18 10:41 service_conf.yaml
-rw-r--r-- 1 root root 8700 11月 18 09:28 service_conf.yaml-bak
-rw-r--r-- 1 root root 2024 11月 13 15:01 service_conf.yaml.template
root@node11:~/ragflow/docker# more docker-compose-base.yml
services:
es01:
container_name: ragflow-es-01
image: docker.elastic.co/elasticsearch/elasticsearch:${STACK_VERSION}
volumes:
- esdata01:/usr/share/elasticsearch/data
ports:
- ${ES_PORT}:9200
env_file: .env
environment:
- node.name=es01
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- bootstrap.memory_lock=false
- discovery.type=single-node
- xpack.security.enabled=true
- xpack.security.http.ssl.enabled=false
- xpack.security.transport.ssl.enabled=false
- TZ=${TIMEZONE}
mem_limit: ${MEM_LIMIT}
ulimits:
memlock:
soft: -1
hard: -1
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:9200"]
interval: 10s
timeout: 10s
retries: 120
networks:
- ragflow
restart: on-failure
# infinity:
# container_name: ragflow-infinity
# image: infiniflow/infinity:v0.5.0-dev2
# volumes:
# - infinity_data:/var/infinity
# ports:
# - ${INFINITY_THRIFT_PORT}:23817
# - ${INFINITY_HTTP_PORT}:23820
# - ${INFINITY_PSQL_PORT}:5432
# env_file: .env
# environment:
# - TZ=${TIMEZONE}
# mem_limit: ${MEM_LIMIT}
# ulimits:
# nofile:
# soft: 500000
# hard: 500000
# networks:
# - ragflow
# healthcheck:
# test: ["CMD", "curl", "http://localhost:23820/admin/node/current"]
# interval: 10s
# timeout: 10s
# retries: 120
# restart: on-failure
mysql:
# mysql:5.7 linux/arm64 image is unavailable.
image: mysql:8.0.39-debian
container_name: ragflow-mysql
env_file: .env
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD}
- TZ=${TIMEZONE}
command:
--max_connections=1000
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--default-authentication-plugin=mysql_native_password
--tls_version="TLSv1.2,TLSv1.3"
--init-file /data/application/init.sql
ports:
- ${MYSQL_PORT}:3306
volumes:
- mysql_data:/var/lib/mysql
- ./init.sql:/data/application/init.sql
networks:
- ragflow
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-uroot", "-p${MYSQL_PASSWORD}"]
interval: 10s
timeout: 10s
retries: 3
restart: on-failure
minio:
# image: quay.io/minio/minio:RELEASE.2023-04-28T18-11-17Z
image: quay.io/minio/minio:RELEASE.2023-12-20T01-00-02Z
container_name: ragflow-minio
command: server --console-address ":9001" /data
ports:
- ${MINIO_PORT}:9000
- ${MINIO_CONSOLE_PORT}:9001
env_file: .env
environment:
- MINIO_ROOT_USER=${MINIO_USER}
- MINIO_ROOT_PASSWORD=${MINIO_PASSWORD}
- TZ=${TIMEZONE}
volumes:
- minio_data:/data
networks:
- ragflow
restart: on-failure
redis:
image: redis:7.2.4
# image: valkey/valkey:8
container_name: ragflow-redis
command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 128mb --maxmemory-policy allkeys-lru
env_file: .env
ports:
- ${REDIS_PORT}:6379
volumes:
- redis_data:/data
networks:
- ragflow
restart: on-failure
volumes:
esdata01:
driver: local
infinity_data:
driver: local
mysql_data:
driver: local
minio_data:
driver: local
redis_data:
driver: local
networks:
ragflow:
driver: bridge
root@node11:~/ragflow/docker# more docker-compose-admin-tool.yml
include:
- path: ./docker-compose.yml
env_file: ./.env
services:
kibana:
image: kibana:${STACK_VERSION}
container_name: ragflow-kibana
environment:
ELASTICSEARCH_USERNAME: ${KIBANA_USER}
ELASTICSEARCH_PASSWORD: ${KIBANA_PASSWORD}
ELASTICSEARCH_HOSTS: "http://es01:9200"
ports:
- ${KIBANA_PORT}:5601
depends_on:
es01:
condition: service_healthy
kibana-user-init:
condition: service_completed_successfully
networks:
- ragflow
kibana-user-init:
image: appropriate/curl
depends_on:
es01:
condition: service_healthy
volumes:
- ./init-kibana.sh:/app/init-kibana.sh
environment:
- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}
- KIBANA_USER=${KIBANA_USER}
- KIBANA_PASSWORD=${KIBANA_PASSWORD}
command: /bin/sh -c "sh /app/init-kibana.sh"
networks:
- ragflow
restart: 'no'
root@node11:~/ragflow/docker# cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 node11
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
root@node11:~/ragflow/docker# more .env|grep -v '#'|grep -v '$^'
STACK_VERSION=8.11.3
ES_HOST=es01
ES_PORT=1200
ELASTIC_PASSWORD=infini_rag_flow
KIBANA_PORT=6601
KIBANA_USER=rag_flow
KIBANA_PASSWORD=infini_rag_flow
MEM_LIMIT=8073741824
INFINITY_THRIFT_PORT=23817
INFINITY_HTTP_PORT=23820
INFINITY_PSQL_PORT=5432
MYSQL_PASSWORD=infini_rag_flow
MYSQL_HOST=mysql
MYSQL_DBNAME=rag_flow
MYSQL_PORT=5455
MINIO_HOST=minio
MINIO_CONSOLE_PORT=9001
MINIO_PORT=9000
MINIO_USER=rag_flow
MINIO_PASSWORD=infini_rag_flow
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=infini_rag_flow
SVR_HTTP_PORT=9380
RAGFLOW_IMAGE=infiniflow/ragflow:v0.13.0
TIMEZONE='Asia/Shanghai'
root@node11:~/ragflow/docker#
可参考连接:
https://github.com/infiniflow/ragflow/issues/2587
https://github.com/infiniflow/ragflow/issues/3418
RAG 实践- Ollama+RagFlow 部署本地知识库_ragflow本地化部署知识库-CSDN博客
相关文章:
搭建RAGFlow
RAGFlow 是一款基于深度文档理解构建的开源 RAG(Retrieval-Augmented Generation)引擎。RAGFlow 可以为各种规模的企业及个人提供一套精简的 RAG 工作流程,结合大语言模型(LLM)针对用户各类不同的复杂格式数据提供可靠…...
css中的box-sizing,记录
border-box:最终高度为height,默认包含padding border等属性 content-box:box-sizing默认值,最终大小为heightpaddingborder 等...
使用useCallback引发对闭包的理解
一、先简单介绍一下闭包: 闭包是 JavaScript 中的重要概念,它指的是一个函数可以“记住”并访问其词法作用域,即使在这个函数的外部被执行。简单来说,闭包是由函数及其相关的环境组合而成的。 闭包的特性 函数内部可以访问外部变量: 闭包…...
gvim添加至右键、永久修改配置、放大缩小快捷键、ctrl + c ctrl +v 直接复制粘贴、右键和还原以前版本(V)冲突
一、将 vim 添加至右键 进入安装目录找到 vim91\install.exe 管理员权限执行 Install will do for you:1 Install .bat files to use Vim at the command line:2 Overwrite C:\Windows\vim.bat3 Overwrite C:\Windows\gvim.bat4 Overwrite C:\Windows\evim.bat…...
腾讯云-COS
COS 对象存储 是一种可扩展的云端数据存储服务。它适用于存储任意类型的文件,并且可以针对这些文件进行访问控制。 CORS 跨域资源共享 是一种机制,它使用额外的HTTP头来告诉浏览器允许一个域上的Web应用请求另一个域上的资源。当需要从一个域名下的网页向…...
蓝桥杯每日真题 - 第16天
题目:(卡牌) 题目描述(13届 C&C B组C题) 解题思路: 题目分析: 有 n 种卡牌,每种卡牌的现有数量为 a[i],所需的最大数量为 b[i],还有 m 张空白卡牌。 每…...
基因组之全局互作热图可视化
引言 PlotHiC 是一个专为 Hi-C 数据可视化分析而设计的 Python 包。Hi-C 技术是一种能够检测染色体三维结构的实验方法,它能揭示 DNA 在细胞核内的三维组织结构。为了更好地展示和解释这些复杂的数据,PlotHiC[1] 可以帮助用户方便地绘制Hi-C 数据的热图。…...
基于Lora通讯加STM32空气质量检测WIFI通讯
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着环境污染问题的日益严重,空气质量的监测与管理已经…...
STM32 极速入门第一天基础拓展 驱动i2c屏幕 ( 使用PlatformIO开发STM32单片机 )
输入输出模式解析 输出模式 在输出模式下,通常不需要设置上下拉电阻. 输出电平由 LL_GPIO_SetOutputPin 和 LL_GPIO_ResetOutputPin 函数直 接控制。 输入模式 在输入模式下,设置上下拉电阻是非常重要的. 输入引脚悬空时可能会导致不确定的电平…...
【WPF】Prism学习(五)
Prism Commands 1.错误处理(Error Handling) Prism 9 为所有的命令(包含AsyncDelegateCommand)提供了更好的错误处理。 避免用try/catch包装每一个方法根据不同遇到的异常类型来提供特定的逻辑处理可以在多个命令之间共享错误处…...
RabbitMQ的基本概念和入门
RabbitMQ 的基本概念和入门 RabbitMQ 是一款流行的开源消息队列中间件,实现了高级消息队列协议(AMQP)。它使用Erlang语言编写,具备高可用性、可扩展性和易用性等特点,广泛应用于各种分布式系统中。本文将详细介绍Rabb…...
Shell脚本6 -- 条件判断if
声明: 本文的学习内容来源于B站up主“泷羽sec”视频【shell编程(4)脚本与用户交互以及if条件判断】的公开分享,所有内容仅限于网络安全技术的交流学习,不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题,…...
经验笔记:从生成 SSH 密钥到成功连接测试(以Gitee为例)
从生成 SSH 密钥到成功连接测试的经验笔记(以Gitee为例) 1. 生成 SSH 密钥对 选择合适的加密算法 ED25519: 密钥长度:私钥 256 位(32 字节),公钥 256 位(32 字节)&#…...
Object.defineProperty和响应式
Object.defineProperty()是一个监听对象属性变化的方法。一般情况下我们是不会直接使用的,或者说我们遇到的场景还没有这么高级。 最有名的例子就是Vue2的响应式实现,就是通过这个方法来实现的。 用起来不难,就是个API,只是用的…...
前端web
题目:制作带有下拉悬停菜单的导航栏 效果图 一、先制作菜单栏 <body> <div id"menu"> <div id"container"> <div class"item">游戏1 <div cla…...
DDNet 服务器配置教程 Linux 环境
DDNet 服务器配置教程 Linux 环境 配置之前可以参考一下官方网址给出的内容 官方网址:DDNet官方 环境说明 OS: Debian 11 安装 可以直接从官网下载,也可以使用这个链接: Linux_DDNet 下载链接 上文中给的链接会因为更新而出现版本落后的情况&#x…...
Vue 2 —监视器实现动态切换表单属性值
目录 一、需求背景 二、监视器语法 三、实例展示 1、HTML部分 2、JS部分 四、使用场景总结 1. 表单验证 2. 动态更新 UI 3. 数据同步 4. 计算属性的替代方案 计算属性的优势 : 简洁性: 监视器的优势 : 灵活性: 多属性依赖: 副…...
Qt_day10_程序打包(完结)
目录 1. 设置图标 2. Debug和Release版本 3. 动态链接库 4. 打包 5. 联系项目要求 Qt开发的程序最终都是要给用户使用的,用户的电脑上不可能装一个Qt的开发环境导入项目使用。因此项目项目开发完成后需要打包——制作成安装包,用户直接下载并安装即可使用…...
golang通用后台管理系统09(系统操作日志记录)
1.日志工具类 package log/**** 日志记录 wangwei 2024-11-18 15:30*/ import ("log""os""path/filepath""time" )// 获取以当前日期命名的日志文件路径 func getLogFilePath() string {currentDate : time.Now().Format("2006-…...
如何确保爬取的数据准确性和完整性?
在数据驱动的业务环境中,爬虫程序的准确性和完整性至关重要。本文将探讨如何使用Java编写爬虫程序,并确保其在爬取数据时的准确性和完整性。 1. 精确的HTML解析 确保数据准确性的第一步是精确地解析HTML。Jsoup是Java中常用的HTML解析库,它提…...
【java】JDK安装
Java Downloads | Oracle 中国 next 注意安装的路径 环境变量...
科技改变工作方式:群晖NAS安装内网穿透实现个性化办公office文档分享(1)
文章目录 前言1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制作固定公网访问链接 前言 本文将详细介绍如何在群晖NAS上安装Synology Office和Synology Drive Server,并利用Cpolar内网穿透工具为本地文档配置固定的公网…...
基于Java Springboot甘肃旅游管理系统
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
03-axios常用的请求方法、axios错误处理
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
《天体》游戏配置要求介绍
《天体》是一款太空探索和基地建造生存游戏,而游戏的画面表现非常不错,需要的配置要求也不算高,CPU最低只需要英特尔的酷睿i3 4XXX 系列或者AMD的Ryzen 3 2.6ghz处理器。 天体要什么配置最低配置: 需要 64 位处理器和操作系统 操作系统 *: …...
【企业级分布式系统】 Kafka集群
文章目录 KafkaKafka 概述使用消息队列的好处 Kafka 的特性Kafka 系统架构Kafka 的应用场景Kafka 的优缺点 Kafka 集群部署下载安装包安装 KafkaKafka 命令行操作Kafka 架构深入 FilebeatKafkaELK 部署指南~部署 ZookeeperKafka 集群部署 Filebeat部署 ELK(Logstash…...
MySQL 中有哪几种锁?
在 MySQL 中,锁(Locks)是为了保证数据的一致性和完整性而设计的机制。常见的锁可以从粒度和操作类型两个角度分类。以下是详细介绍: 按 粒度 分类 1. 全局锁 描述:锁定整个数据库实例。用途:主要用于备份…...
kafka中节点如何服役和退役
节点服役(添加新节点) 1.准备新节点: 安装 Kafka 和相关依赖。 配置 Kafka Broker 的 server.properties 文件,确保 broker.id 是唯一的,并且配置正确的 zookeeper.connect 地址。 重启网卡 2.启动新节点ÿ…...
HTML5实现剪刀石头布小游戏(附源码)
文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…...
集群聊天服务器(3)muduo网络库
目录 基于muduo的客户端服务器编程 muduo只能装在linux中,依赖boost库 客户端并不需要高并发 基于muduo的客户端服务器编程 支持epoll线程池,muduo封装了线程池 而且还有完善的日志系统 使用muduo库代码非常固定,基本就只有chatserver的类名…...
运营笔记wordpress/域名交易域名出售
1、处理特殊的文件名 假设Linux系统中有一个文件名叫“-ee”,如果我们想对它进行操作,例如要删除它,按照一般的删除方法在命令行中输入rm -ee命令,界面会提示我们是“无效选项”(invalid option),原来由于文件名的第一…...
做自媒体可利用的国外网站/公司网站的推广方案
在容器技术没有出来之前,开发运维在进行交付的时候经常出现,开发环境执行正常,生产环境部署运行出现问题,很多原因就是因为环境导致。还有部署环境太过于复杂,交付成本太高。容器技术的出现就像工业的集装箱技术&#…...
wordpress 两个网站/哪里有培训班
- 导入 AbstractUserfrom django.contrib.auth.models import AbstractUser- 往其中添加列,即可在Django的基础上添加我们所需要的信息。class User(AbstractUser):"""继承django的AbstractUser并向里面添加两条数据内容"""GENDER_CH…...
网站商城建设合同范本/cps广告是什么意思
一、AtomicReference介绍 AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用。也就是它可以保证你在修改对象引用时的线程安全性。 AtomicReference是作用是对”对象”进行原子…...
建设兼职网站目的/合肥网络推广公司
前言 Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现 服务注册和发现。Eureka 采用了 C-S 的 设计架构。Eureka Server 作为 服务注册中心,系统中的 其他微服务,使用 Eureka 的 客户端 连接到 Eureka Server,并通过 心跳连接 检…...
wordpress主题不显示/成都专业seo公司
一、硬件材料 1*Arduino UNO R3开发板 1*MPU6050 1*8X8LED点阵屏 二、硬件接线图 企业微盘...