k8s-项目测试环境部署
部署规划
概述
项目开发好后,我们需要部署,我们接下来就基于 阿里云云效 + 阿里云容器镜像服务 + k8s 搭建部署环境
阿里云云效 : 放代码,可以做cicd(https://www.aliyun.com/product/yunxiao)
阿里云容器镜像服务 : 镜像仓库(https://cr.console.aliyun.com/cn-guangzhou/instances)
k8s : 运行服务
我们只在k8s内部运行服务,至于中间件(mysql、redis、es等)就会部署在k8s之外,如果你是线上使用云服务可以直接使用云服务,如果自建也最好运行在k8s之外。这里主要演示如何部署go-zero服务到k8s中
k8s部署,参考上一篇【centos7.9 搭建k8s】,再不行就去买个按时付费的云服务k8s
所以我们需要配置如下:
| 服务器名称 | 作用 | Ip | 
|---|---|---|
| k8s集群 | k8s集群,运行服务 | 服务器A | 
| 中间件 | 部署nginx、mysql、redis、es等等,k8s内部连接到此服务器 | 服务器B | 
项目
项目参考go-zero-looklookhttps://github.com/Mikaelemmmm/go-zero-looklook,或者自己参考go-zero-looklook自己写个简单的版项目。
云效使用
查看官网文档,快速入门https://help.aliyun.com/document_detail/153762.html?
- 创建项目
 - 配置ssh公钥
 - 上传项目
 - 配置流水线
 
阿里云容器镜像服务
查看官网文档使用https://help.aliyun.com/zh/acr/user-guide/container-registry-personal-instance-edition-documentations/?spm=a2c4g.11186623.0.0.5ac1285d1C30XT
使用个人版
- 创建命名空间
 - 创建镜像仓库
 - 仓库里面有操作指南,登录、拉取镜像、推送镜像等
 
k8s部署
参考上一篇【centos7.9 搭建k8s】
发布服务到k8s
以上把我们需要用到云效、容器镜像服务、k8s准备好了,现在来编写云效流水线将我们的服务通过云效完整的发布到k8s中。
部署中间件
将nginx、mysql、redis、es等部署到k8s之外,用作线上独立环境(至于你想把某些中间件部署到k8s内部这个自行处理,本次重点是如何将go-zero开发的微服务部署到k8s集群内部),这里我就直接使用项目下的docker-compose-env.yaml了,把所有依赖的第三方中间件环境直接安装在服务器B这台服务器,前提是这台服务器已经安装好docker、docker-compose。
登陆到 服务器B
cd /usr/local/src/
mkdir data && cd data && vim docker-compose.yml
docker-compose up -d
docker-compose ps #查看确认
 
es占用资源比较大,一开始不需要可以先停了。filebeat日志收集也一样,这个比较占用磁盘空间。
独立配置
将每个服务的配置都独立出来,统一放在一个仓库,这样只给一个人线上仓库的权限,如果线上配置有变直接修改这个仓库的文件,在云效做cd的时候,会先拉取代码在拉取对应服务的配置自动构建,具体可以看后面的pipline。
【问】为什么不用配置中心?
1)修改db、redis等需要重启服务,但是有一些配置又不需要重启服务,运维有要去记,记混了比较容易造成线上事故
2)方便回滚。我们发新版本到线上,并且又改了新版本配置。这时候线上用户反馈有问题,线上需要快速回滚的话,如果我们使用将文件构建到镜像中,直接使用k8s一行命令就可以将上一个版本代码加配置直接回滚回来。如果使用了配置中心,回滚了代码,还要将上个版本的配置去配置中心改回来很麻烦,
独立线上仓库目录结构如下(这个结构是跟pipline中写法相关的)
 
仓库地址 : https://github.com/Mikaelemmmm/go-zero-looklook-pro-conf , 直接下载就好
【注】1、修改配置中的中间件,数据库、redis等都要改成
服务器B这台机器的IP,我们这台机器是线上环境的中间件。
2、另外一个就是我们的服务发现,线上我们部署在k8s中,go-zero直接支持k8s服务发现,所以不需要etcd等,我们在配置zrpc client的时候,要改成target,k8s的配置方式。
3)因为在云效流水线上面我们需要使用到goctl,所以需要把goctl一起上传到配置仓库里面
 官网下载地址:https://go-zero.dev/docs/tasks/installation/goctl
 
