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

Elasticsearch集群与日志系统实战部署指南

一、环境规划与初始化配置

1. 服务器资源分配

IP地址部署服务主机名
172.25.23.7ES + Kafka + Zookeeper + Kibananode1
172.25.23.8ES + Kafka + Zookeeper + Filebeatnode2
172.25.23.9Kafka + Zookeeper + Apache + Logstashnode3

系统要求

  • 配置:4核CPU / 4GB内存 / 60GB磁盘
  • 组件版本:Elasticsearch 5.5.0、JDK 1.8

日志系统架构图

apache—>filebeat—>kafka—>logstash—>elasticsearch—>kibana

2. 基础环境配置

(1) 主机名与Hosts绑定

# 所有节点执行(以node1为例)
hostnamectl set-hostname node1
echo "172.25.23.7 node1" >> /etc/hosts
echo "172.25.23.8 node2" >> /etc/hosts
echo "172.25.23.9 node3" >> /etc/hosts

 修改完重启终端或执行命令bash

vi /etc/hosts  

加入

172.25.23.7 node1172.25.23.8 node2172.25.23.9 node3

(2) 关闭防火墙与SELinux

systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

 (3) 安装Java环境

yum -y install java-1.8.0-openjdk
cat <<EOF >> /etc/profile
export JAVA_HOME=/usr/lib/jvm/java-1.8.0
export PATH=\$PATH:\$JAVA_HOME/bin
EOF
source /etc/profile

安装Java 

yum -y install java-1.8.0-*

vi /etc/profile

加入下面三行

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64export JRE_HOME=$JAVA_HOME/jreexport PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MYCAT_HOME/bin

 

source /etc/profileecho $JAVA_HOME

 

二、Elasticsearch集群部署

1. 安装与基础配置(以node1为例)

cd /rootrpm -ivh elasticsearch-5.5.0.rpmsystemctl daemon-reloadsystemctl enable elasticsearch.service

 

cd /etc/elasticsearch/cp elasticsearch.yml elasticsearch.yml.bak

 2.修改配置文件

vim /etc/elasticsearch/elasticsearch.yml--17--取消注释,指定集群名字cluster.name: zhang--23--取消注释,指定节点名字:Node1节点为node1,Node2节点为node2node.name: node1--33--取消注释,指定数据存放路径path.data: /data/elk_data--37--取消注释,指定日志存放路径path.logs: /var/log/elasticsearch/--43--取消注释,改为在启动的时候不锁定内存bootstrap.memory_lock: false--55--取消注释,设置监听地址,0.0.0.0代表所有地址network.host: 0.0.0.0--59--取消注释,ES 服务的默认监听端口为9200http.port: 9200--68--取消注释,集群发现通过单播实现,指定要发现的节点 node1、node2discovery.zen.ping.unicast.hosts: ["node1", "node2"]

 

Node1

Node2

grep -v "^#" /etc/elasticsearch/elasticsearch.yml

node1

Node2

3.创建数据目录并授权

mkdir -p /data/elk_datachown elasticsearch:elasticsearch /data/elk_data/systemctl start elasticsearchsystemctl enable --now elasticsearch.servicenetstat -antp | grep 9200

 4、查看node1节点信息

curl http://node1:9200/_cluster/health?pretty

预期输出 

{"cluster_name" : "es-cluster","status" : "green",          # 集群健康状态"number_of_nodes" : 2        # 节点数量
}

实际访问输出 http://172.16.39.66:9200/

 http://172.16.39.66:9200//_cluster/health?pretty

三、Elasticsearch 集群部署(在node2上操作)

1、前面步骤与node1节点一致

安装Java

yum -y install java-1.8.0-*

vi /etc/profile   加入下面三行export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64export JRE_HOME=$JAVA_HOME/jreexport PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MYCAT_HOME/bin

source /etc/profileecho $JAVA_HOME

2、部署安装Elasticsearch软件

cd /rootrpm -ivh elasticsearch-5.5.0.rpmsystemctl daemon-reloadsystemctl enable elasticsearch.servicecd /etc/elasticsearch/cp elasticsearch.yml elasticsearch.yml.bak

配置Elasticsearch主配置文件

