源码

neutron api源码分析

南楼画角 提交于 2020-03-07 10:14:03
neutron server的启动setup.cfg内定义neutron-server = neutron.cmd.eventlet.server:main。这里只专注介绍neutron server启动,setup.cfg不在这里详细介绍 # setup.cfg console_scripts = .... neutron-ovs-cleanup = neutron.cmd.ovs_cleanup:main neutron-pd-notify = neutron.cmd.pd_notify:main neutron-server = neutron.cmd.eventlet.server:main main函数主要是运行wsgi_eventlet.eventlet_wsgi_server函数,并进行配置文件和日志的初始化配置 #neutron.cmd.eventlet.server:main from neutron import server from neutron.server import rpc_eventlet from neutron.server import wsgi_eventlet def main(): server.boot_server(wsgi_eventlet.eventlet_wsgi_server) #boot_server函数,为初始化配置

spring源码学习之AOP(一)

谁说胖子不能爱 提交于 2020-03-07 08:20:18
  继续源码学习,看了spring中基础的容器和AOP感觉自己也没有什么长进,哈哈,我也不知道到底有用没有,这可能是培养自己的一种精神吧,不管那么多,继续学习!AOP中 AOP中几个重要的概念: (1)Advice--通知 Advice定义在连接点做什么,为切面增强提供织入接口。在spring中,他主要描述spring AOP围绕方法调用而注入的切面行为。在spring AOP的实现中,使用了AOP联盟定义的统一接口--Advice接口并通过这个接口,为AOP切面的增强的织入功能做了更多的细话和扩展 (2)PonitCut--切点 PonitCut(切点)决定Advice通知应该作用于哪个连接点,也就是说通过PonitCut来定义需要增强的方法的集合。这些集合的选取可以按照一定的规则来完成。这种情况下,PonitCut通常意味着标识方法,例如,这些需要增强的地方可以由某个正则表达式进行标识,或根据某个方法名进行匹配 (3)Advisor--通知器 完成对目标方法的切面增强设计(Advice)和关注点的设计(PointCut)以后,需要一个对象把它们结合起来,完成这个作用的就是Advisor,通过Advisor,可以定义在应该使用哪个通知并在哪个关注点使用它,也就是说通过Advisor,把Advice和PointCut结合起来,这个结合为使用IoC容器配置AOP应用

KClient——kafka消息中间件源码解读

核能气质少年 提交于 2020-03-07 06:40:13
目录 kclient消息中间件 kclient-processor top.ninwoo.kclient.app.KClientApplication top.ninwoo.kclient.app.KClientController top.ninwoo.kclient.app.handler.AnimalsHandler top.ninwoo.kclient.app.domain 总结 kclient-core top.ninwoo.kafka.kclient.boot.KClientBoot createObjectHandler createObjectsHandler createDocumentHandler createBeanHandler createBeansHandler invokeHandler 生产者和消费者创建方法 小结 top.ninwoo.kafka.kclient.boot.KafkaHandlerMeta top.ninwoo.kafka.kclient.core.KafkaProducer top.ninwoo.kafka.kclient.core.KafkaConsumer init() initAsyncThreadPool() initKafka startup() AbstractMessageTask

Laravel源码分析之Contracts契约