下载解压,只需要上传goctl文件
 
4)因为在云效流水线上我们需要知道对应服务的端口号,所以需要把port.sh一起上传到配置仓库里面
 port.sh内容如下
#!/bin/shcase $1 in
"identity-api") echo 1001
;;
"identity-rpc") echo 1101
;;
"usercenter-api") echo 1002
;;
"usercenter-rpc") echo 1102
;;
"message-mq") echo 1207
;;
"mqueue-rpc") echo 1106
;;
"order-api") echo 1004
;;
"order-mq") echo 1204
;;
"order-rpc") echo 1104
;;
"payment-api") echo 1005
;;
"payment-rpc") echo 1105
;;
"travel-api") echo 1003
;;
"travel-rpc") echo 1103
esac
 
最终独立线上仓库目录结构如下
 
1、goctl版本需要>=1.3.3。
2、在Windows下上传需要注意goctl和port.sh文件权限问题。
编写云效的pipline
k8s配置
配置服务发现
创建looklook项目的命名空间
kubectl create namespace go-zero-looklook
 
【注】:!!!非常重要!!!
1、构建优化:pipline中使用"goctl kube xxx"生k8s yaml的时候,我们是使用k8s方式部署不需要etcd,但是这种方式部署需要为生成的k8s yaml中指定serviceAccount。 原理可以看这篇文章下方go-zero的k8s服务发现讲解 :https://mp.weixin.qq.com/s/-WaWJaM_ePEQOf7ExNJe7w
我这边已经指定好了serviceAccount : find-endpoints
所以你需要在你的k8s创建find-endpoints这个serviceAccount并绑定相应权限,yaml文件我已经准备好了,你只需要执行
kubectl apply -f auth.yaml 即可 ,auth.yaml文件如下:
#创建账号
apiVersion: v1
kind: ServiceAccount
metadata:namespace: go-zero-looklookname: find-endpoints---
#创建角色对应操作
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: discov-endpoints
rules:
- apiGroups: [""]resources: ["endpoints"]verbs: ["get","list","watch"]---
#给账号绑定角色
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: find-endpoints-discov-endpoints
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: discov-endpoints
subjects:
- kind: ServiceAccountname: find-endpointsnamespace: go-zero-looklook
 
配置好后,pipline生成k8s yaml的文件可以在生成时候指定serviceAccount,也就是说pipline中可以直接指定-serviceAcount 直接就在生成k8s的yaml中添加serviceAccount : find-endpoints,如下命令
./goctl kube deploy -secret docker-login -replicas 2 -nodePort 3${port} -requestCpu 200 -requestMem 50 -limitCpu 300 -limitMem 100 -name ${JOB_NAME}-${type} -namespace go-zero-looklook -image ${docker_repo}/${image} -o ${deployYaml} -port ${port} --serviceAccount find-endpoints
 
配置k8s拉取私有仓库镜像
k8s在默认情况下,不能拉取我们镜像服务的私有仓库镜像,如果拉取私有仓库镜像,则是会报 ErrImagePull 和 ImagePullBackOff 的错误
1、先在服务器A(k8s部署机)登陆阿里云镜像
 
$ docker login --username=*** registry.cn-guangzhou.aliyuncs.com
$ Username: admin
$ Password:
Login Succeeded
 
2、在k8s中生成登陆harbor配置文件
#查看上一步登陆harbor生成的凭证
$ cat /root/.docker/config.json
{"auths": {"registry.cn-guangzhou.aliyuncs.com": {"auth": "6KaD5pe25qOuOnFp123zMTIzLg=="}}
}
 
3、对秘钥文件进行base64加密
$ cat /root/.docker/config.json  | base64 -w 0ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEuMTgwOjgwNzciOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0=
 
4、创建docker-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: docker-login
type: kubernetes.io/dockerconfigjson
data:.dockerconfigjson: xxxxxxxxxxxxxxxx
 
$ kubectl create -f docker-secret.yaml -n go-zero-looklooksecret "docker-login" created
 
