使用netty作为http文件服务

代码 HttpFileServer package http; import echo.server.EchoServer; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelInitializer; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.http.*; import io.netty.handler.stream.ChunkedWriteHandler; /** * @author ggBall * @version 1.0.0 * @ClassName HttpFileServer.java * @Description TODO * @createTime 2022年02月08日 09:41:00 */ public class HttpFileServer { private static final String default_url = "/src/main/java/http/file/netty/"; public void run(final int port , final String url) throws InterruptedException { EventLoopGroup boss = new NioEventLoopGroup(); EventLoopGroup worker = new NioEventLoopGroup(); try { ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(boss,worker) .channel(NioServerSocketChannel.class) .childHandler(new ChannelInitializer<SocketChannel>() { /** * This method will be called once the {@link Channel} was registered. After the method returns this instance * will be removed from the {@link ChannelPipeline} of the {@link Channel}. * * @param ch the {@link Channel} which was registered. * @throws Exception is thrown if an error occurs. In that case the {@link Channel} will be closed. */ protected void initChannel(SocketChannel ch) throws Exception { ch.pipeline().addLast("http-decoder", new HttpRequestDecoder()); // 请求消息解码器 ch.pipeline().addLast("http-aggregator", new HttpObjectAggregator(65536));// 目的是将多个消息转换为单一的request或者response对象 ch.pipeline().addLast("http-encoder", new HttpResponseEncoder());//响应解码器 ch.pipeline().addLast("http-chunked", new ChunkedWriteHandler());//目的是支持异步大文件传输() ch.pipeline().addLast("fileServerHandler", new HttpFileServerHandler(url));// 业务逻辑 } }); ChannelFuture future = bootstrap.bind("127.0.0.1", port).sync(); System.out.println("http文件服务器,地址:http://127.0.0.1:" + port + url); future.channel().closeFuture().sync(); } finally { boss.shutdownGracefully(); worker.shutdownGracefully(); } } public static void main(String[] args) throws Exception { int port = 8080; if (args.length > 0) { try { port = Integer.parseInt(args[0]); } catch (NumberFormatException e) { e.printStackTrace(); } } String url = default_url; if (args.length > 1) url = args[1]; new HttpFileServer().run(port, url); } } HttpFileServerHandler ...

February 8, 2022 · 3 min

elasticsearch

第一部分:初识 Elasticsearch 第 1 章:概述 课程介绍 课程综述及学习建议 Elasticsearch 简介及其发展历史 Elastic Stack 家族成员及其应用场景 第 2 章:安装上手 Elasticsearch 的安装与简单配置 Kibana 的安装与界面快速浏览 在 Docker 容器中运行 Elasticsearch,Kibana 和 Cerebro Logstash 安装与导入数据 第 3 章:Elasticsearch 入门 基本概念(1):索引,文档和 REST API 基本概念(2):节点,集群,分片及副本 文档的基本 CRUD 与批量操作 倒排索引入门 通过分析器进行分词 Search API 概览 URI Search 详解 Request Body 与 Query DSL 简介 Query String & Simple Query String 查询 Dynamic Mapping 和常见字段类型 显式 Mapping 设置与常见参数介绍 多字段特性及 Mapping 中配置自定义 Analyzer Index Template 和 Dynamic Template Elasticsearch 聚合分析简介 第一部分总结 第二部分:深入了解 Elasticsearch 第 4 章:深入搜索 基于词项和基于全文的搜索 结构化搜索 搜索的相关性算分 Query & Filtering 与多字符串多字段查询 单字符串多字段查询:Dis Max Query 单字符串多字段查询:Multi Match 多语言及中文分词与检索 Space Jam,一次全文搜索的实例 使用 Search Template 和 Index Alias 查询 综合排序:Function Score Query 优化算分 Term & Phrase Suggester 自动补全与基于上下文的提示 配置跨集群搜索 第 5 章:分布式特性及分布式搜索的机制 集群分布式模型及选主与脑裂问题 分片与集群的故障转移 文档分布式存储 分片及其生命周期 剖析分布式查询及相关性算分 排序及 Doc Values & Fielddata 分页与遍历:From, Size, Search After & Scroll API 处理并发读写操作 第 6 章:深入聚合分析 Bucket & Metric 聚合分析及嵌套聚合 Pipeline 聚合分析 作用范围与排序 聚合分析的原理及精准度问题 第 7 章:数据建模 对象及 Nested 对象 文档的父子关系 Update By Query & Reindex API Ingest Pipeline & Painless Script Elasticsearch 数据建模实例 Elasticsearch 数据建模最佳实践 第二部分总结回顾 第三部分:管理 Elasticsearch 集群 第 8 章:保护你的数据 集群身份认证与用户鉴权 集群内部安全通信 集群与外部间的安全通信 第 9 章:水平扩展 Elasticsearch 集群 常见的集群部署方式 Hot & Warm 架构与 Shard Filtering 如何对集群进行容量规划 分片设计及管理 在私有云上管理 Elasticsearch 集群的一些方法 在公有云上管理与部署 Elasticsearch 集群 第 10 章:生产环境中的集群运维 生产环境常用配置与上线清单 监控 Elasticsearch 集群 诊断集群的潜在问题 解决集群 Yellow 与 Red 的问题 提升集群写性能 提升进群读性能 集群压力测试 段合并优化及注意事项 缓存及使用 Breaker 限制内存使用 一些运维的相关建议 第 11 章:索引生命周期管理 使用 Shrink 与 Rollover API 有效管理时间序列索引 索引全生命周期管理及工具介绍 第四部分:利用 ELK 做大数据分析 第 12 章:用 Logstash 和 Beats 构建数据管道 Logstash 入门及架构介绍 Beats 介绍 第 13 章:用 Kibana 进行数据可视化分析 使用 Index Pattern 配置数据 使用 Kibana Discover 探索数据 基本可视化组件介绍 构建 Dashboard 第 14 章:探索 X-Pack 套件 用 Monitoring 和 Alerting 监控 Elasticsearch 集群 用 APM 进行程序性能监控 用机器学习实现时序数据的异常检测(上) 用机器学习实现时序数据的异常检测(下) 用 ELK 进行日志管理 用 Canvas 做数据演示 第五部分:应用实战工作坊 实战 1:电影搜索服务 项目需求分析及架构设计 将音乐数据导入 Elasticsearch 搭建你的电影搜索服务 基于 Java 和 Elasticsearch 构建应用 实战 2:Stackoverflow 用户调查问卷分析 需求分析及架构设计 数据 Extract & Enrichment 构建 Insights Dashboard 备战:Elastic 认证 Elastic 认证介绍 考点梳理 集群的数据备份

January 18, 2022 · 3 min

git指令

我每天使用 Git ,但是很多命令记不住。 一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。 下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。 ...

January 18, 2022 · 5 min

io入门了解

Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员在开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要问题如下: ...

January 15, 2022 · 1 min

javaNIO了解

流与块 I/O 与 NIO 最重要的区别是数据打包和传输的方式,I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。 面向流的 I/O 一次处理一个字节数据: 一个输入流产生一个字节数据,一个输出流消费一个字节数据。为流式数据创建过滤器非常容易,链接几个过滤器,以便每个过滤器只负责复杂处理机制的一部分。不利的一面是,面向流的 I/O 通常相当慢。 面向块的 I/O 一次处理一个数据块,按块处理数据比按流处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性。 I/O 包和 NIO 已经很好地集成了,java.io.* 已经以 NIO 为基础重新实现了,所以现在它可以利用 NIO 的一些特性。例如,java.io.* 包中的一些类包含以块的形式读写数据的方法,这使得即使在面向流的系统中,处理速度也会更快。 ...

January 15, 2022 · 3 min
总访问量 总访客数