Netty

这份书单,想要晋级高级Java工程师的朋友值得一看!

自作多情 提交于 2020-08-16 03:57:45
点击蓝色“程序员书单”关注我哟 加个“星标”,每天带你读好书! ​ 经过了10多年的发展,Java Web从开发框架到社区都已经非常成熟,很多程序员都可以通过使用框架很快速地搭建起一个Java Web应用,特别是近几年SpringBoot大热,干脆连配置都不需要了解了,直接一键式编译部署运行,让Java工程师的入门成本变得越来越低。 但于此同时,互联网公司对于Java的应用场景也在不断地升级换代,从单机部署再到分布式,从SOA再到微服务,Java后端技术栈变得更加庞大,对于工程师的要求也越来越高,特别是对于大公司来说更是如此,也正因为如此,对Java工程师的考察已经不限于Java Web的那套东西了,企业往往会提出更高的要求,比如需要你能够熟练使用设计模式,了解Java并发编程和JVM调优,甚至是了解分布式技术、微服务以及中间件等等。 今天的这份书单并不针对某一种技术,而是想介绍一些一些Java进阶方面的书籍,其中包括Java的一些编码规范,代码最佳实践,以及调优指南,另外还介绍了一些Java编程的黑科技,比如Java异步编程,相信这些书籍对你的Java进阶学习会有所帮助。 Java进阶系列书单 ​ 阿里巴巴Java开发手册 《阿里巴巴Java开发手册》的愿景是码出高效,码出质量。它结合作者的开发经验和架构历程,提炼阿里巴巴集团技术团队的集体编程经验和软件设计智慧

设计模式:如何优雅地使用责任链模式

