源码

nginx源码分析——模块

邮差的信 提交于 2019-12-22 15:50:07
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1. 模块介绍 高度模块化的设计是nginx的架构基础。在nginx中,除了少量的核心代码,其他一切皆为模块。这种模块化设计同时具有以下几个特点: 高度抽象的模块接口 所有的模块都遵循着同样的 ngx_module_t 接口设计规范,这减少了整个系统中的变数。 模块接口非常简单,具有很高的灵活性 模块的基本接口 ngx_module_t 足够简单,只涉及模块的初始化、退出以及对配置项的处理、这同时也带来了足够的灵活性,使得nginx比较简单地实现了动态可修改性。 配置模块的设计 ngx_module_t接口有一个type成员,它指明了nginx允许在设计模块时定义模块类型这个概念,允许专注于不同领域的模块按照类型来区别。而配置类型模块是唯一一种只有1个模块的模块类型。配置模块的类型叫做NGX_CONF_MODULE,它仅有的模块叫做ngx_conf_module。这是nginx最底层的模块,它指导着所有模块以配置项为核心来提供功能。因此,它是其他所有模块的基础。配置模块使nginx提供了高可配置性,高可扩展性,高可定制性,高可伸缩性。 核心模块接口的简单化 nginx中定义了一种基础类型的模块——核心模块。核心模块的存在简化了nginx的设计,使得非模块化的框架代码只关注于如何调用这些核心模块。 多层次

Mina2.0框架源码剖析(一)

陌路散爱 提交于 2019-12-22 10:07:30
整个框架最核心的几个包是: org.apache.mina.core.service, org.apache.mina.core.session, org.apache.mina.core.polling 以及 org.apache.mina.transport.socket 。 这一篇先来看 org.apache.mina.core.service 。第一个要说的接口是 IoService, 它是所有 IoAcceptor 和 IoConnector 的基接口 . 对于一个 IoService, 有哪些信息需要我们关注呢? 1 )底层的元数据信息 TransportMetadata ,比如底层的网络服务提供者( NIO,ARP,RXTX 等), 2 )通过这个服务创建一个新会话时,新会话的默认配置 IoSessionConfig 。 3 )此服务所管理的所有会话。 4 )与这个服务相关所产生的事件所对应的监听者( IoServiceListener )。 5 )处理这个服务所管理的所有连接的处理器 (IoHandler) 。 6 )每个会话都有一个过滤器链( IoFilterChain ),每个过滤器链通过其对应的 IoFilterChainBuilder 来负责构建。 7 )由于此服务管理了一系列会话,因此可以通过广播的方式向所有会话发送消息 , 返回结果是一个

Retrofit 源码解析:一款基于 OkHttp 的网络请求库

ぐ巨炮叔叔 提交于 2019-12-22 10:06:12
Retrofit 可以说和 OkHttp 是亲兄弟了,它们都是由 Square 公司推出的网络请求库,并且 Retrofit 实际上是基于 OkHttp 实现的,它在 OkHttp 现有功能的基础上进行了封装,支持通过注解进行网络请求参数的配置,同时对数据返回后的解析、序列化进行了统一的包装,甚至在近期引入了对协程对支持。 今天就让我们一起来看看 Retrofit 是如何在 OkHttp 这样一个已经固定的框架的基础上,优雅的进行封装并拓展功能的。 本篇源码解析基于 Retrofit v2.7.0 个人博客: https://blog.N0tExpectErr0r.cn 小专栏: https://xiaozhuanlan.com/N0tExpectErr0r 基本使用 我们首先来看看 Retrofit 的基本使用,来对它有个大致的了解。 首先,我们可以构建一个如下的请求 Service 类,它里面对各个请求的方法及参数通过注解进行了标注: public interface GitHubService { @GET ( "users/{user}/repos" ) Call < List < Repo > > listRepos ( @Path ( "user" ) String user ) ; } 之后,我们可以构建一个 Retrofit 对象,并通过 Retrofit

ActionResult源码分析笔记

雨燕双飞 提交于 2019-12-22 09:20:27
ActionResult是一个抽象类: public abstract class ActionResult { public abstract void ExecuteResult(ControllerContext context); } ActionResult的实现类都是通过操作Response对象,实现不同输出 ActionResult的实现类: JsonResult: 默认情况下禁止Get访问,所以Get请求需要加AllowGet参数   response.ContentType = "application/json"; JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); javaScriptSerializer.Serialize(Data) ContentResult: response.Write(Content); EmptyResult: 什么都不返回~ RedirectResult: context.HttpContext.Response.Redirect(url, false); NotFound: context.HttpContext.Response.StatusCode = 404; HttpStatusCodeResult:同上

android系统编译.so库

佐手、 提交于 2019-12-22 08:24:00
android系统编译so库 移植准备 移植目的 移植环境 ABI和API ABI API ABI和API区别 编译环境 NDK-build AOSP 参考文档 移植准备 这里主要是针对我自己最近遇到的项目问题,需要在android4.4系统上移植android9.0的webrtc语音处理算法,因而引入的内容。 移植目的 本文主要描述的就是如何将自己的代码编译成native库在android系统上运行(并不包括在android系统上使用自己的库),那么本质就是生成指定结构的二进制.so。要生成可用的二进制.so必不可少的就是需要了解到编译环境、目标机软硬件环境 移植环境 最终的目标.so动态库实质就是二进制机器码,要想获取最终的.so就需要针对源代码进行编译生成,这就牵涉到目标平台和宿主机的软硬件环境 宿主机(开发机器) 软件环境:编译器(根据目标平台架构决定)、系统(Windows、Linux)、C/C++库 硬件环境:机器架构(arm/arm64,x86/x86-64) 目标平台(.so运行平台) 软件平台:android系统版本(对应的API和ABI版本) 硬件平台:架构(ABI版本) ABI和API ABI application binary interface,应用程序二进制接口。不同的android设备对应不同的CPU,不同的CPU又对应不同的指令集

Mininet实验 源码安装Mininet

大兔子大兔子 提交于 2019-12-22 06:27:35
参考: MiniNet实验1 安装命令: sudo apt-get update sudo apt-get upgrade sudo apt-get install git(安装过git就可以忽略此步) git clone git://github.com/mininet/mininet cd mininet cat INSTALL(此步执行之后,出现信息,最后是Good Luck!) //此时在/home/wasdns/mininet目录 util/install.sh -a(-a选项默认安装在home目录,其他选项请参考:http://www.sdnlab.com/15138.html) 测试:sudo mn --test pingall 版本信息:mn --version 2016/9/10 来源: https://www.cnblogs.com/qq952693358/p/5860101.html

JDK7-HashMap源码解析

