当前位置: 首页 > news >正文

在 KubeSphere 中开启新一代云原生数仓 Databend

作者:尚卓燃(https://github.com/PsiACE),Databend 研发工程师,Apache OpenDAL (Incubating) PPMC。

前言

Databend 是一款完全面向云对象存储的新一代云原生数据仓库,专为弹性和高效设计,为您的大规模分析需求保驾护航。Databend 同时是一款符合 Apache-2.0 协议的开源软件,除了访问云服务(https://app.databend.com/)之外,用户还可以自己部署 Databend 生产集群以满足工作负载需要。

Databend 的典型使用场景包括:

  • 实时分析平台,日志的快速查询与可视化。
  • 云数据仓库,历史订单数据的多维度分析和报表生成。
  • 混合云架构,统一管理和处理不同来源和格式的数据。
  • 成本和性能敏感的 OLAP 场景,动态调整存储和计算资源。

KubeSphere 是在 Kubernetes 之上构建的以应用为中心的多租户容器平台,提供全栈的 IT 自动化运维的能力,可以管理多个节点上的容器化应用,提供高可用性、弹性扩缩容、服务发现、负载均衡等功能。

利用 KubeSphere 部署和管理 Databend 具有以下优点:

  • 使用 Helm Charts 部署 Databend 集群,简化应用管理、部署过程和参数设置。
  • 利用 Kubernetes 的特性来实现 Databend 集群的自动恢复、水平扩展、负载均衡等。
  • 与 Kubernetes 上的其他服务或应用轻松集成和交互,如 MinIO、Prometheus、Grafana 等。

本文将会介绍如何使用 KubeSphere 创建和部署 Databend 高可用集群,并使用 QingStor 作为底层存储服务。

配置对象存储

对象存储是一种存储模型,它把数据作为对象来管理和访问,而不是文件或块。对象存储的优点包括:可扩展性、低成本、高可用性等。

Databend 完全面向对象存储而设计,在减少复杂性和成本的同时提高灵活性和效率。Databend 支持多种对象存储服务,如 AWS S3、Azure Blob、Google Cloud Storage、HDFS、Alibaba Cloud OSS、Tencent Cloud COS 等。您可以根据业务的需求和偏好选择合适的服务来存放你的数据。

这里我们以青云 QingStor 为例,介绍与 S3 兼容的对象存储相关配置的预先准备工作。

创建 Bucket

对象存储服务(QingStor)提供了一个无限容量的在线文件存储和访问平台。每个用户可创建多个存储空间(Bucket);您可以将任意类型文件通过控制台或 QingStor API 上传至一个存储空间(Bucket)中;存储空间(Bucket)支持访问控制,您可以将自己的存储空间(Bucket)开放给指定的用户,或所有用户。

登录青云控制台,选中对象存储服务,新建用于验证的 bucket 。

需要关注的是 bucket 的名字 <bucket> 和其所在的可用区 <region>

由于这里使用 s3 兼容服务,所以最后连接的 endpoint_url 是 s3.<bucket>.<region>.qingstor.com

创建 API 密钥

API 密钥(Access Key)可以让您通过发送 API 指令来访问青云的服务。API 密钥 ID 须作为参数包含在每一个请求中发送;而 API 密钥的私钥负责生成 API 请求串的签名,私钥需要被妥善保管,切勿外传。默认所有 IP 地址都可使用此密钥调用 API,设置 IP 白名单后只有白名单范围内的 IP 地址才可使用此密钥。

点击右上方菜单,选中 API 密钥,创建新的密钥用于 API 访问。

下载文件中的 qy_access_key_id 对应 access_key_idqy_secret_access_key 对应 secret_access_key

准备 KubeSphere 环境

KubeSphere(https://kubesphere.io)是在 Kubernetes 之上构建的开源容器平台,提供全栈的 IT 自动化运维的能力,简化企业的 DevOps 工作流。KubeSphere 已被海内外数万家企业采用。此外, KubeSphere 还拥有极为开放的生态,KubeSphere 在 OpenPitrix 的基础上,为用户提供了一个基于 Helm 的应用商店,用于应用生命周期管理。KubeSphere 应用商店让 ISV、开发者和用户能够在一站式服务中只需点击几下就可以上传、测试、安装和发布应用。目前 Databend 已入驻 KubeSphere 应用商店。

KubeSphere 环境搭建

All-in-One 模式部署测试环境

参考官方文档 。

在 Azure 上 Spot 一台机器:

Welcome to Ubuntu 18.04.6 LTS (GNU/Linux 5.4.0-1089-azure x86_64)* Documentation:  https://help.ubuntu.com* Management:     https://landscape.canonical.com* Support:        https://ubuntu.com/advantageSystem information as of Tue Sep  6 02:09:16 UTC 2022System load:  0.15              Processes:           376Usage of /:   4.8% of 28.89GB   Users logged in:     0Memory usage: 0%                IP address for eth0: 10.0.0.4Swap usage:   0%

以 All-In-One 模式部署:

注意,需要在 root 下运行。

apt install socat conntrack containerd
systemctl daemon-reload
systemctl enable --now containerd
curl -sfL https://get-kk.kubesphere.io | VERSION=v3.0.2 sh -
chmod +x kk
./kk create cluster --with-kubernetes v1.22.12 --with-kubesphere v3.3.1
+------+------+------+---------+----------+-------+-------+---------+-----------+--------+--------+------------------+------------+-------------+------------------+--------------+
| name | sudo | curl | openssl | ebtables | socat | ipset | ipvsadm | conntrack | chrony | docker | containerd       | nfs client | ceph client | glusterfs client | time         |
+------+------+------+---------+----------+-------+-------+---------+-----------+--------+--------+------------------+------------+-------------+------------------+--------------+
| ks   | y    | y    | y       | y        | y     |       |         | y         | y      |        | 1.5.9-0ubuntu3.1 |            |             |                  | UTC 02:53:56 |
+------+------+------+---------+----------+-------+-------+---------+-----------+--------+--------+------------------+------------+-------------+------------------+--------------+

如果提示依赖缺失,可以根据需要安装,sudo apt install <name> ,这里只安装前两个。

Kubernetes Version ≥ 1.18
socatRequired
conntrackRequired
ebtablesOptional but recommended
ipsetOptional but recommended
ipvsadmOptional but recommended

访问 KubeSphere 控制面板。

执行下面命令查看关于登录的信息:

Collecting installation results ...
#####################################################
###              Welcome to KubeSphere!           ###
#####################################################Console: http://10.0.0.4:30880
Account: admin
Password: P@88w0rdNOTES:1. After you log into the console, please check themonitoring status of service components in"Cluster Management". If any service is notready, please wait patiently until all componentsare up and running.2. Please change the default password after login.#####################################################
https://kubesphere.io             2022-09-06 15:41:44
#####################################################

访问 30880 端口,并使用用户名密码登录,就可以访问 KubeSphere 。为确保能够访问 KubeSphere 和其他服务,请根据实际情况在云平台控制面板为相应端口添加入站出站规则。

KubeSphere Cloud 创建演示环境

创建轻量集群服务:

注册并登录 https://kubesphere.cloud 之后,可以轻松创建轻量集群服务。

使用默认配置创建免费版集群即可尝鲜体验,个人用户每月有 10 小时免费额度。

访问 KubeSphere 控制面板。

点击进入 KubeSphere,使用临时帐号密码登录。

插件启用

登录后的界面,如下图所示:

如需使用应用商店,可以参考 KubeSphere 文档 - 在安装后启用应用商店 启用。

开启后可以在应用商店中搜索找到 Databend ,结果类似下图。

企业空间与项目管理

点击平台管理进入访问控制页面,选中企业空间,点击创建,在名称一栏填写你想使用的名称,比如 databend

在侧边栏选中项目,点击创建,分别创建为 databend-metadatabend-query 准备的项目。创建后效果如图所示:

部署 Databend

应用模板载入

虽然应用商店中已经有 Databend 可供选用,但版本较旧(v0.8.122-nightly),新的 PR(v1.0.3-nightly)需要等合并之后才可用,所以建议添加 Databend 官方维护的 helm-charts 作为应用模板。

Databend 官方提供了 Helm Charts ,而 KubeSphere 也支持使用 Helm Charts 应用模板。

应用模板是用户上传、交付和管理应用的一种方式。一般来说,根据一个应用的功能以及与外部环境通信的方式,它可以由一个或多个 Kubernetes 工作负载(例如部署、有状态副本集和守护进程集)和服务组成。作为应用模板上传的应用基于 Helm 包构建。 可以将 Helm Chart 交付至 KubeSphere 的公共仓库,或者导入私有应用仓库来提供应用模板。 https://kubesphere.io/zh/docs/v3.3/workspace-administration/upload-helm-based-application/

在企业空间侧边栏选中 应用管理 ,点击 应用仓库 ,添加 Databend 官方维护的 Helm Charts 。

待状态变为成功后,就可以基于模板安装部署新的 Databend 应用。

Databend 部署模型

参考文档。

典型的 Databend 集群架构如下图所示,需要分别部署多个 Meta 和 Query 节点:

在集群模式下部署 Databend 时,首先需要启动一个 Meta节点,然后设置并启动其他 Meta 节点以加入第一个 Meta 节点,形成集群。在成功启动所有 Meta 节点后,逐个启动 Query 节点。每个 Query 节点在启动后自动注册到 Meta 节点以形成集群。

Meta 高可用集群部署

选中 databend-meta 项目。点击侧边栏应用负载,选中应用。点击创建,并选中从应用模板。 下拉栏中选中之前添加的 Databend ,效果如图:

选中 databend-meta,点击安装,设定应用名称及版本,我们推荐总是使用最新版本,以获得更好的体验。

使用示例设置,创建 3 副本的 databend-meta 节点形成集群。生产环境下推荐至少使用 3 副本高可用集群,可以参考 Databend 官方文档进行配置。

bootstrap: true
replicaCount: 3
persistence:size: 5Gi # 考虑到宿主机资源有限,仅供示范
serviceMonitor:enabled: true

Query 集群部署

在 Meta 节点的所有副本就绪之后,就可以开始部署 Query 集群。

Query 节点部署的前置步骤与 Meta 节点类似。进入 databend-query 项目,仿照之前的步骤选中 databend-query 应用模板进行创建即可。

配置中需要关注的部分是:

  • databend-meta 连接:这里的地址取决于之前部署的 Meta 集群的相关信息。
  • 存储方式:本示例连接的是 QingStor ,使用 S3 兼容协议,所以需要特别关注 endpoint_url
  • 内置用户创建:创建一个名为 databend 密码为 databend 的内置用户,以方便在非 localhost 情况下访问。

这里启动的是一个单副本的 Query 集群,实际情况下可以根据工作负载规模灵活调整。

replicaCount: 1
config:query:clsuterId: default# add builtin userusers:- name: databend# available type: sha256_password, double_sha1_password, no_password, jwtauthType: double_sha1_password# echo -n "databend" | sha1sum | cut -d' ' -f1 | xxd -r -p | sha1sumauthString: 3081f32caef285c232d066033c89a78d88a6d8a5meta:# Set endpoints to use remote meta service# depends on previous deployed meta service、namespace and nodesendpoints:- "databend-meta-0.databend-meta.databend-meta.svc:9191"- "databend-meta-1.databend-meta.databend-meta.svc:9191"- "databend-meta-2.databend-meta.databend-meta.svc:9191"storage:# s3, osstype: s3s3:bucket: "<bucket>"endpoint_url: "https://s3.<region>.qingstor.com" # for qingstoraccess_key_id: "<key>"secret_access_key: "<secret>"
# [recommended] enable monitoring service
serviceMonitor:enabled: true
# [recommended] enable access from outside cluster
service:type: LoadBalancer

KubeSphere 监控

KubeSphere 观测工作负载

待状态变为运行中即可,这时可以很方便使用 KubeSphere 观测工作负载。

资源状态

  • databend-meta

  • databend-query

监控

  • databend-meta

  • databend-query

可访问性测试

节点状态检测

如果是在 All-in-One 模式下部署,我们可以轻松使用容器组 IP 地址来测试节点状态。

psiace@ks:~$ curl 10.233.107.113:8080/v1/health
{"status":"pass"}

而使用 KubeSphere Cloud 部署时,可以在 KubeSphere Cloud 控制面板,选择网络以创建访问规则。

这里以 8080(Admin API)和 8000(Query HTTP Handler)端口为例:

创建后的结果如下图所示:

同样我们可以使用 curl 来检查节点状态。

psiace@ks:~$ curl https://admin-gfkyzxaz.c.kubesphere.cloud:30443/v1/health
{"status":"pass"}

执行查询

bendsql 是一个十分方便的命令行界面工具,可以帮助您顺畅高效地使用 Databend 。bendsql 也支持连接 Databend Cloud ,管理计算集群和运行 SQL 查询。

安装 bendsql

$ go install github.com/databendcloud/bendsql/cmd/bendsql@latest

连接 databend 集群(以 KubeSphere Cloud 为例)

$ bendsql connect -H query-gfkyzxaz.c.kubesphere.cloud -P 30443 -u databend -p databend --ssl
Connected to Databend on Host: query-gfkyzxaz.c.kubesphere.cloud
Version: DatabendQuery v0.9.57-nightly-df858a1(rust-1.68.0-nightly-2023-03-01T01:23:11.56066902Z)

尝试执行查询

$ bendsql query
Connected with driver databend (DatabendQuery v0.9.57-nightly-df858a1(rust-1.68.0-nightly-2023-03-01T01:23:11.56066902Z))
Type "help" for help.dd:databend@query-gfkyzxaz/default=> SELECT avg(number) FROM numbers(1000);
+-------------+
| avg(number) |
+-------------+
| 499.5       |
+-------------+
(1 row)

总结

本文介绍了如何使用 KubeSphere 创建和部署 Databend 高可用集群,后端存储服务采用 QingStor ,最后使用 bendsql 演示连接集群和执行查询。

本文由博客一文多发平台 OpenWrite 发布!

相关文章:

在 KubeSphere 中开启新一代云原生数仓 Databend

作者&#xff1a;尚卓燃&#xff08;https://github.com/PsiACE&#xff09;&#xff0c;Databend 研发工程师&#xff0c;Apache OpenDAL (Incubating) PPMC。 前言 Databend 是一款完全面向云对象存储的新一代云原生数据仓库&#xff0c;专为弹性和高效设计&#xff0c;为您…...

华为OD机试 - 最优资源分配(C 语言解题)【独家】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:最优资源…...

求数组的中心索引

给你一个整数数组 nums &#xff0c;请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标&#xff0c;其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端&#xff0c;那么左侧数之和视为 0 &#xff0c;因为在下标的左侧不存在元素。这一点…...

Ubuntu 搭建NextCloud私有云盘【内网穿透远程访问】

文章目录1.前言2.本地软件安装2.1 nextcloud安装2.2 cpolar安装3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5. 结语1.前言 对于爱好折腾的电脑爱好者来说&#xff0c;Linux是绕不开的、必须认识的系统&#xff08;大部分服务器都是采用Linux操作系统&a…...

如何使用vue创建一个完整的前端项目

搭建Vue项目的完整流程可以分为以下几个步骤&#xff1a;安装Node.js和npm&#xff1a;Vue.js是基于Node.js开发的&#xff0c;因此在开始搭建Vue项目之前&#xff0c;需要先安装Node.js和npm&#xff08;Node.js的包管理器&#xff09;。可以从官网下载Node.js安装包并安装。安…...

http组成及状态及参数传递

http组成及状态及参数传递 早期的网页都是通过后端渲染来完成的&#xff1a;服务器端渲染&#xff08;SSR&#xff0c;server side render&#xff09;&#xff1a; 客户端发出请求 -> 服务端接收请求并返回相应HTML文档 -> 页面刷新&#xff0c;客户端加载新的HTML文档&…...

USART_GetITStatus与 USART_GetFlagStatus的区别

文章目录共同点不同点USART_GetITStatus函数详解USART_GetFlagStatus函数共同点 都能访问串口的SR寄存器 不同点 USART_GetFlagStatus(USART_TypeDef USARTx, uint16_t USART_FLAG)&#xff1a;* 该函数只判断标志位&#xff08;访问串口的SR寄存器&#xff09;。在没有使能…...

Java 系列之 Springboot

系列文章目录 文章目录系列文章目录前言一、Springboot 简介&#xff1f;1.1 什么是启动器&#xff1f;1.2 Springboot 优点1.3 Springboot 核心二、搭建方式2.1 搭建方式一2.2 搭建方式二2.3 搭建方式三三、启动原理3.1 初始化SrpingApplication对象3.2 执行run()方法1. 加载监…...

乐山持点科技:抖客推广准入及准出管理规则

抖音小店平台新增《抖客推广准入及准出管理规则》&#xff0c;本次抖音规则具体如下&#xff1a;第一章 概述1.1 目的及依据为维护精选联盟平台经营秩序&#xff0c;保障精选联盟抖客、商家、消费者等各方的合法权益;根据《巨量百应平台服务协议》、《“精选联盟”服务协议(推广…...

Steam流

Steam流 Stream 流是什么&#xff0c;为什么要用它&#xff1f; Stream是 Java8 新引入的一个包&#xff08; java.util.stream&#xff09;&#xff0c;它让我们能用声明式的方式处理数据&#xff08;集合、数组等&#xff09;。Stream流式处理相较于传统方法简洁高效&#…...

Nuxt实战教程基础-Day01

Nuxt实战教程基础-Day01Nuxt是什么&#xff1f;Nuxt.js框架是如何运作的&#xff1f;Nuxt特性流程图服务端渲染(通过 SSR)单页应用程序 (SPA)静态化 (预渲染)Nuxt优缺点优点缺点安装运行项目总结前言&#xff1a;本教程基于Nuxt2&#xff0c;作为教程的第一天&#xff0c;我们先…...

栈和队列详细讲解+算法动画

栈和队列 栈stack 栈也是一种线性结构相比数组&#xff0c;栈对应的操作数数组的子集只能从一端添加元素&#xff0c;也只能从一端取出元素这一端称为栈顶 栈是一种后进先出的数据结构Last in Firt out(LIFO)在计算机的世界里&#xff0c;栈拥有者不可思议的作用 栈的应用 …...

【Unity3D小技巧】Unity3D中判断Animation以及Animator动画播放结束,以及动画播放结束之后执行函数

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在日常开发中&#xff0c;可能会遇到要判断Animation或者Anima…...

【1】熟悉刷题平台操作

TestBench使用 与quartus中testbench的写法有些许。或者说这是平台特有的特性&#xff01;&#xff01; 1 平台使用谨记 &#xff08;1&#xff09;必须删除&#xff1a;若设计为组合逻辑&#xff0c;需将自动生成的clk删除 若不删除&#xff0c;会提示运行超时错误。 &#…...

计算机网络:RIP协议以及距离向量算法

RIP协议 RIP是一种分布式的基于适量向量的路由选择协议&#xff0c;最大优点是简单。要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的唯一最佳&#xff08;最短&#xff09;距离记录&#xff0c;最多包含15个路由器&#xff0c;距离为16就表示网络不可达&…...

[数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(课后习题+答案解析)

1. 简述下列概念:数据、数据元素、数据项、数据对象、数据结构、逻辑结构、存储结构、抽象数据类型。 数据 数据是客观事物的符号表示&#xff0c;是所有能输人到计算机中并被计算机程序处理的符号的总称。数据是信息的载体&#xff0c;能够被计算机识别、存储和加工 数据元素…...

JS_countup.js 的简单使用,数字滚动效果

countup.js countup.js 是一个轻量级&#xff0c;无依赖的JavaScript类&#xff0c;通过简单的设置就可以达到数字滚动的效果 官网&#xff1a;https://inorganik.github.io/countUp.js/ 源码 var CountUpfunction(target,startVal,endVal,decimals,duration,options){var …...

【C++知识点】STL 容器总结

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;C/C知识点 &#x1f4e3;专栏定位&#xff1a;整理一下 C 相关的知识点&#xff0c;供大家学习参考~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;…...

C++---背包模型---装箱问题(每日一道算法2023.3.9)

注意事项&#xff1a; 本题是"动态规划—01背包"的扩展题&#xff0c;dp和优化思路不多赘述。 题目&#xff1a; 有一个箱子容量为 V&#xff0c;同时有 n 个物品&#xff0c;每个物品有一个体积&#xff08;正整数&#xff09;。 要求 n 个物品中&#xff0c;任取若…...

if-else if与switch的练习1:输入两个数,输出两个数的加减乘除的值

1.if-else if的练习 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...