云效k8s连接
参考文档https://help.aliyun.com/document_detail/202419.html
登录到云效,进入项目里面,进入云效Kubernetes 集群管理页面(https://flow.aliyun.com/setting/kubernetes-manage),新建Kubernetes 集群

连接服务器A,获取k8s配置信息,并复制到阿里云中导入K8S集群
$ cat /etc/rancher/k3s/k3s.yaml
----------------
apiVersion: v1
clusters:
- cluster:certificate-authority-data: xxxxxxxxxserver: https://127.0.0.1:6443name: default
contexts:
- context:cluster: defaultuser: defaultname: default
current-context: default
kind: Config
preferences: {}
users:
- name: defaultuser:client-certificate-data: xxxxxclient-key-data: xxxxxxx
 
注意在阿里云上把其中的IP改成公网IP:server: https://127.0.0.1:6443 -> server: https://公网IP:6443
云效添加服务连接
登录到云效,进入项目里面,进入云效服务连接管理页面(https://flow.aliyun.com/setting/service-connection),新建服务连接
容器镜像服务连接
按照下图操作,阿里云容器镜像服务授权即可
 
 
云效代码服务连接
按照下图操作,云效服务授权即可
 
 
创建流水线
登录到云效,进入项目里面
 
我们先创建usercenter用户服务的流水线,如下图
 
1、修改流水线名称
 
配置变量和缓存
 
- SERVICE_NAME: 发布的服务名称
 - DOCKER_REGISTRY:容器服务注册地址+命名空间
 - type: 运行时,选择发布服务的类型:rpc、api、mq
 
2、添加流水线源
 添加流水线源->代码源选择云效->添加云效服务连接->选择代码仓库和分支
 项目仓库和配置仓库都添加进来
 
 
 
工作目录和仓库名保持一致。上面截图错误了,请注意。或者自行修改命令行涉及到的工作目录
3、编辑单元测试
 编辑单元测试->流水线源选择配置仓库
 
 删除原来的步骤->添加新步骤
 
 添加执行命令
chmod +x goctl
./goctl -v
 

4、编辑镜像构建
 删除原来的步骤->添加新步骤->构建->执行命令类型
 4.1 拷贝服务配置文件
 
yes | cp -rf /root/workspace/looklook-pro-conf/${SERVICE_NAME}/${type}/${SERVICE_NAME}.yaml app/${SERVICE_NAME}/cmd/${type}/etc
 
4.2 goctl创建Dockerfile
 
chmod +x /root/workspace/looklook-pro-conf/goctl
cd app/${SERVICE_NAME}/cmd/${type} && /root/workspace/looklook-pro-conf/goctl docker -go ${SERVICE_NAME}.go && ls -l
cat Dockerfile
 
4.3 复制Dockerfile到项目根目录
 
cp app/${SERVICE_NAME}/cmd/${type}/Dockerfile ./  && ls -l
 
4.4 镜像构建并推送至阿里云镜像仓库个人版
 添加步骤->构建->镜像构建并推送至阿里云镜像仓库个人版类型
 
- 连接服务:容器镜像服务连接
 - 地域:看自己地方选
 - 仓库:现在直接输入,因为涉及到变量
 
registry.cn-guangzhou.aliyuncs.com/镜像命名空间/${SERVICE_NAME}-${type}
 
- 标签: 镜像的标签
 
${CI_COMMIT_ID_1}-${CI_COMMIT_ID_2}
 

 5、添加新任务,k8s发布
 
 
5.1 删除原有yaml文件
 添加新步骤->构建->执行命令类型
 
rm -f ${DEPLOY_YAML}
# 变量 DEPLOY_YAML = ${SERVICE_NAME}-${type}-deploy.yaml
 
5.2 创建K8S YAML
 
chmod +x ./goctl
chmod +x ./ports.sh
export port=$(./ports.sh ${SERVICE_NAME}-${type})
./goctl kube deploy -secret docker-login -replicas 2 -minReplicas 1 -maxReplicas 3 -nodePort 3${port} -requestCpu 200 -requestMem 50 -limitCpu 300 -limitMem 100 -name ${SERVICE_NAME}-${type} -namespace go-zero-looklook -image ${IMAGE_NAME} -o ${DEPLOY_YAML} -port ${port} -serviceAccount find-endpoints
cat ${DEPLOY_YAML}# 变量 IMAGE_NAME = ${DOCKER_REGISTRY}/${SERVICE_NAME}-${type}:${CI_COMMIT_ID_1}-${CI_COMMIT_ID_2}
# 变量 DEPLOY_YAML = ${SERVICE_NAME}-${type}-deploy.yaml
 
5.3、发布k8s
 把默认的步骤拉到最后面
 
- 集群连接:选择我添加的k8s连接
 - Kubectl版本:选择和部署一直或者相近的版本(不同可能有兼容问题)
 - 命名空间:上面k8s配置的时候我们有为项目创建命名空间
 - YAML路径:
 
6、配置完成
运行测试
1、先运行RPC,再运行API
 
2、构建完成
 
3、查看构建推送到容器服务的镜像
 
4、查看服务器Ak8s部署的节点
 
kubectl get pods -n go-zero-looklook //查看节点kubectl describe pod usercenter-api-cc7959b84-fk4p6  -n go-zero-looklook //查看节点详细信息kubectl logs usercenter-api-cc7959b84-fk4p6 -n go-zero-looklook//查看节点日志
 
问题
1、Pod状态一直 ErrImagePull / ImagePullBackOff
 排查:kubectl describe、kubectl log查看日志,排查到原因是无法下载镜像
 解决:阿里云镜像仓库提供公网、私网的地址,yaml文件中填写私网仓库地址无法拉取到镜像,需要改为公网
2、pod一直重启(RESTARTS一直往上增加)
 排查:
- kubectl describe、kubectl log查看日志。
 - 直接在服务器运行镜像,访问接口查看报错信息(需要把链接RPC模式改成直连)


 
docker images
docker run -p 1004:1004 5cb981c83a2b
 
- 排查到的原因,代码错误
 
解决:修正代码
3、端口访问错误
 ./goctl kube deploy -secret docker-login -… 3 -nodePort 32004 … -port 2004 -serviceAccount find-endpoints
在pod里面监听的是2004端口(-port 2004),对外暴露是32004端口(-nodePort 32004)
4、目前Prometheus是监控不到的,真正线上环境自行研究,或者直接买个按时付费的云服务k8s
相关文章:
k8s-项目测试环境部署
部署规划 概述 项目开发好后,我们需要部署,我们接下来就基于 阿里云云效 阿里云容器镜像服务 k8s 搭建部署环境 阿里云云效 : 放代码,可以做cicd(https://www.aliyun.com/product/yunxiao) 阿里云容器镜像服务 :…...
【Elasticsearch管理】缓存机制
文章目录 缓存Field data cache(字段数据缓存)Node query cache(节点查询缓存)Indexing buffer(索引缓冲区)Shard request cache(分片请求缓存)缓存失败启用/禁用缓存根据请求启用/禁…...
JS api基础初学
轮播图随机版 需求:当我们刷新页面,页面中的轮播图会显示不同图片以及样式 分析:①:准备一个数组对象,里面包含详细信息(素材包含) ②:随机选择一个数字,选出数组对应…...
uniapp实战:父子组件传参之子组件数量动态变化
需求说明 现有的设置单元列表,每个带有虚线加号的可以看做是一组设置单元,点击加号可以添加一组设置单元.点击设置单元右上角可以删除对应的设置单元. 实现思路说明 利用数组元素添加或是删除的方式实现页面数量动态变化.由于每个设置单元内容都相同所以单独封装了一个子组件.…...
Ubuntu绑定USB接口到固定端口
绑定端口 打开终端,输入以下命令查看USB端口信息: udevadm info -a -n /dev/ttyUSB0执行后,可以看到部分输出如下: 找到第一个,a-b:c格式的KERNELS,记住这个值,后面会用到。 linlin-B660M-D2H-DDR4:~$ u…...
解决gogs勾选“使用选定的文件和模板初始化仓库”报错500,gogs邮件发送失败,gogs邮件配置不生效,gogs自定义模板等问题
解决gogs勾选“使用选定的文件和模板初始化仓库”报错500,gogs邮件发送失败,gogs邮件配置不生效,gogs自定义模板等问题 前几天出了教程本地部署gogs,在后期运行时发现两个问题: 第一:邮件明明配置了,后台显示未配置,…...
数字后端——DEF文件格式
文章目录 MACRO的不同orientationDEF中在macro orientation定义前需要留空格 MACRO的不同orientation DEF中在macro orientation定义前需要留空格 像下图中这种方向和分号之间没有空格的情况,就是有问题的格式。...
【可做课设、附完整技术文档】流式、异步、实时的Django聊天室!(需进一步定制可联系本人)
介绍 完整源码以及完整项目文档请看源码链接。 此Django项目实现了一个精致易扩展的实时聊天室,可直接作为网页开发的课程设计提交,也可二次开发,比如添加更好看的样式,或者更多更酷炫的功能。 实现了如下功能: 流…...
网络编程:基于TCP和UDP的服务器、客户端
1.基于TCP通信服务器 程序代码: 1 #include<myhead.h>2 #define SER_IP "192.168.126.121"//服务器IP3 #define SER_PORT 8888//服务器端口号4 int main(int argc, const char *argv[])5 {6 //1.创建用于监听的套接字7 int sfd-1;8 sf…...
kubectl 命令行管理K8S(上)
目录 陈述式资源管理方式 介绍 命令 项目的生命周期 创建 kubectl create命令 发布 kubectl expose命令 更新 kubectl set 回滚 kubectl rollout 删除 kubectl delete 应用发布策略 金丝雀发布 陈述式资源管理方式 介绍 1.kubernetes 集群管理集群资源…...
Redis 之四:Redis 事务和乐观锁
事务特点 Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证: 批量操作在发送 EXEC 命令前被放入队列缓存。 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。不具备原子性。 在事务执…...
C# WPF编程-创建项目
1.创建新项目 选择“WPF应用程序”》“下一步” 设置项目 设置项目名称,保存位置等参数>下一步 3.选择框架 4.项目创建成功 5.运行项目...
密码学及其应用(应用篇15)——0/1背包问题
1 问题背景 背包问题是一个经典的优化问题,在计算机科学和运筹学中有着广泛的应用。具体到你提到的这个问题,它是背包问题中的一个特例,通常被称为0/1背包问题。这里,我们有一系列的正整数 ,以及一个正整数,…...
基于springboot+vue的实验室管理系统(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 主要内容:毕业设计(Javaweb项目|小程序|Pyt…...
华为OD技术面试案例5-2024年
背景 985本计算机专业,目标院校。 1.15 投递 在某BOSS上投递的简历,HR人很nice,非常负责任。 1.19 收到机试通知 第一题是一个哈夫曼编码,第三题是一个动态规划,机试整体难度不算高,刷leetcode hot100…...
【QT+QGIS跨平台编译】之五十五:【QGIS_CORE跨平台编译】—【qgsmeshcalcparser.cpp生成】
文章目录 一、Bison二、生成来源三、构建过程一、Bison GNU Bison 是一个通用的解析器生成器,它可以将注释的无上下文语法转换为使用 LALR (1) 解析表的确定性 LR 或广义 LR (GLR) 解析器。Bison 还可以生成 IELR (1) 或规范 LR (1) 解析表。一旦您熟练使用 Bison,您可以使用…...
Unity(第二十部)效果 粒子、线条和拖尾
1、粒子系统 粒子系统介绍 Unity 粒子系统是 Unity 引擎中用于创建和控制粒子效果的工具。它可以模拟各种自然现象,如火焰、烟雾、雨滴等,也可以用于创建特效,如魔法光芒、爆炸效果等。 粒子系统组成 在 Unity 中,粒子系统由发射…...
全量知识系统问题及SmartChat给出的答复 之6 三套工具之1
Q15. 提出想法和问题 前面说过,DDD在我要设计的全量知识系统中位于中间层,是专门用来解决“知识汤”问题的。 解决的思路就是以将为在特定领域中的公司经营提供一个责任-权限平面为目的,帮助他们调整商业模式以及组建恰当的组织,…...
[RoarCTF 2019]Easy Calc
这题考查的是: 字符串解析特性目录读取文件内容读取 字符串解析特性详解:PHP字符串解析特性 ($GET/$POST参数绕过)(含例题 buuctf easycalc)_参数解析 绕过-CSDN博客 ascii码查询表:ASCII 表 | 菜鸟工具 …...
完美解决 git 报错fatal: Not a git repository (or any of the parent directories): .git
问题描述 错误提示是找不到.git文件,无法执行git指令,意思是 当前你要提交的文件夹中没有.git这个文件 解决方案 执行如下命令: git init...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