こ雲淡風輕ζ 提交于 2019-12-22 00:25:32
为了方便阅读和写注释,笔者将HashMap源码单独拷出来了,推荐大家也这么做,阅读起来更加轻松,Debug也很方便,更重要的是,你可以修改源码来测试。 继承关系图 阅读源码建议采用自上而下的结构,建议先看Map接口、然后AbstractMap抽象类、最后HashMap。 整体结构分层 Map接口 定义Map具备的功能,使用内部接口Entry来对单个映射关系进行封装,Entry是Map的基本组成单元。 AbstractMap 实现了Map接口的抽象类,实现了绝大多数方法,put和entrySet没有实现,因为这两个方法涉及到底层的实现逻辑和数据结构,必须交给子类去实现。 HashMap 继承自AbstractMap,实现了Map。 实现了自己的Entry,除了保存映射关系外,因为是基于哈希的,所以还记录了哈希值,因为采用的链表结构,所以用next记录了下一个节点的地址。 HashMap解析 笔者几乎给每个属性和方法都写上了注释,想要源码的朋友可以私信我。 各属性的含义 /** * 默认容量:1<<4 = 10000 = 16 * 必须是2的幂次方数 */ static final int DEFAULT_INITIAL_CAPACITY = 1 << 4 ; /** * 最大容量:1<<30 = 1000000000000000000000000000000 = 1073741824

gawk awk1.c源码分析

て烟熏妆下的殇ゞ 提交于 2019-12-21 23:43:24
gawk awk1.c源码分析 今天接着读代码。前段时间迷上读网络小说,用kindle看小说,看得天昏地暗。读小说锻炼了阅读速度。 星期五购买了几件打折的衣服。我要好好读代码,把购衣服的价值创造出来。 言归正传。我用一台旧的笔记本不上网,只用于在上面写代码。因为上面只有gawk的源码,没有拷coreutils的源码,所以就读gawk的了。 今天看的时候,感觉把这篇基本全部看懂了。个别细节也懂了。下面就说我的心得。 main()函数 对命令行选项进行处理 -d,-D进行调试相关 -R 设置记录分隔符 -F 设置字段分隔符 -f 后面的awk文件 先打开-f后面的文件 如果成功打开了文件 把文件内容读入到指针lexptr中。 把打开的文件关闭 如果lexptr值为空,也就是命令行中,没有-f选项,就直接从命令行中读awk指令 lexptr_begin=lexptr 再调用bison的程序进行编译,生成代码树 初始化字段变量 在awk指令中,查找BEGIN,END块。 如果有BEGIN块,就处理之 判断命令行中,是否有参数,如awk -f awkfile a=1 b=2 datafile中,a=1之类变量值。 如果命令行中没有数据文件,就设为从stdin中读 对命令行中的每个数据文件进行循环处理 如果文件名是“-”,就从标准输入读,否则打开相应文件 对文件的每行进行循环处理

memcached 源码阅读笔记

允我心安 提交于 2019-12-21 23:28:15
阅读 memcached 最好有 libevent 基础, memcached 是基于 libevent 构建起来的. 通由 libevent 提供的事件驱动机制触发 memcached 中的 IO 事件. 个人认为, 阅读源码的起初最忌钻牛角尖, 如头文件里天花乱坠的结构体到底有什么用. 源文件里稀里哗啦的函数是做什么的. 刚开始并没必要事无巨细弄清楚头文件每个类型定义的具体用途; 很可能那些是不紧要的工具函数, 知道他的功能和用法就没他事了. 来看 memcached 内部做了什么事情. memcached 是用 c 语言实现, 必须有一个入口函数 main() , memcached 的生命从这里开始. 初始化过程 建立并初始化 main_base, 即主线程的事件中心, 这是 libevent 里面的概念, 可以把它理解为事件分发中心. 建立并初始化 memcached 内部容器数据结构. 建立并初始化空闲连接结构体数组. 建立并初始化线程结构数组, 指定每个线程的入口函数是 worker_libevent() , 并创建工作线程. 从 worder_libevent() 的实现来看, 工作线程都会调用 event_base_loop() 进入自己的事件循环. 根据 memcached 配置, 开启以下两种服务模式中的一种: 以 UNIX 域套接字的方式接受客户的请求 以

Spring AOP 源码分析

元气小坏坏 提交于 2019-12-21 23:28:05
最近一个星期在研究 Spring AOP 源码,在此过程中发现几遍源码分析的文章很不错,推荐给需要的同学。 Spring AOP 源码解析 走马观花,看个大概的,推荐。 Spring 源码剖析(六)AOP实现原理剖析 在分析过程中列了执行时序图,思路清晰。推荐 Spring AOP 源码分析系列文章导读 Spring AOP 源码分析 - 筛选合适的通知器 Spring AOP 源码分析 - 创建代理对象 Spring AOP 源码分析 - 拦截器链的执行过程 最后四篇强烈推荐!!! 来源: CSDN 作者: pngyul 链接: https://blog.csdn.net/PNGYUL/article/details/103646446