2.1k 2 分钟

# 前言 本文通过 web 应用展示主机如何与 wen 容器之间通信,为后续讲解网络提供基础。 # web 的运行与访问 # 运行 找到一个 webapp 镜像即可。 docker pull training/webapp下载完成后查看 docker images | grep webapp 我们需要跑一下这个 webapp 里面的 app.py 文件,其实就是 hello world 启动 webapp docker run -d -P training/webapp python app.py -d :让容器在后台运行 -P...
1.3k 1 分钟

# 构建镜像 有些冷门的软件不在远程仓库里,此时就需要手动安装。我们以 Ubuntu 的 base 镜像中安装 Java 环境,并将其打包成新的镜像(这个新的镜像就是一个包含 Java 环境的 Ubuntu 系统镜像)。 拉取启动 Ubuntu: docker pull ubuntudocker run -it ubuntu更新 apt(因为只有 base 镜像) apt update 这一步我之前换不换源都会出错,反正就是更新失败,后来折腾了两三天,都没什么效果。最后把 wifi 换成热点就更新成功了。所以你如果更新失败,可以试着检查一下网络问题。 也不用怀疑版本问题,本人用 Ubuntu...
2.3k 2 分钟

# hello-world 要使用那些容器,首先需要拉取镜像到本地仓库,然后再运行 # 拉取 hello-worlddocker pull hello-world:latest# 查看本地仓库的镜像docker images# 在容器中运行 hello-world 实例docker run (--name=XXX) hello-world 拉取指定版本的镜像: docker pull 名称:版本 ,默认是最新版本。run 命令 hi 自动给容器分配名称,也可以使用唯一名称指定。 如果没有调整 docker 的镜像源,那么 docker 就是从 Docker Hub...
3.1k 3 分钟

# 虚拟化技术 Virtualization 是一种资源管理技术,将计算机各种实体资源(服务器,内存,网络)予以抽象,打破实体结构间不可切割的障碍,使用户可以更好的方式利用资源。从而实现在同一主机上运行多个系统或应用。 软件虚拟化技术是利用软件技术,在现有的物理平台上实现对物理平台访问的截获和模拟。有些软件虚拟化技术需要依赖硬件支持,比如:VMware,KVM。 Docker 就是软件虚拟化,软件虚拟化分为好几类,Docker...
2.3k 2 分钟

# 简介 用 MapReduce 实现 wordCount(单词计数) 软件 2004-20207127 云计算作业 # 相关类 # WordCountMapper package org.example;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.LongWritable;import org.apache.hadoop.io.Text;import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class...
5.5k 5 分钟

# 通信协议设计 在 TCP 网络编程中,发送方和接收方的数据包格式都是二进制,发送方将对象转化成二进制流发送给接收方,接收方获得二进制数据后需要知道如何解析成对象。 一个完备的网络协议需要具备以下基本要素 # 魔数 作用是防止任何人随便向服务器端口发送数据。服务端在接收到数据时会解析出前几个固定字节的魔数做对比,如果和约定的魔数不匹配,就会认为是非法数据。 魔数的思想在压缩算法,Java Class 文件就有魔数 0XCAFFBABE ,调侃为咖啡宝贝,在加载 Class 文件时就会首先验证魔数的正确性。 #...
4.9k 4 分钟

# 简介 编解码器分为两部分,解码器负责入站(可以理解为将字节流转为原来的格式);编码器负责出站。 解码器负责入站操作,需要实现 ChannelInboundHandler 接口,解码器本质上也是 ChannelInboundHandler 。 编码器负责出站操作,需要实现 ChannelOutboundhandler 接口,编码器本质上也是 ChannelOutboundHandler 。 # 解码器 Netty 提供了一些常用的解码器,他们都继承了 ByteToMessageDecoder 类 : RedisDecoder 基于 Redis 协议的解码器。 XmlDecoder 基于...
6k 5 分钟

# EventLoop 我们在上一章节的例子中,首先创建 bossGroup 和 workerGroup 两个 EventLoopGroup : // 因为博客显示问题,我这里写成两行EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();我们之前也提到,这两个类似于主从 Reactor。之前在编写 NIO 代码时,就是用了 while 循环,不断使用 selector 监听新的事件,EventLoop 也是这种思想,本质是事件等待 /...
8k 7 分钟

# Netty 基础代码 我们先来看一下 Netty 搭建服务端和客户端一个简单的例子 服务端: public static void main(String[] args) { // 使用 NioEventLoopGroup 实现类,创建 BossGroup 和 WorkerGroup /** 其他的还有 EpollEventLoopGroup,但是仅支持 Linux,这是 Netty 基于 Linux 底层 Epoll 单独编写的一套本地实现,没有使用 NIO 那套 */ EventLoopGroup bossGroup = new...
4.6k 4 分钟

# NIO 存在的问题 之前我们写的代码,当客户端断开连接时(客户端运行结束),就会报错 当我们的客户端主动与服务端断开连接时,会导致 READ 事件一直被触发,也就是说 selector.select() 会直接通过,并且是可读的状态,但是我们发现实际上读到是数据是一个空的(上面的图中在空轮询两次后抛出异常了,也有可能是无限的循环下去)所以这里我们得稍微处理一下: } else if(key.isReadable()) { SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer...