github+travis-ci持续部署hexo博客
引言目前我的博客源码是在coding上的,因为有很方便的持续部署,但是coding目前还不提供push文件的开放API。因为最近做了一个一键分发平台,将博客分发到简书、CSDN等等的平台,但是我的博客主站需要用git提交,我想将博客主站也通过一键分发平台提交,而且github提供push文件的开放API,所以计划将博客源码放到github上,网上发现travis-ci支持私有仓库的持续部署,所以就尝试了一下。
步骤1、登录travis-ci.comhttps://travis-ci.com/新版是.com域名,貌似以前是不支持github私有仓库的,现在很便利啊,因为我的博客是通过hexo d推送的,包含项目的用户名密码,hexo配置文件中也有各种密码,不方便公开。
2、进入主页使用github登录就好,之后进入主页。
3、选择项目因为我添加过项目了,所以是这个样子,点击左侧的+号,进入选择项目页面。
4、设置只要简单的勾选我标注的就好,如果有特殊的要求,可以自己看一下文档。
5、新增配置文件回到github博客源码项目根目录,新增.travis.yml配置文件,我的内容如下:
12 ...
一键分发平台1.0.0
简介文章多渠道一键发送,目前支持简书、CSDN、博客园、思否、掘金、开源中国。
最开始在网上找这种平台,确实有几个,但是都需要将自己的Cookies暴露出去,太过于危险;也有开源的平台,自己搭建,但是想着自己作为一个爱折腾的程序员,这点东西还是可以做出来的。所以就有了这个平台,从最初的项目开始的10月27号,到现在11月30号,下班回来没事搞搞,也终于使用《一键分发平台》发出了第一篇文章,在此记录一下。
前端使用了d2-admin架子。后端使用Golang,自己设计架构。
页面功能写这个模块最主要的还是为了记录一下,看一看和以后比较会变成什么样子。
登录与注册这两个页面是朋友帮忙做的,拿来练手的。本来是不想要注册登陆的,但是因为后端正好有独立的鉴权服务(以前做其他项目时抽出来的模块,一直在运行着),我就对接了一下。
首页目前啥都没有,以后考虑加上数据分析图表,比如什么时候发布文章,都发布到哪了等。
授权页目前支持简书、CSDN、博客园、思否、掘金、开源中国,等后期会增加一些其他平台。
写文章markdown写文章,展示效果不好,后期我会引入一下主题CSS,这样写起来舒服一点。
选渠道 ...
深入了解Netty【八】TCP拆包、粘包和解决方案
1、TCP协议传输过程TCP协议是面向流的协议,是流式的,没有业务上的分段,只会根据当前套接字缓冲区的情况进行拆包或者粘包:
发送端的字节流都会先传入缓冲区,再通过网络传入到接收端的缓冲区中,最终由接收端获取。
2、TCP粘包和拆包概念因为TCP会根据缓冲区的实际情况进行包的划分,在业务上认为,有的包被拆分成多个包进行发送,也可能多个晓小的包封装成一个大的包发送,这就是TCP的粘包或者拆包。
3、TCP粘包和拆包图解
假设客户端分别发送了两个数据包D1和D2给服务端,由于服务端一次读取到字节数是不确定的,故可能存在以下几种情况:
服务端分两次读取到两个独立的数据包,分别是D1和D2,没有粘包和拆包。
服务端一次接收到了两个数据包,D1和D2粘在一起,发生粘包。
服务端分两次读取到数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,发生拆包。
服务端分两次读取到数据包,第一次读取到部分D1包,第二次读取到剩余的D1包和全部的D2包。
当TCP缓存再小一点的话,会把D1和D2分别拆成多个包发送。
4、TCP粘包和拆包解决策略因为TCP只负责数据发送,并 ...
深入了解Netty【七】Netty核心组件
1、Bootstrap与ServerBootstrapbootstrap用于引导Netty的启动,Bootstrap是客户端的引导类,ServerBootstrap是服务端引导类。类继承关系:
2、Future与ChannelFutureNetty中的操作都是异步的,等待完成或者注册监听。如:
12//b为ServerBootstrap实例 ChannelFuture f = b.bind().sync();
3、Channel
Netty网络通信的组件,用于网络IO操作。
通过Channel可以获得当前王略连接的通道的状态与网络配置参数。
Channel提供异步的网络IO操作,调用后立即返回ChannelFuture,通过注册监听,或者同步等待,最终获取结果。
Channel根据不同的协议、不同的阻塞类型,分为不同的Channel类型:
通过名称也能大概猜出来其分别的作用。
4、SelectorNetty基于java.nio.channels.Selector对象实现IO多路复用,通过Selector一个线程可以监听多个连接的Channel事件。当向一个Selector中注册Cha ...
深入了解Netty【六】Netty工作原理
引言前面学习了NIO与零拷贝、IO多路复用模型、Reactor主从模型。服务器基于IO模型管理连接,获取输入数据,又基于线程模型,处理请求。下面来学习Netty的具体应用。
1、Netty线程模型Netty线程模型是建立在Reactor主从模式的基础上,主从 Rreactor 多线程模型:
但是在Netty中,bossGroup相当于mainReactor,workerGroup相当于SubReactor与Worker线程池的合体。如:
12345EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();ServerBootstrap server = new ServerBootstrap();server.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class);
bossGroupbossGroup线程池负责监听端口,获取一个线程作为Mai ...
深入了解Netty【五】线程模型
引言不同的线程模型对程序的性能有很大的影响,Netty是建立在Reactor模型的基础上,要搞清Netty的线程模型,需要了解一目前常见线程模型的一些概念。具体是进程还是线程,是和平台或者编程语言相关,本文为了描述方便,以线程描述。目前存在的线程模型有:
传统阻塞IO服务模型
Reactor模型
Proactor模型
1、传统阻塞IO服务模型
采用阻塞IO模型获取输入的数据。 每个连接需要独立的完成数据的输入,业务的处理,数据返回。当并发数大的时候,会创建大量的线程,占用系统资源,如果连接创建后,当前线程没有数据可读,会阻塞,造成线程资源浪费。
2、Reactor模型IO多路复用 + 线程池 = Reactor模型
根据Reactor的数量和处理线程的数量,Reactor模型分为三类:
单Reactor单线程
单Reactor多线程
主从Reactor多线程
下面分别描述。
2.1、单Reactor单线程图中:
Reactor中的select模块就是IO多路复用模型中的选择器,可以通过一个阻塞对象监听多路连接请求。
Reactor对象通过Select监控客户端请求事 ...
深入了解Netty【四】IO模型
引言IO模型就是操作数据输入输出的方式,在Linux系统中有5大IO模型:阻塞式IO模型、非阻塞式IO模型、IO复用模型、信号驱动式IO模型、异步IO模型。因为学习Netty必不可少的要了解IO多路复用模型,本篇是基础。
名词概念
阻塞:指向调用方,在调用结果返回之前,调用方线程会挂起,直到结果返回。
非阻塞:指向调用方,在调用结果返回之前,调用方线程会处理其他事情,不会阻塞。
同步:指向被调用方,被调用方得到结果后再返回给调用方。
异步:指向被调用方,被调用方先应答调用方,然后计算结果,最终通知并返回给调用方。
recvfrom函数:系统调用,经socket接收数据。
5中IO模型1、阻塞式IO模型(blocking I/O)进程调用recvfrom函数,在数据没有返回之前,进程阻塞,直到数据返回后,才会处理数据。
2、非阻塞式IO模型(non-blocking I/O)进程调用recvfrom函数,如果数据没有准备好就返回错误提示,之后进程循环调用recvfrom函数,直到有数据返回。
3、IO复用模型(I/O multiplexing)进程调用se ...
深入了解Netty【三】Netty概述
1、简介
Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。Netty是一个NIO客户端服务器框架,它支持快速、简单地开发协议服务器和客户端等网络应用程序。它大大简化了网络编程,如TCP和UDP套接字服务器。“快速而简单”并不意味着最终的应用程序将遭遇可维护性或性能问题。Netty经过精心设计,积累了许多协议(如FTP、SMTP、HTTP和各种二进制和基于文本的遗留协议)实现的经验。因此,Netty成功地找到了一种方法,可以在不妥协的情况下实现开发、性能、稳定性和灵活性。Netty官网
2、应用场景
互联网行业主要用于分布式系统中的RPC,如阿里的Dubbo。
游戏行业比如地图服务器之间用Netty进行高性能通信。
大数据领域Hadoop的Netty Service。
开源项目https://netty.io/wiki/related-projects.html
深入了解Netty【二】零拷贝
引言以下翻译自:Zero Copy I: User-Mode Perspective
零拷贝是什么?
为了更好地理解问题的解决方案,我们首先需要理解问题本身。让我们来看看什么是参与网络服务器的简单过程dæmon服务数据存储在一个文件通过网络客户端。下面是一些示例代码:
12read(file, tmp_buf, len);write(socket, tmp_buf, len);
看起来很简单;您会认为只有这两个系统调用不会带来太多开销。事实上,这与事实相去甚远。在这两个调用之后,数据至少复制了四次,并且几乎执行了相同数量的用户/内核上下文切换。(实际上这个过程要复杂得多,但我想让它保持简单)。为了更好地了解所涉及的流程,请看图1。顶部显示上下文切换,底部显示复制操作。
图1。复制两个示例系统调用
第一步:read系统调用导致上下文从用户模式切换到内核模式。第一个副本由DMA引擎执行,它从磁盘读取文件内容并将其存储到内核地址空间缓冲区中。
第二步:将数据从内核缓冲区复制到用户缓冲区,read系统调用返回。调用的返回导致上下文从内核切换回用户模式。现在数据存储在用户地址空间缓 ...
深入了解Netty【一】BIO、NIO、AIO简单介绍
在Java中提供了三种IO模型:BIO、NIO、AIO,模型的选择决定了程序通信的性能。
1.1、使用场景
BIOBIO适用于连接数比较小的应用,这种IO模型对服务器资源要求比较高。
NIONIO适用于连接数目多、连接时间短的应用,比如聊天、弹幕、服务器间通讯等应用。
AIOAIO适用于连接数目多、连接时间长的应用,比如相册服务器。
1.2、BIO同步并阻塞模型,服务器会为每一个连接建立一个线程,如果连接过多,且线程不做任何事情,会极大的浪费资源,示意图如下:
1.2.1、机制流程:
服务器端启动ServerSocket。
客户端启动Socket对服务器进行通信,服务器会为每个客户端建立一个线程与之通信。
客户端发送请求,先咨询服务器是否有线程响应,如果没有则会等待,或者被拒绝。
如果有响应,客户端线程会等待请求结束后,再继续执行。
1.2.2、问题
服务端对于每个请求都要建立独立的线程。
并发数大时,要创建大量的线程,系统资源占用大。
连接建立之后,如果当前线程暂时没有数据可读,则线程就阻塞再Read上,造成线程资源浪费。
1.3、NIO同步非阻塞模型,服务器端用一个线程处理 ...