Netty

Dubbo面试题(2020最新版)

不问归期 提交于 2021-01-05 01:42:02
基础知识 为什么要用 Dubbo? 随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了面向服务的架构体系(SOA),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。就这样为分布式系统的服务治理框架就出现了,Dubbo 也就这样产生了。 Dubbo 是什么? Dubbo 是一款高性能、轻量级的开源 RPC 框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成。 Dubbo 的使用场景有哪些? 透明化的远程方法调用:就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 软负载均衡及容错机制:可在内网替代 F5 等硬件负载均衡器,降低成本,减少单点。 服务自动注册与发现:不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添加或删除服务提供者。 Dubbo 核心功能有哪些? Remoting:网络通信框架,提供对多种NIO框架抽象封装,包括“同步转异步”和“请求-响应”模式的信息交换方式。 Cluster:服务框架,提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。 Registry:服务注册,基于注册中心目录服务

丁威: 优秀程序员必备技能之如何高效阅读源码(二更)

北慕城南 提交于 2021-01-04 15:22:00
“我能熟练使用这个框架/软件/技术就行了, 为什么要看源码?” “平时不用看源码, 看源码太费时间,还容易忘记,工作中出现问题再针对性地阅读,效率更高。” “为了面试才需要看源码!” 。。。。。。 如果你也有类似的疑问,不妨接着往下看 1、为什么要阅读源码? 1.1 在通用型基础技术中提高技术能力 在 JAVA 领域中包含 JAVA 集合、Java并发(JUC)等, 它们是项目中使用的高频技术,在各种复杂的场景中选用合适的数据结构、线程并发模型,合理控制锁粒度等都能显著提高应用程序的可用性、健壮性,非常容易凸显出自己的技术实力,更容易受到领导的认可,助力职场。 当然通过阅读源码并不是知晓原理的唯一方法,但作为一个名程序员、直面代码,亲自感受代码的魅力或许会显得的更加直接。 1.2 在重点领域打造自己的亮点 我所在公司使用了 Dubbo、RocketMQ,我也有幸参与到这些技术栈的运用与运维,积累了丰富的使用经验,为了突出在这两个领域的优势,我详细阅读了它们的源码,在CSDN和公众号等知识分享平台发布了大量的技术文章,成体系的剖析其实现原理、架构设计理念,理论与实战相结合,让我成为在Dubbo、RocketMQ领域当仁不让的技术专家,团队中的核心骨干。 同时由于文章是成体系的,被出版社相中,邀请出书,《RocketMQ技术内幕》一书应运而生,从而成为我职业技能列表中非常亮眼的名片

深入理解Java引用类型