不打扰是莪最后的温柔 提交于 2020-03-07 02:53:18
何为契约?契约其实就是面向接口编程,一个类不依赖于具体实现类,而是依赖于其接口。 首先看Laravel源中有一个Contracts目录,该目录下所有文件除了异常定义以外,其余均是接口定义。 通过定义好接口,具体实现类则可以依赖于接口,只要实现了接口的类都可以成为被依赖对象。 举个例子: 比如需要对内容进行缓存,可以使用文件缓存丶Redis缓存等。 先看不使用接口的代码有什么问题。 <?php /** * 文件缓存 */ class FileCache { public function cache ( $val ) { echo 'Using File Cache: ' . $val ; } } /** * Redis缓存 */ class RedisCache { public function cache ( $val ) { echo 'Using Redis Cache: ' . $val ; } } class Article { protected $cache ; public function __construct ( FileCache $cache ) { $this - > cache = $cache ; } public function getArticles ( ) { $content = 'Hello World!' ; $this - >

Vue源码分析之数据绑定Dep与Watcher的关系

安稳与你 提交于 2020-03-07 02:25:20
数据绑定 数据绑定 一旦更新了data中的某个属性数据,所有界面上直接(this.xxx='aaa')或间接(计算属性或方法)使用了此属性的节点都会更新 数据劫持 数据劫持是vue中用来实现数据绑定的一种技术 基本思想:通过defineProperty()来监视data中所有属性(任意层次)数据的变化,一旦变更就去更新界面 Dep与Watcher的关系 Dep何时创建?—— 初始化时给data的属性进行数据劫持时创建的 有几个?—— 与data中的属性一一对应 结构是什么?—— id:标识,subs:[]相关的n个watcher容器 Watcher何时创建?—— 初始化时解析大括号表达式/一般指令时创建 有几个?—— 与模板表达式(不包含事件指令)一一对应 结构是什么? this.cb = cb // 用于更新界面的回调 this.vm = vm // vm this.exp = exp // 对应的表达式 this.depIds = {} // 相关的n个dep容器对象 this.value = this.get() // 当前表达式对应的value 当执行vm.name='abc'表达式时,data中的name属性值变化会触发set方法,set中通知dep,dep通知所有watcher更新 Dep与Watcher之间是多对多的关系 一个data属性对应一个Dep

mqtt协议-broker之moqutte源码研究六之集群

旧街凉风 提交于 2020-03-07 02:10:36
moquette的集群功能是通过Hazelcast来实现的,对Hazelcast不了解的同学可以自行Google以下。 在讲解moquette的集群功能之前需要讲解一下moquette的拦截器,因为moquette对Hazelcast的集成本身就是通过拦截器来实现的。 一。拦截器 io.moquette.spi.impl.ProtocolProcessor类里面有一个BrokerInterceptor类,这个类就是broker拦截器,这个对象,在processConnect,processPubAck,processPubComp,processDisconnect,processConnectionLost,processUnsubscribe,processSubscribe,processPublish等八个地方都用到了,说明在broker处理各个报文的关键期间都会用到,我们先看一这个类的结构 private static final Logger LOG = LoggerFactory.getLogger(BrokerInterceptor.class); private final Map<Class<?>, List<InterceptHandler>> handlers; private final ExecutorService executor; private

mqtt协议-broker之moqutte源码研究三之SUBSCRIBE报文处理

感情迁移 提交于 2020-03-07 02:10:03
这一篇开始讲解moqutte对SUBSCRIBE报文的处理 代码不复杂 public void processSubscribe(Channel channel, MqttSubscribeMessage msg) { String clientID = NettyUtils.clientID(channel);//从channel里面获取clientId,具体原理看下文 int messageID = messageId(msg); LOG.info("Processing SUBSCRIBE message. CId={}, messageId={}", clientID, messageID); RunningSubscription executionKey = new RunningSubscription(clientID, messageID); SubscriptionState currentStatus = subscriptionInCourse.putIfAbsent(executionKey, SubscriptionState.VERIFIED); if (currentStatus != null) { LOG.warn("Client sent another SUBSCRIBE message while this one was being

mqtt协议-broker之moqutte源码研究一

感情迁移 提交于 2020-03-07 01:53:19
mqtt协议的broker有很多,但是java的支持集群的并不多,之前调研过一番,发现moqutte基本满足需求,就想着基于这个在自己做二次开发。后面会逐渐把自己对moqutte的研究发布出来,希望能给有相同需求的同学一定的参考意义。 github地址: https://github.com/andsel/moquette 一。将代码倒入idea 找到启动类 启动报错,是因为找不到moquette的配置文件 跟踪源码moquette的配置文件地址是config/moquette.conf 因为咱们是直接启动的Server类里面的main方法,而不是通过assebely打包的jar包,所有这个位置是没有配置文件的,但是moquette支持通过启动参数指定配置文件的位置 那就简单了,把启动需要的配置文件放到本地的某个地方,再通过启动参数指定就行了,在idea里面指定 我是放在/data/moquette目录下 另外idea启动需要的配置文件再,broker模块下的config包里面,或者distribution/src/main/resources 加入之后启动成功 二。配置文件讲解 moqutte的配置文件有五个,下面分别讲解一个有什么作用 1.moquette.conf 主配置文件,moquette启动需要的主要配置都在这里,包括端口号,认证鉴权,存储等

Qt开发MQTT(二) 之第三方QMQTT

若如初见. 提交于 2020-03-07 00:02:59
概述 上一篇文章 已经介绍了Qt官方提供的MQTT封装的使用方式,除此之外,还有另外一个第三方的公司也提供了针对MQTT的Qt封装接口,其使用方式都差不多,只是接口名称有些变化,这里也简单的介绍一下,可以根据个人喜好来选择使用那种方式。 官网地址: https://www.emqx.io/cn/ 下载编译 EMQ也提供了源码供大家下载使用, 地址在这里 我们将源码下载后进行编译,编译过程和上一篇文章介绍的差不多,这里就不再详细讲了。 我们使用Release模式编译后,同样也会得到和之前一样的生成文件: 根据 前一篇文章 的步骤我们将生成库部署到Qt的安装目录。 注意:这两种对MQTT的封装的源码编译生成出来的库名称是一样的,但是提供的接口不一样,所以如果编译了这两种源码,不要全部都部署到Qt安装目录,会覆盖的。如果编译了两份源码并且都想尝试使用, 那么可以将一个部署到Qt安装目录,另一个直接用外部库的方式导入到测试测试项目中进行使用,这两种方法都已经在前一篇文章中详细介绍过了。 接口 EMQ提供的这个MQTT的封装就不像Qt官方提供的那样完善了,我目前找到的也就只有github上的简短介绍,但其实我们有了源码,要去看相应的接口还是挺方便的。在源码里面对每个接口介绍挺详细的。 那么它提供的主要接口有以下这些: 槽 void setHost ( const QHostAddress &

SpringMVC源码之DispatcherServlet

只愿长相守 提交于 2020-03-06 23:54:04
DispatcherServlet是SpringMVC的核心类,所有其他的组件如拦截器,适配器,视图解析器等都是在这个servlet中应用,所以明白DispatcherServlet的初始化流程以及执行请求的流程就很重了。基于自己看的源码和自己的理解,写一个关于SpringMVC的小系列,如有错误,望各位看官不吝赐教! 1.DispatcherServlet 的继承体系如下: 1.1 GenericServlet 实现了Servlet,ServletConfig 接口,它对ServletConfig里的所有方法提供了实现,在 nit(ServletConfig config)中调用了自定义的init()方法,这个方法便是整个初始化的开始 1.2 HttpServlet.这个类虽说继承自GenericServlet,但却没有实现任何接口方法,但实现了直接父类中的service方法,实现了如doGet,doPost等一系列可能用的请求类型,service方法负责分派具体的请求,我想这也是为什么叫Dispatcher的原因。 1.3 HttpServletBean 这个类实现了GenericServlet中的init()并将改方法定义为final,在方法内部调用了 initServletBean() 1.4 FrameworkServlet 实现里initServletBean()