scrapy源码分析
一、初出茅庐
1 架构总览
Scrapy的基础架构:
关于架构,很有趣的一点是在Scrapy文档里的问题:
Did Scrapy “steal” X from Django?
Probably, but we don’t like that word. We think Django is a great open source project and an example to follow, so we’ve used it as an inspiration for Scrapy.
We believe that, if something is already done well, there’s no need to reinvent it. This concept, besides being one of the foundations for open source and free software, not only applies to software but also to documentation, procedures, policies, etc ...
Docker
docker
持续更新中…
一、 简介
1 虚拟化技术
虚拟化技术是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。虚拟机和docker都属于虚拟化技术的一种。
2 容器技术
容器技术属于虚拟化技术。当一个项目仅由几个大组件构成的时候,可以为它们单独创建虚拟机,为它们提供完全独立的环境(分配独立的硬件环境);但是,但这些组件逐渐解耦成为更小的组件,它们的数量逐渐增长,为它们一一分配虚拟机是浪费资源的行为,并且大大增加了系统管理员和运维人员的负担。
容器技术应运而生地解决了这个问题,它的开销相比虚拟机小很多,并且在一台机器上允许运行多个相互隔离的服务。在宿主机看来,一个容器不过是一个运行的进程,在容器本身看来,就好像是机器和操作系统上运行的唯一一个进程。
3 虚拟机和容器比较
虚拟机和容器比较,容器更加轻量。因为容器直接运行在宿主机的操作系统上,虚拟机则需要创建出虚拟的硬件资源,将操作系统跑在这些硬件资源之上。
但是虚拟机的好处是它们提供完全隔离的环境,每个虚拟机运行在自己的linu ...
MySQL
MySQL
一、数据库概述
数据库的本质其实就是一款基于网络通信的程序,用于持久化数据,可以理解为存储数据的“仓库”,它保存了一系列有组织的数据。以实现结构化查询,方便管理。
1 数据库相关概念
DB:数据库,保存一组有组织的数据的容器
DBMS:数据库管理系统,又称为数据库软件(产品),用于管理DB中的数据
SQL:结构化查询语言,用于和DBMS通信的语言
SQL 的优点:
不是某个特定数据库供应商专有的语言,几乎所有 DBMS 都支持 SQL 。
简单易学。
虽然简单,但实际上是一种强有力的语言,灵活使用其语言元素,可以进行非常复杂和高级的数据库操作。
2 数据库存储数据的特点
将数据放到表中,表再放到库中一个数据库中可以有多个表,每个表都有一个的名字,用来标识自己。表名具有唯一性。
表具有一些特性,这些特性定义了数据在表中如何存储,类似java中 “类”的设计。
表由列组成,我们也称为字段。所有表都是由一个或多个列组成的,每一列类似java 中的”属性”
表中的数据是按行存储的,每一行类似于java中的“对象”。
3 数据库的分类
关系型数据库:数据之间彼此 ...
pycharm配置远程解释器开发
在windows上开发python,经常会遇到第三方库无法安装的情况,比如lxml,scrapy,celery,twisted等,有些可以通过手动安装wheel文件来解决(wheel文件下载地址),有些根本无法安装,遇到这样的问题,解决方案如下:
换电脑:最简单的方法,换成linux或者mac
在windows电脑安装ubuntu虚拟机,在虚拟机中开发
配置远程解释器,仍然在本地windows开发,使用远程linux的解释器运行
本文介绍的就是第三种方法。
pycharm提供了多种方式配置远程解释器,下面分别介绍。
一、配置SSH解释器
步骤如下:
打开pycharm-->左上角settings-->Python Interpreter-->小齿轮-->Add..
如果勾选了Automatically upload project files to the server,你本地的代码会自动上传到远程服务器,无需手动上传。
接下来运行代码测试一下:
如果需要安装第三方模块,可以通过编写requirements.txt,连接到远程服务器,执行
1pip3 ...
MongoDB
MongoDB
一、介绍
1 基本介绍
MongoDB是一个基于分布式文件存储的数据库,由C++编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。它是一个面向文档(document-oriented)的数据库,而不是关系型数据库。它支持的数据结构非常松散,类似json格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,几乎可以实现类似关系数据库单表查询的绝大部分功能。
MongoDB作为一款通用型数据库,除了能够创建、读取、更新和删除数据之外,还提供了一系列不断扩展的独特功能:
索引
支持通用二级索引,允许多种快速查询,且提供唯一索引、复合索引、地理空间索引、全文索引
聚合
支持聚合管道,用户能通过简单的片段创建复杂的集合,并通过数据库自动优化
特殊的集合类型
支持存在时间有限的集合,适用于那些将在某个时刻过期的数据,如会话session。类似地,MongoDB也支持固定大小的集合,用于保存近期数据,如日志
文件存储
支持一种非常易用的协议,用于存储大文件和文件元数据。MongoDB并不具备一些在关系型数据库中很普遍的功能,如链 ...
Kubernetes-Helm
十二、Helm
在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了 Kubernetes 应用的部署和管理。
Helm 本质就是让 K8s 的应用管理(Deployment,Service 等 ) 可配置,能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml,service.yaml)。然后调用Kubectl自动执行K8s资源部署。
Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有两个重要的概念:chart和release:
chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包。
release 是 chart 的运行实例,代表了一个正在运行的应用。当 c ...
hexo自动更新文章修改时间
一、问题描述
在部署完Github Action实现自动部署博客之后,存在一个问题,每次更新时,由于是云函数部署,所有的文章的更新时间都会改变,目前只能通过为文章添加updated字段再提交才能避免这种情况。
但是每次更新文章都要手动去修改updated,这么麻烦的事情当然要交给程序去做。想过用python但是考虑到有些人可能没有python环境,而使用hexo部署博客的人肯定都有node环境,因此采用js来完成。
二、解决方案
首先,如果你之前没有为文章添加updated字段,需要先添加上。
1 为现有的文章添加updated字段
如果你现有文章已经有updated字段,此步骤可以跳过。
代码参考:批量写入文件的修改时间,原来的代码在多次运行时,重复添加字段,我对其做了优化,重复运行也只会添加一个updated字段。
创建js文件:博客根目录/source/_posts/writeupdatetime.js,文件内容如下
12345678910111213141516171819202122232425262728293031323334353637383940414243444 ...
Kubernetes-计算资源管理
十一、计算资源管理
到目前为止,我们在创建pod时并不关心它们使用CPU和内存资源的最大值。但是在某些场景下,为一个pod配置资源的预期使用量和最大使用量是pod定义中的重要组成部分。通过设置这两组参数,可以确保pod公平地使用Kubernetes集群资源,同时也影响着整个集群pod的调度方式。
1 基本概念
1.1 请求和约束
如果 Pod 运行所在的节点具有足够的可用资源,容器可能(且可以)使用超出对应资源 request 属性所设置的资源量。不过,容器不可以使用超出其资源 limit 属性所设置的资源量。
1.2 资源类型
CPU 和内存都是资源类型。每种资源类型具有其基本单位。 CPU 表达的是计算处理能力,其单位是 Kubernetes CPUs。 内存的单位是字节。
CPU 和内存统称为计算资源,或简称为资源。计算资源的数量是可测量的,可以被请求、被分配、被消耗。它们与API 资源不同。 API 资源(如 Pod 和 Service)是可通过Kubernetes API服务器读取和修改的对象。
1.3 Kubernetes中的资源单位
CPU资源的约束和请求以CPU为单位 ...
Kubernetes-API Server的访问控制
十、API Server的访问控制
Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。API Server是集群内部各个组件通信的中介,也是外部控制的入口。所以Kubernetes的安全机制基本就是围绕保护API Server来设计的。
在第八章中,提到API服务器的安全防护流程,当请求到达 API 时,它会经历多个阶段,如下图所示:
Kubernetes使用了认证(Authentication)、鉴权(Authorization)、准入控制(Admission Control)三步来保证API Server的安全。
1 认证
API服务器接收到的请求会经过一个认证插件的列表,列表中的每个插件都可以检查这个请求和尝试确定谁在发送这个请求。列表中的第一个插件可以提取请求中客户端的用户名、用户ID和组信息,并返回给API服务器。API服务器会停止调用剩余的认证插件井继续进入授权阶段。
认证分为两种:
客户端认证:控制k8s组件对API服务器的访问,比如kubectl、Controller Manager、Scheduler、kubelet、kube- ...
Kubernetes-高级调度
九、高级调度
在第八章中,介绍了调度器的工作过程,以及调度器的过滤和打分行为,这些操作都是k8s的自主行为,用户并不需要干预。而高级调度就是指Kubernetes允许你去影响pod被调度到哪个节点。
1 污点和容忍度
1.1 介绍污点和容忍度
首先要介绍的高级调度的两个特性是节点污点, 以及pod对于污点的容忍度,这些特性可以阻止pod调度到特定节点。
先来看看现有节点的污点信息,默认情况下,一个集群中的主节点需要设置污点,这样才能保证只有控制面板pod才能部署在主节点上:
1kubectl describe node k8s-master
输出的结果如下(部分):
1234567891011121314151617Name: k8s-masterRoles: masterLabels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/ar ...