坚强是说给别人听的谎言 提交于 2021-01-04 14:45:51
在Java中类型可分为两大类:值类型与引用类型 值类型就是基本数据类型(如int ,double 等),而引用类型,是指除了基本的变量类型之外的所有类型(如通过 class 定义的类型)。所有的类型在内存中都会分配一定的存储空间(形参在使用的时候也会分配存储空间,方法调用完成之后,这块存储空间自动消失), 基本的变量类型只有一块存储空间(分配在stack中), 而引用类型有两块存储空间(一块在stack中,一块在heap中),在函数调用时Java是传值还是传引用,这个估计很多人至今都很糊涂,下面用图形与代码来解释:   在上图中引用类型在传参时不是在heap中再分配一块内存来存变量c 所指向的A(),而是让a 指向同一个A 的实例,这就与C++ 中的指针一样,先声明指针变量a,b,c,d 在传参的时候让a 指向c所指向的内存,让 d 指向 b 所指向的内存。很明显Java中的引用与C++中的指针在原理上是相类似的,但记住Java没有指针,只有引用。下面再通过一些具体的代码来讨论引用: 1. 简单类型是按值传递的 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value)。这一点我们可以通过一个简单的例子来说明: package test; public class Test { //交换两个变量的值 public static void Swap(int a

Java实现文件的加密与解密

丶灬走出姿态 提交于 2021-01-03 16:23:32
最近在做一个项目,需要将资源文件(包括图片、动画等类型)进行简单的加密后再上传至云上的服务器,而在应用程序中对该资源使用前先将读取到的文件数据进行解密以得到真正的文件信息。此策略的原因与好处是将准备好的资源存储在云上,使用时通过网络进行读取即可,减少了应用程序本身的大小。这一点对于移动应用尤其重要,特别是在资源量较大且需要对其进行保护的时候。毕竟在目前所处的大环境下,要想复制一款软件不难,那真正宝贵的就是不容易找到的资源了。   先对文件与加密的相关知识做一个极为简单的科普(知道的可以跳过)。    文件与字串   A、文件的操作流程一般为:打开-->读取-->对内容进行变换-->写入-->关闭。   B、常规性文件操作会用到的类有五个:File,InputStream,OutputStream,FileInoutStream,FileOutputStream,均包含在java.io下面。注意,在使用前必须对类文件进行导入,方法为import java.io.File(实现时需要分号结尾)。   C、创建InputStream类和OutputStream类的对象时,new关键字后边的类分别是FileInputStream和FileOutputStream(而不是其自身),如InputStream fin = new FileInputStream(File objectFile)

delete后加 limit是个好习惯么 !

十年热恋 提交于 2021-01-03 11:37:34
作者: _陈哈哈 blog.csdn.net/qq_39390545/article/details/107519747 在业务场景要求高的数据库中,对于单条删除和更新操作,在 delete 和 update 后面加 limit 1 绝对是个好习惯。比如,在删除执行中,第一条就命中了删除行,如果 SQL 中有 limit 1;这时就 return 了,否则还会执行完全表扫描才 return。效率不言而喻。 那么,在日常执行 delete 时,我们是否需要养成加 limit 的习惯呢?是不是一个好习惯呢? 在日常的 SQL 编写中,你写 delete 语句时是否用到过以下 SQL? delete from t where sex = 1 limit 100; 你或许没有用过,在一般场景下,我们对 delete 后是否需要加 limit 的问题很陌生,也不知有多大区别,今天带你来了解一下,记得 mark! “ 写在前面,如果是清空表数据建议直接用 truncate,效率上 truncate 远高于 delete,应为 truncate 不走事务,不会锁表,也不会生产大量日志写入日志文件;truncate table table_name 后立刻释放磁盘空间,并重置 auto_increment 的值。delete 删除不释放磁盘空间,但后续 insert 会覆盖在之前删除的数据上

Proguard and Netty 5 on Android

别等时光非礼了梦想. 提交于 2021-01-03 08:38:12
问题 I've seen a couple questions regarding this issue, but they are for older versions of Netty. I have tried their answers, switching org.jboss.netty out with io.netty, but the same error occurs. I'm trying to compile an Android app that uses Netty 5.0.0Alpha2 (build #16) with Proguard enabled. Without Proguard, the app runs fine. As soon as I enable Proguard, I get this exception when it tries to use Netty: java.lang.IllegalStateException: unknown type parameter 'I': class io.netty.channel

成功入职字节跳动,分享我的八面面经心得!

余生颓废 提交于 2021-01-02 22:58:52
今天正式入职了字节跳动。办公环境也很好,这边一栋楼都是办公区域。公司内部配备各种小零食、饮料,还有免费的咖啡。15楼还有健身房。而且公司包三餐来着。下午三点半左右还会有阿姨推着小车给大家送下午茶。听说入职以后很容易长胖来着。不过如果想要保持身材的话,公司二楼还提供专门的健身餐。周二周四还可以预约专业的按摩服务,有效调理颈椎和腰椎。生活服务得这么贴心,感觉在这里就只需要好好工作就好了吧,哈哈 为什么想去字节跳动 实际上,这次的工作变动并不在我计划中。只是在四月份的时候偶然得知字节跳动上海要搬到合川路地铁站附近,我就忽然心动了。为什么呢,因为我家距离合川路地铁站步行只要十分钟。本身宇宙条待遇高名声在外,也就是说,只要我能来这里的话,人生最美满的钱多事少离家近的不可能三角我能拿俩。所以在五月份的时候我就开始悄摸摸地准备面试头条了。为的就是以后可以过上早上八点半起床,然后慢慢悠悠走到公司还不迟到(可能还是很早来的人之一)的生活。 当然,这是我为什么想去字节跳动的原因。换算到你们自己的时候,你们也要想一想是因为什么想要换一份工作、想要去某个公司。为了薪资?环境?平台?还是大公司的名头?记住,不管是为了哪一个,都OK的。谈钱不伤感情,目标明确,心智坚定以后,才好围绕着这个目标做一系列的准备。面试的过程中每次面试官问我为什么想来字节跳动,我都是直截了当地说离家近,还说假如这次面不上,准备准备

netty 与 webSocket

蹲街弑〆低调 提交于 2021-01-01 07:41:11
netty 与 webSocket 起因 有个需求需要用到 webSocket ,然后最近又正好在学 netty ,然后合起来走一波。写篇文章记录一下,做一个念想。 协议格式 0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-------+-+-------------+-------------------------------+ |F|R|R|R| opcode|M| Payload len | Extended payload length | |I|S|S|S| (4) |A| (7) | (16/64) | |N|V|V|V| |S| | (if payload len==126/127) | | |1|2|3| |K| | | +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + | Extended payload length continued, if payload len == 127 | + - - - - - - - - - - - - - - - +-------------------------------+ | |Masking-key, if MASK

阿里P7详解Java并发之异步转同步

依然范特西╮ 提交于 2021-01-01 07:34:42
在Java并发编程中,经常会因为需要提高响应速度而将请求异步化,即将同步请求转化为异步处理,这是很自然能想到的一种处理方式。相反,在有些场景下也需要将异步处理转化为同步的方式。 首先介绍一下同步调用和异步调用的概念: 同步调用:调用方在调用过程中,持续等待返回结果。 异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为回调函数。 其实,两者的区别还是很明显的,这里也不再细说,我们主要来说一下Java如何将异步调用转为同步。换句话说,就是需要在异步调用过程中,持续阻塞至获得调用结果。接下来将介绍5种Java并发编程中异步转同步的方法。 使用wait和notify方法 使用条件锁 Future 使用CountDownLatch 使用CyclicBarrier 前置条件:构造一个异步调用 首先,写demo需要先写基础设施,这里是需要构造一个异步调用模型。异步调用类: import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; //加入Java开发交流君样:756584822一起吹水聊天 public class

The exception java.lang.NoSuchMethodError thrown when invoking Azure storage related java API

怎甘沉沦 提交于 2021-01-01 06:56:33
问题 Leave thread here for others who might run into same issues. I'm trying to reading blob from Azure container by code below: public static void main(String[] args) { String connectStr = "it's a workable connection string..."; // Create a BlobServiceClient object which will be used to create a container client BlobServiceClient blobServiceClient = new BlobServiceClientBuilder().connectionString(connectStr).buildClient(); String containerName = "eugenecontainer"; BlobContainerClient