将node1节点配置文件复制过来scp 172.25.23.7:/etc/elasticsearch/elasticsearch.yml .

vim /etc/elasticsearch/elasticsearch.ymlgrep -v "^#" /etc/elasticsearch/elasticsearch.yml

3、创建数据存放路径并授权

mkdir -p /data/elk_datachown elasticsearch:elasticsearch /data/elk_data/systemctl daemon-reloadsystemctl enable --now elasticsearch.servicesystemctl start elasticsearchnetstat -antp | grep 9200

4、查看node2节点信息

http://172.16.39.70:9200/

 http://172.16.39.70:9200/_cluster/health?pretty

由于es服务启动之后,访问界面比较简单,为了更好的查看索引库当中的信息,我们可以通过安装elasticsearch-head这个插件来实现,这个插件可以更方便快捷的看到es的管理界面。

5.创建测试索引(可以不创建)

curl -X PUT "node1:9200/index-demo" -H 'Content-Type: application/json' -d'
{"settings": { "number_of_shards": 3 }
}'

四、安装 Elasticsearch-head 可视化插件(node1和node2节点操作一样)

Elasticsearch 在 5.0 版本后,Elasticsearch-head 插件需要作为独立服务进行安装,需要使用npm工具(NodeJS的包管理工具)安装。

安装 Elasticsearch-head 需要提前安装好依赖软件 node 和 phantomjs。

node:是一个基于 Chrome V8 引擎的 JavaScript 运行环境。

phantomjs:是一个基于 webkit 的JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。

1.安装Node.js与依赖

上传软件包 node-v12.18.1-linux-x64.tar.gz 到/opt

yum install gcc gcc-c++ make -y

node1

Node2

cd /opttar xvf node-v12.18.1-linux-x64.tar.gz

node1

Node2

