上机报告
一、上机题目
1.1 题目要求
利用Apache netty构建爬虫服务器,爬取一定数目的网页,将抓取的网页中的文本内容发送给客户端,客户端将数据存储到Apache kafka消息队列或redis数据库中。
1.2 题目分析
根据题目要求可知,完成该题目需要在Linux环境进行,部署Apache Kafka、Apache Zookeeper、Apache Netty以及Redis。
由上图可知,Netty构建的crawler sever服务器有两项功能,一是服务器中有多个爬虫爬取Internet上的网页信息并提取网页文本和url信息,二是监听客户端的连接状态并将网页信息传输至客户端。
客户端的功能是将从服务端获取的信息发送到消息队列或redis数据库中。
可以写测试类,从Kafka消息队列中取出消息,以及从redis中取出信息。
二、环境配置
初始环境:ubuntu18.04 LTS Desktop Edition+orcale JDK8/openJDK8
IDE:Jetbrains IntelliJ IDEA Ultimate Edition 2019.03
项目管理工具:maven
2.1 Zookeeper配置
由于Kafka是一个分布式的消息队列,依赖Zookeeper对分布式的系统的管理。Zookeeper 作为一个分布式的服务框架,主要用来解决分布式集群中应用系统的一致性问题,它能提供基于类似于文件系统的目录节点树方式的数据存储,但是 Zookeeper 并不是用来专门存储数据的,它的作用主要是用来维护和监控你存储的数据的状态变化。
可以在Zookeeper的官网下载最新版本的Zookeeper。获取到 Zookeeper 的压缩包并解压到某个目录如:/home/zookeeper-3.5.6 下,Zookeeper 的启动脚本在 bin 目录下,Linux 下的启动脚本是 zkServer.sh。
Zookeeper 的配置文件在 conf 目录下,这个目录下有 zoo_sample.cfg 和 log4j.properties,你需要做的就是将 zoo_sample.cfg 改名为 zoo.cfg,因为 Zookeeper 在启动时会找这个文件作为默认配置文件。
当这些配置项配置好后,你现在就可以启动 Zookeeper 了,启动后要检查 Zookeeper 是否已经在服务,可以通过 netstat – ano 命令查看是否有你配置的 clientPort 端口号在监听服务。
Kafka是一个分布式流处理系统,流处理系统使它可以像消息队列一样publish或者subscribe消息,分布式提供了容错性,并发处理消息的机制。
Kafka专为分布式高吞吐量系统而设计。 Kafka往往工作得很好,作为一个更传统的消息代理的替代品。 与其他消息传递系统相比,Kafka具有更好的吞吐量,内置分区,复制和固有的容错能力,这使得它非常适合大规模消息处理应用程序。
Kafka 对消息保存时根据 Topic 进行归类,发送消息者称为 Producer,消息接受者称为 Consumer,此外 kafka 集群有多个 kafka 实例组成,每个实例(server)成为 broker。在单机环境下,不需要考虑broker的问题。
但是,无论是 kafka 集群,还是 producer 和 consumer 都依赖于 zookeeper 集群保存一些meta 信息,来保证系统可用性。
从kafka的官网获取最新版本的kafka进行解压,kafka的二进制包中已经包含了默认配置的zookeeper。kafka启动过程如下:
#切换到kafka目录下
$ cd kafka_xxxx
#启动zookeeper
$ bin/zookeeper-server-start.sh config/zookeeper.properties
#启动kafka
$ bin/kafka-server-start.sh config/server.properties
2.3 Redis配置
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
redis在linux环境下,安装十分简单,执行以下命令:
#更新所有依赖
$sudo apt-get update
#安装redis-server
$sudo apt-get install redis-server
三、模块设计
3.1 爬虫模块
netty原生仅支持http协议,若需支持https协议必须添加ssl证书。使用netty原生HttpRequest写爬虫服务不可行。因此,采用Apache Httpcomponents下的子模块Httpclient对网页进行抓取,使用jsoup对抓取的网页进行细致分析或利用正则表达式对网页进行简要的处理,例如获取文本信息。
由于大多数网站都设置了反爬机制,我们需要模拟浏览器的浏览行为进行抓取。因此,需要设置代理甚至设置cookies信息,代理和cookies信息可从浏览器中获得。