和自甴很熟 提交于 2020-08-15 15:11:18
责任链模式(Chain of Responsibility Pattern)在《Head First设计模式》一书中被称为“剩下的模式”,其实使用也是蛮多的。最近在学习Netty的过程中用到了责任链模式,在此反过头来重温一下责任链模式。 当你想要让一个以上的对象有机会能够处理某个请求的时候,就使用责任链模式。 一、场景 借用《Head First设计模式》书中的典型场景:需要处理四种类型的电子邮件,第一种类型是粉丝寄来的信,表示他们喜欢新推出的游戏;第二种类型是父母寄来的信,他们抱怨孩子总是沉迷游戏而忘记做作业;第三种类型是店家希望在其他地方也摆放糖果机;第四种类型是垃圾邮件。现在已经可以根据邮件内容确定收到的邮件属于哪种类型,需要设计一个程序来处理这些邮件。 Talk is cheap. Show me the code.直接用代码来说话吧。 用枚举来定义四种类型的邮件: public enum EmailEnum { SPAM_EMAIL(1, "Spam_Email"), FAN_EMAIL(2, "Fan_Email"), COMPLAINT_EMAIL(3, "Complaint_Email"), NEW_LOC_EMAIL(4, "New_Loc_Email"); private Integer code; private String desc; EmailEnum

最强Dubbo面试题,附带超级详细答案

送分小仙女□ 提交于 2020-08-15 07:29:05
最强面试题推荐: 2020Java面试题及答案,命中率高达90% 1.Dubbo是什么? Dubbo 是一个分布式、高性能、透明化的 RPC 服务框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成。 RPC 指的是远程调用协议,也就是说两个服务器交互数据。 2.Dubbo的由来? 互联网的快速发展,Web应用程序的规模不断扩大,一般会经历如下四个发展阶段。 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起即可。 垂直应用架构 当访问量逐渐增大,单一应用按照有业务线拆成多个应用,以提升效率。 此时,用于加速前端页面开发的 Web框架(MVC) 是关键。 分布式服务架构 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。 此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。 流动计算架构 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。 此时,用于提高机器利用率的 资源调度和治理中心(SOA) 是关键。 3.Dubbo的主要应用场景? 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 软负载均衡及容错机制

REST和RPC简介和区别

血红的双手。 提交于 2020-08-15 06:26:54
参考文章: REST和RPC是什么东东?两者有什么区别 【架构师】微服务架构--REST与RPC Rest和RPC接口区别 1 REST与RPC概念 什么是REST REST是一种架构风格,指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。REST规范把所有内容都视为资源,网络上一切皆资源。 REST并没有创造新的技术,组件或服务,只是使用Web的现有特征和能力。 可以完全通过HTTP协议实现,使用 HTTP 协议处理数据通信。REST架构对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。 HTTP动词与REST风格CRUD对应关系: 什么是RPC 远程方法调用,就是像调用本地方法一样调用远程方法。常见RPC框架结构图: RPC框架要做到的最基本的三件事: 1、服务端如何确定客户端要调用的函数; 在远程调用中,客户端和服务端分别维护一个【ID->函数】的对应表, ID在所有进程中都是唯一确定的。客户端在做远程过程调用时,附上这个ID,服务端通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。 2、如何进行序列化和反序列化; 客户端和服务端交互时将参数或结果转化为字节流在网络中传输,那么数据转化为字节流的或者将字节流转换成能读取的固定格式时就需要进行序列化和反序列化

Java读源码之Netty深入剖析学习(一)

五迷三道 提交于 2020-08-15 04:16:12
Dubbo、Rocket MQ底层都是用了Netty应用框架 服务端: public class ServerBoot { private static final int PORT = 8000; public static void main(String[] args) { Server server = new Server(PORT); server.start(); } } public class Server { private ServerSocket serverSocket; public Server(int port) { try { this.serverSocket = new ServerSocket(port);//相当于服务器启动了,并且监听了端口号port System.out.println("服务端启动成功,端口:" + port); } catch (IOException exception) { System.out.println("服务端启动失败"); } } public void start() { new Thread(new Runnable() { @Override public void run() { doStart(); } }).start(); } private void doStart() { while

JAVA报找不到或无法加载主类的错误

久未见 提交于 2020-08-15 03:56:20
错误说明 本次测试类为TestMain 如果使用常规方式,即,java TestMain.class 运行当前class文件 即会报找不到当前类,就是我们想要运行的TestMain.class文件。 可是TestMain.class就在我们想要运行的目录下啊,而且cmd也是在当前目录打开的,那就应该能正常运行。 先附上正确运行的方式,我们在来看差别 可以看到,只是添加了一个-classpath参数以后,该TestMain.class文件就可以正常运行,看样子问题就出在这个-classpath参数上。 java -classpath C:\Users\nikolaperelman\IdeaProjects\my-netty\src\main\java com.gitee.randomobject.test.TestMain 因为如果不添加-classpath文件的路径,那么就是默认去环境变量中去寻找class文件,默认环境变量一般配置为 JAVA_HOME,%JAVA_HOME%\bin,或者classpath:%JAVA_HOME%\lib\rt.d=jar;%JAVA_HOME%\lib\tools,jar 等等吧,这些配置的路径下边怎么会有我们生成的TestMain.class文件呢,故需要手动指定,这就是-classpath的作用,后边com.gitee

999页阿里P7Java学习笔记在互联网上火了,完整版开放下载

孤街醉人 提交于 2020-08-15 03:11:27
笔记作者:来自于阿里P8级架构师: Mark 笔记特点:条理清晰,含图像化表示更加易懂。 内容概要:包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat等大厂面试题等、等技术栈! 由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。 JAVA集合 接口继承关系和实现 List ArrayList(数组) Vector(数组实现、线程同步) LinkList(链表) Set HashSet(Hash表) TreeSet(二叉树) JVM JVM就是java虚拟机,它是一个虚构出来的计算机,可在实际的计算机上模拟各种计算机的功能。JVM有自己完善的硬件结构,例如处理器、堆栈和寄存器等,还具有相应的指令系统。 线程 JVM内存区域 JVM运行时内存 垃圾回收与算法 JAVA 四种引用类型 GC分代收集算法 VS 分区收集算法 GC垃圾收集器 JAVA IO/NIO JVM 类加载机制 JAVA多线程并发 JAVA并发知识库 JAVA线程实现/创建方式 4种线程池 线程生命周期(状态) 终止线程4种方式 sleep与wait 区别

面试官问我:什么是 Netty 的零拷贝?我懵了

萝らか妹 提交于 2020-08-15 02:57:00
理解零拷贝 零拷贝是Netty的重要特性之一,而究竟什么是零拷贝呢? WIKI中对其有如下定义: "Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another. 从WIKI的定义中,我们看到“零拷贝”是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。 Non-Zero Copy方式: Zero Copy方式: 从上图中可以清楚的看到,Zero Copy的模式中,避免了数据在用户空间和内存空间之间的拷贝,从而提高了系统的整体性能。Linux中的sendfile()以及Java NIO中的FileChannel.transferTo()方法都实现了零拷贝的功能,而在Netty中也通过在FileRegion中包装了NIO的FileChannel.transferTo()方法实现了零拷贝。 而在Netty中还有另一种形式的零拷贝,即Netty允许我们将多段数据合并为一整段虚拟数据供用户使用

用 ScheduledThreadPoolExecutor 实现netty中的定时任务

浪子不回头ぞ 提交于 2020-08-14 22:47:56
代码结构: . |____Main.java |____ScheduledThreadPoolExecutorMgr.java |____Main.java package scheduledthreadpoolexecutortest; import java.util.concurrent.RunnableScheduledFuture; public class Main { public static int count = 0; public static RunnableScheduledFuture runnable; public static void main(String[] args) { long start = System.currentTimeMillis(); runnable = ScheduledThreadPoolExecutorMgr.schedule(new Runnable() { @Override public void run() { count++; System.out.println("第" + count + "次运行" + " " + Thread.currentThread().getName() + " 在 " + (System.currentTimeMillis() - start) + " ms后"); } }

Java 类加载出现死锁? 转

半腔热情 提交于 2020-08-14 18:01:22
出处: Java 类加载还会死锁?这是什么情况? 一、前言 先贴一份测试代码,大家可以先猜测一下,执行结果会是怎样的: import java.util.concurrent.TimeUnit; public class TestClassLoading { public static class A{ static { System.out.println( "class A init" ); try { TimeUnit.SECONDS.sleep( 1 ); } catch (InterruptedException e) { e.printStackTrace(); } new B(); } public static void test() { System.out.println( "aaa" ); } } public static class B{ static { System.out.println( "class B init" ); new A(); } public static void test() { System.out.println( "bbb" ); } } public static void main(String[] args) { new Thread(() -> A.test()).start(); new Thread(() ->