Netty

面试又挂了,竟然被k8s难倒了!

帅比萌擦擦* 提交于 2020-12-30 16:57:05
过去几年,以 Docker、Kubernetes 为代表的容器技术已发展为一项通用技术,BAT、滴滴、京东、头条等大厂,都争相把容器和 K8S 项目作为技术重心,试图“放长线钓大鱼”。 就说阿里吧,目前基本所有业务都跑在云上,其中有一半已迁移到自己定制 Kubernetes 集群上。据说,今年计划完成 100% 基于 K8S 集群的业务部署。而服务网格这块儿,在阿里的一些部门(比如蚂蚁金服),已经有线上业务在用了。 这充分说明了容器在当今软件研发领域的地位。所以, 掌握容器技术成为很多公司在招聘时的重要选项。 但是,容器技术本身偏向运维,namespace 资源隔离、cgroups 资源限制等概念,对开发者来说,理解起来比较困难。这几年,在跟朋友探讨 K8S 落地时,也有一些问题被反反复复地提及,比如: 为什么容器里只能跑“一个进程”? 原先一直用的某个 JVM 参数,在容器里就不好使了? 为什么 Kubernetes 不能固定 IP 地址?容器网络连不通,该如何 Debug? K8S 中 StatefulSet 和 Operator 到底什么区别?PV 和 PVC 又该怎么用? 这些问题的答案和原理并不复杂。 但对初学者来说,很难用一两句话就解释清楚。因为容器技术涉及操作系统、网络、存储、调度、分布式原理等等方方面面的知识,是个名副其实的全栈技术。 而其技术体系里那些

java命名规范

爱⌒轻易说出口 提交于 2020-12-28 14:18:19
一、命名规范 1、 项目名全部小写 2、 包名全部小写 3、 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写。 如:public class MyFirstClass{} 4、 变量名、方法名首字母小写,如果名称由多个单词组成,每个单词的首字母都要大写。 如:int index=0; public void toString(){} 5、 常量名全部大写 如:public static final String GAME_COLOR=”RED”; 6、所有命名规则必须遵循以下规则: 1)、名称只能由字母、数字、下划线、$符号组成 2)、不能以数字开头 3)、名称不能使用JAVA中的关键字。 4)、坚决不允许出现中文及拼音命名。 二、注释规范 1、 类注释 在每个类前面必须加上类注释,注释模板如下: /** Copyright (C), 2006-2010, ChengDu Lovo info. Co., Ltd. FileName: Test.java 类的详细说明 @author 类创建者姓名 @Date 创建日期 @version 1.00 */ 2、 属性注释 在每个属性前面必须加上属性注释,注释模板如下: /** 提示信息 */ private String strMsg = null; 3、 方法注释 在每个方法前面必须加上方法注释,注释模板如下: /*

Java 泛型 泛型的约束与局限性

爷,独闯天下 提交于 2020-12-28 08:20:25
不能用基本类型实例化类型参数 不能用类型参数代替基本类型:例如,没有Pair,只有Pair,其原因是类型擦除。擦除之后,Pair类含有Object类型的域,而Object不能存储double值。这体现了Java语言中基本类型的独立状态。 运行时类型查询只适用于原始类型(raw type) 运行时:通常指在Classloader装载之后,JVM执行之时 类型查询:instanceof、getClass、强制类型转换 原始类型:即(raw type),泛型类型经编译器类型擦除后是Object或泛型参数的限定类型(例如Pair,Comparable就是T的限定类型,转化后泛型的原始类型就是Comparable,所以Pair类不带泛型是Pair),即Pair类含有Comparable类型的域 JVM中没有泛型 if(a instanceof Pair<String>) //ERROR,仅测试了a是否是任意类型的一个Pair,会看到编译器ERROR警告 if(a instanceof Pair<T>) //ERROR Pair<String> p = (Pair<String>) a;//WARNING,仅测试a是否是一个Pair Pair<String> stringPair = ...; Pair<Employee> employeePair = ...; if(stringPair

Spring框架

末鹿安然 提交于 2020-12-27 00:25:02
Spring框架自2002年诞生以来一直备受开发者青睐,它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解决方案。有人亲切的称之为:Spring 全家桶。 很多研发人员把spring看作心目中最好的java项目,没有之一。所以这是重点也是难点,工作中必须会,面试时肯定考。 那么,不妨花费10分钟,梳理Spring框架相关知识。 Spring知识点-汇总 spring系列包含非常多的项目,可以满足java开发中的方方面面。 先来看常用框架的知识点汇总,如图: 一、5个常用的spring框架 ▌1.spring framework 也就是我们经常说的spring框架,包括了ioc依赖注入,Context上下文、bean管理、springmvc等众多功能模块,其它spring项目比如spring boot也会依赖spring框架。 ▌2.spring boot 它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。 Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。 ▌3.Spring Data 是一个数据访问及操作的工具集,封装了多种数据源的操作能力,包括

Ozone Streaming方式的写优化

試著忘記壹切 提交于 2020-12-26 16:57:45
文章目录 前言 Ozone Streaming的实现背景:Ratis Streaming Ozone Streaming方式写过程 参考资料 前言 在Ozone目前数据写出的过程,是基于从对象文件的block,再从block到chunk粒度进行数据的写出的。每次Ozone写完一个chunk后,对应着会触发一次write chunk的RPC call。当我们写入的数据文件对象很大的时候,过程中将会涉及到很多次write chunk PRC的操作调用。这个RPC call的频繁调用意味着相应更多的transaction的发生。对于Ozone Datanode里使用Raft协议做数据一致性同步过程的影响而言,则意味着更多的raft log需要被apply以及对应Ratis snapshot的take操作也会变得更加频繁。在一定程度上,这会影响到Datanode节点本身的数据写出操作。最近社区提出了利用Ratis Streaming的特性来优化Ozone数据写出的流程。本文笔者来简单聊聊Ozone Streaming这种全新方式的数据写出过程,目前此功能处于有一个初步的设计方案阶段。 Ozone Streaming的实现背景:Ratis Streaming 首先我们来聊聊Ozone Streaming的一个大的背景,Ozone Streaming想法的提出源自于Ratis

十二个Java程序员必须掌握的Java开发框架

两盒软妹~` 提交于 2020-12-26 06:25:24
  十二个Java程序员必须掌握的Java开发框架有哪些?Java 开发应用很广泛,所以程序员就业行业和方向也很多,随着互联的发展,人工智能、大数据、区块链,很多Java 程序员选择Java Web/后端开发。然而程序员之前的区别还是很大的,如果想要拿高薪,作为一个程序员需要不断学习。   十二个必须掌握Java开发框架如下:   Java开发框架一、Spring   毫无疑问,Spring 框架现在是 Java 后端框架家族里面最强大的一个,其拥有 IOC 和 AOP 两大利器,大大简化了软件开发复杂性。并且,Spring 现在能与所有主流开发框架集成,可谓是一个万能框架,Spring 让 JAVA 开发变得更多简单。   Java开发框架二、Spring MVC   Spring MVC 是一个 MVC 开源框架,用来代替 Struts。它是 Spring 项目里面的一个重要组成部分,能与 Spring IOC 容器紧密结合,以及拥有松耦合、方便配置、代码分离等特点,让 JAVA 程序员开发 WEB 项目变得更加容易。   Java开发框架三、Spring Boot   Spring Boot 是 Spring 开源组织下的一个子项目,也是 Spring 组件一站式解决方案,主要是为了简化使用 Spring 框架的难度,简省繁重的配置。   Spring

闪电侠 Netty 小册里的骚操作

本秂侑毒 提交于 2020-12-26 01:14:10
前言 即使这是一本小册,但基于“不提笔不读书”的理念,仍然有必要总结一下。此小册对于那些“硬杠 Netty 源码 却不曾在千万级生产环境上使用实操”的用户非常有用。当然,对那些没有 Netty 编程经验的人来说,更为有用。 放个小册地址:[ Netty 入门与实战:仿写微信 IM 即时通讯系统 ]( https://juejin.im/book/5b4bc28bf265da0f60130116/section/5b4db06d5188251afc257383#heading-2 ) 再次强烈推荐,一碗黄焖鸡/半杯 Luckin coffee/一包炫赫门 的价钱,可以让你学会使用 Java 界的 epoll 进行多路复用网络编程,不能说是不划算的 :) 本文标题含有“骚操作”,为什么这么说呢? 作者是某团某评基础架构部技术专家,长期负责后台千万级别的推送系统,而这些推送系统自然是长连接实现的。可以想象,作者的这些实践经验不可谓不好用,纵然看过源码,提过 issue,本人也觉得这些操作非常好用,非常骚气。 开始 我们挑重点讲,虽然对于强迫症来讲,每一节都有笔记才是最吼的! 1 服务端启动流程 1. 通过给 bind 方法添加监听器,用以自动绑定递增端口。算骚操作吧? 2. attr 方法,为每条连接增加属性,能够实现全单例模式哟 3. childOption 方法,关于

Netty+html聊天室入门

纵然是瞬间 提交于 2020-12-25 08:25:01
1)服务端 ChatServer.java package chat; import chat.handler.WSServerInitializer; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; public class ChatServer { public static void main(String[] args) { EventLoopGroup bossGroup = new NioEventLoopGroup(1); EventLoopGroup workerGroup = new NioEventLoopGroup(); try { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup, workerGroup) .channel

一分钟学会Java中的final、static关键词

烂漫一生 提交于 2020-12-25 08:24:41
final关键词 概念:final的意思为最终,不可变。final是个修饰符,它可以用来修饰类,类的成员,以及局部变量。不能修饰构造方法。 特点: 1.final修饰的类不可以被继承,但可以继承别的类。 class Yy {} final class Fu extends Yy{} //可以继承Yy类 class Zi extends Fu{} //不能继承Fu类 2.final修饰的方法不可以被子类重写,但父类中没有被final修饰方法,子类重写后可以加final。 class Fu { // final修饰的方法,不可以被覆盖,但可以继承使用 public final void method1(){} public void method2(){} } class Zi extends Fu { //重写method2方法 public final void method2(){} }//加入Java开发交流君样:756584822一起吹水聊天 3 final修饰的变量称为常量,这些变量只能赋值一次。而且终身不变。 final int i = 20; i = 30; //赋值报错,final修饰的变量只能赋值一次 4.引用类型的变量值为对象地址值,地址值不能更改,但是地址内的对象属性值可以修改。 final Person p = new Person(); Person p2

记一次线上内存泄漏问题的排查过程

蓝咒 提交于 2020-12-24 19:36:24
近期需要对公司的接口做线上的巡查监控,需要写一个脚本放到服务器上,定时运行脚本监测线上接口是否正常。 测试的接口不是HTTP协议,而是公司基于TCP协议开发的私有协议,因此不能直接用现成的一些接口测试工具,需要自己写代码来调用接口。 由于是私有协议,为了方便各业务项目进行通信,开发部门统一提供了一个TClient的jar包,底层使用了netty框架进行通信。调用方只需要按照协议的格式组装二进制的包,然后直接调用TClient的sendMessage方法就可以把数据发送出去,服务端处理完成后会异步回调,将响应数据返回给客户端。 脚本写完了,伪代码如下 public class Demo{ public void invoke(){ // 创建TClient并初始化 TClient client = new TClient(xxx); // 组装接口数据包 Data data = new Data(xxx); // 发送数据 Response res = client.sendMessage(data); // 检查结果、存储结果、发送邮件 doSomething(); // 关闭client client.close(); } } 测试脚本中,每隔一分钟,创建一个Demo对象,调用invoke方法 Demo demo = new Demo(); demo.invoke();