mkdir /usr/local/nodemv node-v12.18.1-linux-x64/* /usr/local/nodeecho "export PATH=$PATH:/usr/local/node/bin" >> ~/.bashrcsource ~/.bashrcnpm -v

2.安装 phantomjs

上传软件包 phantomjs-2.1.1-linux-x86_64.tar.bz2到opt

cd /opttar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/

cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bincp phantomjs /usr/local/bin

3.安装 Elasticsearch-head 数据可视化工具

上传软件包 elasticsearch-head-5.0.0.zip 到/opt

cd /optunzip elasticsearch-head-5.0.0.zip

mv elasticsearch-head-5.0.0/* /usr/local/src/cd /usr/local/src/

修改为淘宝的源

npm config set registry http://registry.npm.taobao.orgnpm install

4.修改 Elasticsearch 主配置文件

vim /etc/elasticsearch/elasticsearch.yml

--末尾添加以下内容--

http.cors.enabled: true              http.cors.allow-origin: "*"

systemctl restart elasticsearch

5.修改Gruntfile.js配置文件

vi Gruntfile.js
connect: {server: {options: {hostname: '172.25.23.7', //添加这行port: 9100,base: '.',keepalive: true}}}

6.修改app.js配置文件

cd _site/vi app.js

搜素XHR找到下面的位置(修改)

init: function(parent) {this._super();this.prefs = services.Preferences.instance();this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://172.25.23.7:9200";   //修改这里if( this.base_uri.charAt( this.base_uri.length - 1 ) !== "/" ) {// XHR request fails if the URL is not ending with a "/"this.base_uri += "/";}

7.启动 elasticsearch-head 服务

cd /usr/local/src/node_modules/grunt/bin./grunt server

8、通过 Elasticsearch-head查看Elasticsearch 信息

浏览器访问 http://172.25.23.7:9100/ 地址并连接群集。如果看到群集健康值为 green 绿色,代表群集很健康。

9、插入索引,进行测试

curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"lcdb","mesg":"lichen youshoujiuxing"}'

浏览器访问 http://172.25.23.7:9100/ 查看索引信息,可以看见索引默认被分片5个,并且有一个副本。


点击“数据浏览”,会发现在node1上创建的索引为 index-demo,类型为 test 的相关信息。

五、Logstash 部署

下载地址:https://www.elastic.co/cn/downloads/past-releases/logstash-5-5-1https://www.elastic.co/cn/downloads/past-releases/logstash-5-5-1

Logstash 一般部署在需要监控其日志的服务器。在本案例中,Logstash 部署在 Apache 服务器上,用于收集 Apache 服务器的日志信息并发送到 Elasticsearch。

1.安装httpd服务

yum -y install httpdsystemctl start httpdsystemctl status httpd

2、安装java环境

yum -y install java-1.8.0-*

vi /etc/profile加入下面三行
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.412.b08-1.el7_9.x86_64export JRE_HOME=$JAVA_HOME/jreexport PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$MYCAT_HOME/bin

source /etc/profileecho $JAVA_HOME

3、安装logstash

cd /optrpm -ivh logstash-5.5.1.rpm

systemctl start logstash.servicesystemctl enable logstash.serviceln -s /usr/share/logstash/bin/logstash /usr/local/bin/

4、测试 Logstash

4.1 Logstash 命令常用选项

-f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。

-e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。

-t:测试配置文件是否正确,然后退出。

4.2 定义输入输出流

输入采用标准输入,输出采用标准输出(类似管道)

指定数据输入端口,默认为9600~9700

logstash -e "input { stdin{} } output { stdout{} }"

4.3 使用 rubydebug 输出详细格式显示,codec 为一种编解码器

logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'

4.4 使用 Logstash 将信息写入 Elasticsearch 中

logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["172.16.39.66:9200"] } }'

结果不在标准输出显示,而是发送至 Elasticsearch 中,可浏览器访问 http://172.25.23.7:9100/ 查看索引信息和数据浏览。

5、定义logstash配置文件

Logstash 配置文件基本由三部分组成(根据需要选择使用)

input:表示从数据源采集数据,常见的数据源如Kafka、日志文件等

filter:表示数据处理层,包括对数据进行格式化处理、数据类型转换、数据过滤等,支持正则表达式

output:表示将Logstash收集的数据经由过滤器处理之后输出到Elasticsearch。

修logstash 配置文件,让其收集系统日志/var/log/messages,并将其输出到 elasticsearch 中

chmod +r /var/log/messages  给系统日志添加读权限cd /etc/logstash/conf.d/vim syslog.conf

input {file{path =>"/var/log/messages"type =>"system"start_position =>"beginning"}}output {elasticsearch {hosts => ["172.25.23.7:9200"]index =>"system-%{+YYYY.MM.dd}"}}

systemctl restart logstash.service

6、浏览器验证,查看索引信息

六、Kibana部署(Node1节点)

下载地址:https://www.elastic.co/cn/downloads/past-releases/kibana-5-5-1https://www.elastic.co/cn/downloads/past-releases/kibana-5-5-1

1.安装 Kibana

cd /optrpm -ivh kibana-5.5.1-x86_64.rpm

2.设置kibana的主配置文件

vim /etc/kibana/kibana.yml

--2--取消注释,Kiabana 服务的默认监听端口为5601

server.port: 5601

--7--取消注释,设置 Kiabana 的监听地址,0.0.0.0代表所有地址

server.host: "0.0.0.0"

--21--取消注释,设置和 Elasticsearch 建立连接的地址和端口

elasticsearch.url: "http://172.25.23.7:9200"

--30--取消注释,设置在 elasticsearch 中添加.kibana索引

kibana.index: ".kibana"

3.启动kibana服务

systemctl daemon-reloadsystemctl start kibana.servicesystemctl enable kibana.servicenetstat -antp | grep 5601

4.验证Kibana

浏览器访问http://172.16.39.66:5601

5.将 Apache 服务器的日志(访问的、错误的)添加到 Elasticsearch 并通过 Kibana 显示

vim /etc/logstash/conf.d/apache_log.conf
input {file{path => "/etc/httpd/logs/access_log"type => "access"start_position => "beginning"}file{path => "/etc/httpd/logs/error_log"type => "error"start_position => "beginning"}}output {if [type] == "access" {elasticsearch {hosts => ["172.16.39.66:9200"]index => "apache_access-%{+YYYY.MM.dd}"}}if [type] == "error" {elasticsearch {hosts => ["172.16.39.66:9200"]index => "apache_error-%{+YYYY.MM.dd}"}}}

cd /etc/logstash/conf.d//usr/share/logstash/bin/logstash -f apache_log.conf   指定配置文件开启logstash

打开apache页面,多刷新几次

浏览器访问 http://172.25.23.7:9100 查看索引是否创建

创建访问日志索引

创建错误日志索引

访问apache可以刷新日志,kibana可以看到时间

相关文章:

Elasticsearch集群与日志系统实战部署指南

一、环境规划与初始化配置 1. 服务器资源分配 IP地址部署服务主机名172.25.23.7ES Kafka Zookeeper Kibananode1172.25.23.8ES Kafka Zookeeper Filebeatnode2172.25.23.9Kafka Zookeeper Apache Logstashnode3 系统要求&#xff1a; 配置&#xff1a;4核CPU / 4G…...

SFT数据处理部分的思考

SFT数据及处理的业内共识 1&#xff0e;prompt的质量和多样性远重要于数据量级&#xff0c;微调一个 30 b 量级的base model只需要 10 w 量级的数据即可 参考&#xff1a;《LIMA&#xff1a;Less Is More for Alignment》 2&#xff0e;合成数据很重要&#xff01;一般需要通过…...

netsh实现TCP端口转发

服务器&#xff1a;192.168.31.9 端口&#xff1a;56000 客户端&#xff1a;192.168.31.2 端口&#xff1a;5600 客户端&#xff08;本地端口5600&#xff09;通过TCP连接服务器的56000端口 PC&#xff1a;192.168.31.5&#xff0c;PC实现客户端和服务器之间56000端口转发 1. …...

数据分布偏移检测:保障模型在生产环境中的稳定性

数据分布偏移检测:保障模型在生产环境中的稳定性 引言 在机器学习系统从开发环境部署到生产环境的过程中,数据分布偏移问题是影响模型性能的主要挑战之一。当训练数据与生产环境中的数据分布不一致时,即使是经过精心调优的模型也可能表现出明显的性能下降。本文将深入探讨…...

leetcode 75.颜色分类(荷兰国旗问题)

题目描述 题目分析 本题是经典的「荷兰国旗问题」&#xff0c;由计算机科学家 Edsger W. Dijkstra 首先提出。 要想单独解决这道题本身还是很简单的&#xff0c;统计0、1、2的数量然后按顺序赋值&#xff0c;或者手写一个冒泡排序&#xff0c;whatever。 但是在这一题中我们主…...

在windows上通过idea搭建doris fe的开发环境(快速成功版)

一、前置环境准备 1. 准备Linux环境&#xff0c;我起的虚机&#xff0c;使用CentOS8&#xff0c;4核、12G&#xff0c;磁盘50G 1.1.备份yum源 # 系统下载连接&#xff1a;magnet:?xturn:btih:9DB46A612D04763AA7DB02A0FF63EDE2EA555867&dnCentOS-8.1.1911-x86_64-dvd1.…...

MyBatis源码分析の配置文件解析

文章目录 前言一、SqlSessionFactoryBuilder1.1、XMLConfigBuilder1.2、parse 二、mappers标签的解析2.1、cacheElement2.1.1、缓存策略 2.2、buildStatementFromContext2.2.1、sql的解析 前言 本篇主要介绍MyBatis源码中的配置文件解析部分。MyBatis是对于传统JDBC的封装&…...

python爬虫笔记(一)

文章目录 html基础标签和下划线无序列表和有序列表表格加边框 html的属性a标签&#xff08;网站&#xff09;target属性换行线和水平分割线 图片设置宽高width&#xff0c;height html区块——块元素与行内元素块元素与行内元素块元素举例行内元素举例 表单from标签type属性pla…...

docker后台运行,便于后期用命令行进入它的终端

在 docker compose up --build -d 命令中&#xff0c;​**-d​&#xff08;或 --detach&#xff09;参数的作用是让容器以后台模式&#xff08;detached mode&#xff09;​**运行。以下是详细解释&#xff1a; ​**-d 参数的作用** ​后台运行容器&#xff1a; 默认情况下&a…...

剑指 Offer II 087. 复原 IP

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20087.%20%E5%A4%8D%E5%8E%9F%20IP/README.md 剑指 Offer II 087. 复原 IP 题目描述 给定一个只包含数字的字符串 s &#xff0c;用以表示一个 IP 地址&#xf…...

DC-6靶机详解

一、主机发现 arp-scan -l靶机ip为192.168.55.159 二、端口扫描、目录枚举、指纹识别、 2.1端口扫描 nmap 192.168.55.159发现没有开放特殊端口 看来信息收集的重点要放在网页中了 2.2目录枚举 dirb http://192.168.55.1592.3指纹识别 nmap 192.168.55.159 -sV -sC -O …...

Java构造方法详解:从入门到实战

目录 一、什么是构造方法&#xff1f; 二、构造方法的作用 三、构造方法分类与使用 1. 默认构造方法 2. 有参构造方法 3. 构造方法重载 四、注意事项&#xff08;避坑指南&#xff09; 五、经典面试题解析 六、实战应用场景 七、总结 一、什么是构造方法&#xff1f; …...

STM32-SPI通信外设

目录 一&#xff1a;SPI外设简介 SPI框图​编辑 SPI逻辑 ​编辑 主模式全双工连续传输 ​编辑 非连续传输 二&#xff1a;硬件SPI读写W25Q64 1.接线&#xff1a; 2. 代码 SPI外设的初始化 生成时序 一&#xff1a;SPI外设简介 STM32内部集成了硬件SPI收发电路&#…...

远程控制中的云电脑是什么意思?1分钟学会用

很多常用我们ToDesk远程控制的朋友们或许会注意到无论是在PC端还是移动端中都出现有【云电脑】【来云电脑爽玩-新用户免费1小时】这些词句等信息。那么这究竟是代表什么意思呐&#xff1f;云电脑是什么又怎么用呐&#xff1f;为什么要增加云电脑&#xff1f;以下小编就为大家科…...

【go】Go 语言中 errors.Is 和 errors.As 的区别

Go 语言中 errors.Is 和 errors.As 的区别 核心区别概述 errors.Is 和 errors.As 是 Go 1.13 引入的错误处理函数&#xff0c;它们有着不同的用途&#xff1a; errors.Is: 判断错误链中是否包含特定的错误值&#xff08;错误相等性检查&#xff09;errors.As: 尝试将错误转换…...

网络爬虫【简介】

我叫补三补四&#xff0c;很高兴见到大家&#xff0c;欢迎一起学习交流和进步 今天来讲一讲视图 一、网络爬虫的定义 网络爬虫&#xff08;Web Crawler&#xff09;&#xff0c;又称为网络蜘蛛、网络机器人等&#xff0c;是一种按照一定规则自动抓取互联网信息的程序或脚本。它…...

JPA动态查询自定义排序规则

方法1&#xff1a;使用 CASE WHEN 语句排序 // 自定义排序逻辑 // 定义“离线”排在前&#xff0c;“在线”排在后 Expression<Object> caseExpression cb.selectCase().when(cb.equal(root.get("status"), "离线"), 0).when(cb.equal(root.get(…...

卫语句优化多层if else嵌套

一、卫语句的介绍 卫语句是一种编程实践&#xff0c;用于在函数或方法的开头快速处理不符合条件的情况&#xff0c;从而避免深层次的嵌套结构。它的核心思想是尽早返回&#xff0c;减少嵌套&#xff0c;使代码更加清晰易读。 二、卫语句的作用 提高可读性&#xff1a;卫语句将…...

2024华东师范大学计算机复试上机真题

2024华东师范大学计算机复试机试真题 2023华东师范大学计算机复试机试真题 2022华东师范大学计算机复试机试真题 2024华东师范大学计算机复试上机真题 2023华东师范大学计算机复试上机真题 2022华东师范大学计算机复试上机真题 在线评测&#xff1a;传动门&#xff1a;pgcode…...

3.15刷题

P6337 [COCI 2007/2008 #2] CRNE - 洛谷 #include<bits/stdc.h> using namespace std; int main(){int n;cin>>n;//横加竖 最大。n/2,n/21if(n%20){cout<<(n/21)*(n/21);}else cout<<(n/22)*(n/21);return 0; }P6338 [COCI 2007/2008 #2] PRVA - 洛…...

14.使用各种读写包操作 Excel 文件:辅助模块

一 各种读写包 这些是 pandas 在底层使用的各种读写包。无须安装 pandas&#xff0c;直接使用这些读写包就能够读写 Excel 工作簿。可以尽可能地使用 pandas 来解决这类问题&#xff0c;只在 pandas 没有提供你所需要的功能时才用到读写包。 表中没有 xlwings &#xff0c;因为…...

设计心得——多态

一、设计上的多态 无论是在网上还是书籍上&#xff0c;还是自己的文章里都反复分析过多态的原理、应用和各种常见的情况。本篇重点从设计的角度来阐述一下多态&#xff0c;而不对多态的具体的用法进行说明。在前面的知识学习中可以知道&#xff0c;多态可以分为动多态和靜多态…...

【DeepSeek】本地部署DeepSeek的完整教程(Ollama+Docker+Open WebUI)

本地部署DeepSeek的完整教程 文章目录 本地部署DeepSeek的完整教程写在前面技术需求详细步骤一. 安装Ollama软件二. 安装DeepSeek-R1模型三. 安装Docker软件四. 配置Web UI界面问题解决1. 打开`docker desktop`时,一直显示`Docker Engine stopped`2. 用`Docker`拉取`Open WebU…...

Python数据分析之数据可视化

Python 数据分析重点知识点 本系列不同其他的知识点讲解&#xff0c;力求通过例子让新同学学习用法&#xff0c;帮助老同学快速回忆知识点 可视化系列&#xff1a; Python基础数据分析工具数据处理与分析数据可视化机器学习基础 四、数据可视化 图表类型与选择 根据数据特…...

1、操作系统引论

一、操作系统 会使用linux系统 建议大家先学会linux的基础指令&#xff0c;可以看菜鸟教程网站进行学习。 1、各种定义 操作系统定义 管理计算机的 硬件 和软件资源&#xff0c; 能对各类作业进行调度&#xff0c;方便用户使用计算机的程序集合。操作系统运行在内核态&#xf…...

DeepSeek 本地化新篇章:Ollama 兼容 OpenAI API 的深度解析与部署实践

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着大语言模型(LLM)的快速发展,开发者对本地化部署和 API 兼容性的需求日益增加。Ollama 作为一个轻量级开源框架,通过兼容 OpenAI AP…...

【PTA题目解答】7-4 数气球 (20分)

1.题目 天空上有n个气球&#xff0c;第i个气球的颜色为colori​&#xff08;为全由小写字母组成的字符串&#xff09; 请你数出每种颜色的气球的数量&#xff0c;并按照颜色出现的先后顺序进行排序输出。 输入格式: 测试数据有T组(1≤T≤100)。 对于每组样例&#xff0c;第一…...

Swift 中 associatedtype 的用法详解

目录 前言 1.什么是associatedtype 2.associatedtype 的作用 1.让协议支持泛型 2.让协议支持不同的数据类型 3.结合 where 关键字限制类型 4.什么时候使用 associatedtype 5.总结 前言 在 Swift 语言中&#xff0c;泛型&#xff08;Generics&#xff09;是一个非常强大…...

java泛型通配符?及上下界(extends,super)保证安全性、灵活性、可读性

在 Java 中&#xff0c;泛型通配符&#xff08;?&#xff09;用于表示未知类型&#xff0c;通常用于增强泛型的灵活性。通配符可以与上下限结合使用&#xff0c;以限制泛型的范围。以下是通配符及上下限的使用示例&#xff1a; 1. 无界通配符 (?) 无界通配符表示可以接受任意…...

HarmonyOS NEXT - 网络请求问题(http)

HTTP&#xff08;HyperText Transfer Protocal&#xff0c;超文本传输协议&#xff09;是一种用于传输超媒体文档&#xff08;如HTML&#xff09;的应用层协议&#xff0c;它是客户端和服务器之间通信的基础&#xff1b;无论是获取数据、提交表单、上传文件&#xff0c;HTTP都扮…...