1.Java开发书籍推荐(200多本)
2.RocketMQ路由中心 NameServer
Java开发书籍推荐(200多本)
整理了一份关于Java开发的应用源电子书资源,共约本PDF版本,码剖分享给需要的应用源朋友们。 全部免费获取,码剖无需添加QQ,应用源无需关注公众号,码剖香烟溯源码图片直接使用百度网盘链接下载。应用源 请在下载后给予我一个赞,码剖顺便分享给还在寻找资源的应用源兄弟们。 以下目录展示了部分书单内容,码剖以供参考: Java - 天学通Java - Effective Java中文版(第2版) - Head First Java 中文高清版 - EXPERT.ONE.ON.ONE.J2EE.DEVELOPMENT.WITHOUT.EJB-中文 - Java 程序员进阶之路(亮白版) - Hibernate实战(第2版) - Java 8 实战 - Java8函数式编程 - Java8中的应用源炫酷特性和Java9中的新特性-杨晓峰 - JavaNIO(中文版) - JAVA优化编程 - Java加密与解密的艺术 梁栋 - Java基础与案例开发详解 - Java学习路线图:Java必须知道的个问题 - Java并发编程的艺术 - JVM - Java虚拟机基础教程 高清中文版PDF - Java虚拟机并发编程 - Java虚拟机规范(Java SE 8版)(带书签完整版) - 实战JAVA虚拟机 JVM故障诊断与性能优化 - 揭秘Java虚拟机-JVM设计原理与实现 - 深入理解Java虚拟机JVM高级特性与最佳实践第3版(周志朋) - 解析Java虚拟机器开发:权衡优化、高效和安全的码剖最优方案 Kubernetes - Kubernetes实战 ,吴龙辉 ,P - Kubernetes开源书 - Kubernetes指南(Kubernetes Handbook) - Kubernetes权威指南第2版 - Kubernetes经典实例 - 阿里云深入浅出Kubernetes项目实战手册 - 基于Kubernetes的容器云平台实战 Linux - linux常用命令大全 - Linux宝典 - Linux环境编程:从应用到内核 - LINUX防火墙(原书第3版) - Linux高级程序设计中文第三版杨宗德--人电出版社 - [Linux命令详解词典].施威铭研究室.扫描版 - 深入Linux内核架构 (图灵程序设计丛书·LinuxUNIX系列) - 鸟哥的LINUX私房菜_基础学习篇(第三版) - 鸟哥的LINUX私房菜:服务器架设篇 (第二版) MyBatis - MyBatis从入门到精通 - Spring+MVC+MyBatis企业应用实战 - MyBatis技术内幕 - 深入浅出MyBatis技术原理与实战 - Spring+MyBatis企业应用实战 Netty - Netty实战中文高清版 - Netty权威指南 第2版 带书签目录 完整版 - Netty进阶之路 跟着案例学Netty_完整版 Redis - Redis入门指南 第2版 - Redis实战 - Redis开发与运维-付磊 - Redis深度历险:核心原理和应用实践 - redis设计与实现 - 深入理解Redis Spring - Spring Security实战 - 陈木鑫 - Spring.2.0核心技术与最佳实践.廖雪峰.扫描版 - Spring从入门到精通 - Spring5高级编程 - Spring实战(第4版文字版) - Spring揭秘 - Spring源码深度解析 - spring高级程序设计 Spring Boot - Spring Boot 2+Thymeleaf企业应用实战 - Spring技术内幕:深入解析Spring架构与设计原理 - 精通spring - Mastering Spring - Spring Boot 2精髓(高清版) - Spring Boot企业级应用开发实战 - Spring Boot+Vue全栈开发实战 - Spring Boot开发实战 - SpringBoot揭秘+快速构建微服务体系 - 微服务实战:Dubbox+Spring Boot+Docker - 一步一步学Spring Boot 2微服务项目实战 - 微服务架构实战 基于Spring Boot Spring Cloud Docker - 微服务架构基础(Spring Boot+Spring Cloud+Docker) - 深入实践Spring Boot.陈韶健 Spring Cloud - Spring Cloud 微服务架构进阶 - Spring Cloud与Docker高并发微服务架构设计实施 - Spring Cloud与Docker微服务架构实战 - Spring Cloud微服务全栈技术与案例解析 - Spring Cloud微服务实战 - Spring Cloud微服务架构开发实战 - 疯狂Spring Cloud微服务架构实战 - 重新定义Spring Cloud实战 Zookeeper - Zookeeper 分布式过程 - 从Paxos到Zookeeper 分布式一致性原理与实践 其他 - tomcat内核设计剖析 - 大数据之路:阿里巴巴大数据实践 - Hadoop大数据分析与挖掘实战 - Git入门与实践完整版 - Hadoop权威指南(第2版) - 构建工具 - Maven实战 - 架构 - App后台开发运维和架构实践 - 亿级流量网站架构核心技术 - 数据结构和算法 - Docker全攻略 - Elasticsearch大数据搜索引擎 - Git版本控制管理第2版(美)罗力格 - Hadoop技术内幕 深入解析HADOOP COMMON和HDFS架构设计与实现原理 - Hadoop技术内幕+深入理解MapReduce架构设计与实现原理 - Hadoop技术内幕深入解析YARN架构设计与实现原理 - 大话数据结构 - 算法导论 - Git权威指南-目录完美-完整版 - 大话设计模式 - 设计模式 - 大厂笔试真题+答案 - 人件(高清中英文合并版) - 代码整洁之道 - 多处理器编程的艺术 - 程序开发心理学(银年纪念版) - 计算机程序设计艺术(第一卷)高清中文版 - 编程之美-完整版 - 计算机程序设计艺术(第三卷)高清中文版 - 计算机程序设计艺术(第二卷)高清中文版RocketMQ路由中心 NameServer
专栏:深入分布式开发 杨京京:深入分布式开发
RocketMQ路由中心 NameServer
NameServer是RocketMQ的“大脑”,主要负责RocketMQ的应用源路由管理、服务注册及服务发现的码剖socket发送方法源码机制。
NameServer是应用源简单的Topic路由注册中心,主要有两个功能:Broker管理:Broker启动时会将自己的注册消息提供给NameServer,包括Broker地址、Broker名字、Broker Id、topic配置信息等作为路由信息的基本数据,提供心跳检测机制检测Broker是否存活。每个NameServer保存Broker集群服务器的所有路由信息,提供给生产者和消费者获取路由信息,获取到路由信息就可以与Broker服务进行消息的投递和消费。路由信息管理:每个NameServer保存Broker集群服务器的所有路由信息,提供给生产者和消费者获取路由信息,获取到路由信息就可以与Broker服务进行消息的传奇霸业全套源码投递和消费。由于每个NameServer都保存着完整的路由信息,即使一台NameServer服务下线了,生产者和消费者也能从其他的NameServer服务器获取到完整Broker路由细信息。
消息中间件的设计思路一般基于主题的订阅发布机制,消息生产者(Producer)发送某一主题的消息到消息服务器,消息服务器负责该消息的持久化存储,消息消费者(Consumer)订阅感兴趣的主题,消息服务器根据订阅信息(路由信息)将消息推送到消费者(PUSH模式)或者消息消费者主动向消息服务器拉取消息(PULL模式),从而实现消息生产者与消息消费者解耦。为了避免消息服务器的单点故障导致的整个系统瘫痪,通常会部署多台消息服务器共同承担消息的存储。那消息生产者如何知道消息要发往哪台消息服务器呢?如果某一台消息服务器宕机了,那么生产者如何在不重启服务的app盗刷源码情况下感知呢?NameServer就是为了解决上述问题而设计的。
Broker消息服务器在启动时向所有NameServer注册,消息生产者(Producer)在发送消息之前先从NameServer获取Broker服务器地址列表,然后根据负载算法从列表中选择一台消息服务器进行消息发送。NameServer与每台Broker服务器保持长连接,并间隔s检测Broker是否存活,如果检测到Broker宕机,则从路由注册表中将其移除。但是路由变化不会马上通知消息生产者,为什么要这样设计呢?这是为了降低NameServer实现的复杂性,在消息发送端提供容错机制来保证消息发送的高可用性。
NameServer本身的高可用可通过部署多台NameServer服务器来实现,但彼此之间互不通信,也就是美工小程序源码NameServer服务器之间在某一时刻的数据并不会完全相同,但这对消息发送不会造成任何影响,这也是RocketMQ NameServer设计的一个亮点,RocketMQ NameServer设计追求简单高效。
了解完NameServer的架构,接下来结合源码的方式从下面几方面来详细剖析下NameServer:NameServer的启动过程分析
NameServer作为Broker管理和路由信息管理的服务器,首先需要启动才能为Broker提供注册topic的功能、提供心跳检测Broker是否存活的功能、为生产者和消费者提供获取路由消息的功能,NameServer服务器相关的源码在namesrv模块下,目录结构如下:
NameServer启动类:org.apache.rocketmq.namesrv.NamesrvStartup。NamesrvStartup类就是NameServer服务器启动的启动类。
NamesrvStartup类中有一个main启动类,main方法调用main0,main0主要流程代码(删除无关紧要或者不影响逻辑的代码,接下来所有有关源码的分析都只会分析主要流程,并且源码的分析采用从上到下,从宏观到微观的方法)如下:
main0方法的主要作用就是创建Name Server服务器的控制器,并且启动Name Server服务器的控制器。NamesrvController类的作用就是为Name Server服务的启动提供具体的逻辑实现,主要包括配置信息的加载、远程通信服务器的创建和加载、默认处理器的注册以及心跳检测机器监控Broker的健康状态等。Name Server服务器的控制器的创建方法为createNamesrvController方法,createNamesrvController方法的主要流程代码如下:
createNamesrvController方法主要做了几件事,读取和解析配置信息,包括Name Server服务的配置信息、Netty服务器的配置信息、打印读取或者解析的配置信息、保存配置信息到本地文件中,以及根据namesrvConfig配置和nettyServerConfig配置作为参数创建nameServer服务器的控制器。创建好Name server控制器以后,就可以启动它了。启动Name Server的方法的主流程如下:
start方法没什么逻辑,主要作用就是进行初始化工作,然后进行启动Name Server控制器,接下来看看进行了哪些初始化工作以及如何启动Name Server的,初始化initialize方法的主要流程如下:
initialize方法的主要逻辑如下:
上面就是initialize方法的主要逻辑,特别需要注意每秒扫描不活跃的broker的定时任务:
scanNotActiveBroker方法的逻辑主要是遍历缓存在brokerLiveTable的Broker,将Broker最后更新时间加上秒的结果是否小于当前时间,如果小于当前时间,说明Broker已经过期,可能是已经下线了,所以可以清除Broker信息,并且关闭Name Server服务器与Broker服务器连接,这样被清除的Broker就不会与Name Server服务器进行远程通信了。brokerLiveTable的结果如下:
brokerLiveTable缓存着以brokerAddr为key(Broker地址),以BrokerLiveInfo为value的结果,BrokerLiveInfo是Broker存活对象,主要有如下几个属性:
从BrokerLiveInfo中删除了过期的Broker后,还需要做清理Name Server服务器与Broker服务器的连接,onChannelDestroy方法主要是清理缓存在如下map的信息:
在扫描过期的broker时,首先找到不活跃的broker,然后onChannelDestroy方法清理与该不活跃broker有关的缓存,清理的主要流程如下:
初始化nameserver服务器以后,接下来就可以启动nameserver服务器:
start方法做了两件事,第一件就是启动netty服务器,netty服务器主要负责与Broker、生产者与消费者之间的通信,处理Broker、生产者与消费者的不同请求。根据nettyConfig配置,设置启动的配置和各种处理器,然后采用netty服务器启动的模板启动服务器,具体的代码就不分析了,有兴趣的可以看看netty启动代码模板是怎么样的。第二件事就是启动文件监听线程,监听tts相关文件是否发生变化。
Name Server服务器启动流程的源代码分析到此为止了,在这里总结下Name Server服务器启动流程主要做了什么事: