Java进阶
lemonmini
这个作者很懒,什么都没留下…
展开
-
Netty私有协议栈开发
几个基本功能描述消息协议定义,消息编解码,连接认证,链路有效性校验机制,链路的断开重连机制。主要设计消息协议设计:消息头+消息体。消息头定义了基本协议字段定义,添加attachment方便扩展。Object编解码使用Marshaller。链路交互设计:链路什么时候建立,什么时候关闭,握手请求与相应。可靠性设计:心跳检查机制,重连机制,重复登录保护,消息缓存重发。安全性设计:本章使用基于...原创 2019-12-28 09:28:00 · 245 阅读 · 0 评论 -
Java详解之Nginx 虚拟主机
什么是虚拟主机虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供 www 服务,这样就可以实现一台主机对外提供多个 web 服务,每个虚拟主机之间是独立的,互不影响的。通过 Nginx 可以实现虚拟主机的配置,Nginx 支持三种类型的虚拟主机配置基于 IP 的虚拟主机基于域名的虚拟主机基于端口的虚拟主机Nginx 配置文件的结构...原创 2019-12-18 22:24:46 · 233 阅读 · 0 评论 -
分布式、微服务服务架构剖析
一、RPCRPC(Remote Process Call),即远程服务调用,被广泛地应用在很多企业应用中,是早期主要的服务治理方案,其流程较为简单,客户端consumer携带参数发送RPC请求到服务提供方provider,provider根据参数路由到具体函数,方法,并将执行获得的结果返回,至此一次RPC调用完成。 随着业务的发展,大数据时代的到来,服务提供方的压力也日益增大,单机应用的处...原创 2019-11-25 21:16:17 · 271 阅读 · 0 评论 -
java实现socket连接方法封装详解
Java实现socket连接技巧Socket通信几乎无时不在, 当然能够搜集到的信息也大量存在, 为了避免重复的劳作, 抽取了关于客户端和服务端的Socket, 并将其应用到适合JVM(LInux/Windows)或者DVM(Android)平台. 这个封装好的API具有以下优势:1.满足具有Socket客户端需求的基本应用。2.满足具有Socket服务端的基本应用。具备并发能力, 能满足...原创 2019-11-21 19:58:53 · 1899 阅读 · 0 评论 -
Netty实战入门详解——让你彻底记住什么是Netty
一、Netty 简介Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程,但是你仍然可以使用底层的 API。Netty 的内部实现是很复杂的,但是 Netty 提供了简单易用的API从网络处理代码中解耦业务逻辑。Netty 是完全基于 NIO 实现的,所以整个 Nett...原创 2019-11-20 18:35:56 · 721 阅读 · 0 评论 -
Spring AOP(一) AOP基本概念
Spring框架自诞生之日就拯救我等程序员于水火之中,它有两大法宝,一个是IoC控制反转,另一个便是AOP面向切面编程。今日我们就来破一下它的AOP法宝,以便以后也能自由使出一手AOP大法。AOP全名Aspect-oriented programming面向切面编程大法,它有很多兄弟,分别是经常见的面向对象编程,朴素的面向过程编程和神秘的函数式编程等。所谓AOP的具体解释,以及和OOP的区别不清...原创 2019-11-19 17:09:01 · 151 阅读 · 0 评论 -
java定时任务框架elasticjob详解
前言Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架。去掉了和dd-job中的监控和ddframe接入规范部分。该项目基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发。 ddframe其他模块也有可独立开源的部分,之前当当曾开源过dd-soa的基石模块DubboX。 项目开源地址:https://github.co...原创 2019-11-18 21:02:28 · 1903 阅读 · 0 评论 -
Window搭建部署RocketMQ步骤详解
序以前简单用过ActiveMQ但是公司项目上使用的是RocketMQ,所以准备多花点时间在这上面,搞懂项目的配置使用。看了很多资料,先说说我自己对RocketMQ的简单理解。不管是我们写的消费者还是生产者都属于客户端,而我们需要安装RocketMQ,这是属于服务端。和ActivieMQ、zookeeper类似,消费者、生成者、服务端(NameServer)之间是采取观察者模式实现。在操作系统...原创 2019-11-13 20:07:34 · 599 阅读 · 0 评论 -
消息中间件这么多,到底应该如何选型?
消息队列已经逐渐成为企业应用系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能。当前使用较多的消息队列有 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等,而部分数据库如 Redis、MySQL 以及 PhxSQL 也可实现消息队列的功能。消息队列概述消息队列是指利用高效可靠的消息传递机制进行与平台无关的数据...原创 2019-11-12 20:24:13 · 996 阅读 · 0 评论 -
一篇文章揭秘Redis的磁盘持久化机制
前言Redis 是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永久丢失,需要定期将 Redis 中的数据以数据或命令的形式从内存保存到本地磁盘。当下次 Redis 重启时,利用持久化文件进行数据恢复。Redis 提供了 RDB 和 AOF 两种持久化机制,前者将当前的数据保存到磁盘,后者则是将每次执行的写命令保存到磁盘(类似于 MySQL 的 Binlog)。本文将详细介绍 RD...原创 2019-11-11 19:39:22 · 342 阅读 · 0 评论 -
多图解析,让Redis提高数倍性能的Redis管道,是这么一回事
曾经有个阿里P9大佬说过,对于后台开发来说,能够把Spring跟Redis的吃透,来阿里工作完全可以胜任绝大部分后端开发的工作。Redis,作为当前最流行的后台缓存/存储组件,被广泛应用在不同行业、不同系统、不同服务中。今天,我们来谈一谈一个Redis的高级用法,如何使用Redis-cli的管道功能。在了解Redis的管道功能之前,我们先来了解下Linux系统的底层知识,Socket是如何进行通信...原创 2019-11-11 18:24:00 · 166 阅读 · 0 评论 -
Java LocalCache 本地缓存的实现实例
使用场景在Java应用中,对于访问频率高,更新少的数据,通常的方案是将这类数据加入缓存中。相对从数据库中读取来说,读缓存效率会有很大提升。在集群环境下,常用的分布式缓存有Redis、Memcached等。但在某些业务场景上,可能不需要去搭建一套复杂的分布式缓存系统,在单机环境下,通常是会希望使用内部的缓存(LocalCache)。实现这里提供了两种LocalCache的实现,一种是基于Co...原创 2019-11-11 17:48:32 · 1701 阅读 · 0 评论 -
用 Skywalking 做dubbo分布式链路追踪
主要介绍如何搭建 Skywalking 做dubbo分布式跟踪原创 2019-11-08 18:21:59 · 1901 阅读 · 0 评论 -
Spring Cloud原理详解
一、Spring Cloud核心组件:Eureka(1)Netflix Eureka1)Eureka服务端:也称服务注册中心,同其他服务注册中心一样,支持高可用配置。如果Eureka以集群模式部署,当集群中有分片出现故障时,那么Eureka就转入自我保护模式。它允许在分片故障期间继续提供服务的发现和注册,当故障分片恢复运行时,集群中其他分片会把它们的状态再次同步回来2)Eureka客户端:主...原创 2019-10-31 20:46:22 · 1014 阅读 · 0 评论 -
springcloud config配置读取优先级过程详解
情景描述最近在修复Eureka的静态页面加载不出的缺陷时,最终发现是远程GIT仓库将静态资源访问方式配置给禁用了(spring.resources.add-mappings=false)。虽然最后直接修改远程GIT仓库的此配置项给解决了(spring.resources.add-mappings=true),但是从中牵涉出的配置读取优先级我们必须好好的再回顾下springcloud confi...原创 2019-10-31 20:36:06 · 4871 阅读 · 0 评论 -
使用SpringBoot整合ssm项目的实例详解
SpringBoot是什么?Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。Spring Boot 现在已经成为 Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。成为 SpringBoot 全家桶,成为一把万能钥匙。SpringBoot的特点1.创建独立的 Spring 应用程序...原创 2019-10-31 20:13:52 · 1440 阅读 · 1 评论 -
Mybatis高级映射、动态SQL及获得自增主键的解析
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。下文给大家介绍Mybatis高级映射、动态SQL及获得自增主键的内容,具体详情请参考本文。一、动态SQL相信大家在用mybatis操作数据库时时都会碰到一个问题,假如现在我们有一个关于作者的list ...原创 2019-10-30 19:04:28 · 446 阅读 · 0 评论 -
MyBatis 动态SQL和缓存机制实例详解
有的时候需要根据要查询的参数动态的拼接SQL语句常用标签:if:字符判断choose【when…otherwise】:分支选择trim【where,set】:字符串截取,其中where标签封装查询条件,set标签封装修改条件foreach:if案例1)在EmployeeMapper接口文件添加一个方法public Student getStudent(Student stude...原创 2019-10-30 18:12:09 · 160 阅读 · 0 评论 -
详细介绍SpringCloud之Ribbon
一:Ribbon是什么?Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随即连接等)去连接这些机器。我们也很容易使用Rib...原创 2019-10-29 19:30:34 · 198 阅读 · 0 评论 -
Java数据结构之树基本概念解析及代码示例
Java中树的存储结构实现 一、树 树与线性表、栈、队列等线性结构不同,树是一…节点与节点之间的父子关系,可以为每个节点增加一个parent域,用以记录该节点的父点树是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点组成一个具有层次关系的集合。把 它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶...原创 2019-10-29 18:03:43 · 303 阅读 · 0 评论 -
Java 事务详解及简单应用实例
Java事务的简单使用Java事务在一些面试中会被问到。面试的时候,我们首先要回答的是:事务能够保证数据的完整性和一致性。如果功力深厚点的话:就说一些原理(任务开始前先设置不提交任务,在所有任务完成后再提交任务,如果任务在中间断开,就执行回滚,撤销前面执行的任务),简单一点就举个的例子(比如存钱和取钱的问题。比如:银行在两个账户之间转账,从A账户转入B账户1000元,系统先减少A账户的1...原创 2019-10-28 18:19:30 · 986 阅读 · 0 评论 -
详解 Kubernetes 垃圾收集器的实现原理
垃圾收集器在 Kubernetes 中的作用就是删除之前有所有者但是现在所有者已经不存在的对象,例如删除 ReplicaSet 时会删除它依赖的 Pod,虽然它的名字是垃圾收集器,但是它在 Kubernetes 中还是以控制器的形式进行设计和实现的。在 Kubernetes 引入垃圾收集器之前,所有的级联删除逻辑都是在客户端完成的,kubectl 会先删除 ReplicaSet 持有的 Pod ...原创 2019-10-25 19:06:55 · 641 阅读 · 0 评论 -
详解springMVC容器加载源码分析
springmvc是一个基于servlet容器的轻量灵活的mvc框架,在它整个请求过程中,为了能够灵活定制各种需求,所以提供了一系列的组件完成整个请求的映射,响应等等处理。这里我们来分析下springMVC的源码。首先,spring提供了一个处理所有请求的servlet,这个servlet实现了servlet的接口,就是DispatcherServlet。把它配置在web.xml中,并且处理我们...原创 2019-10-25 18:28:23 · 137 阅读 · 0 评论 -
Java容器详细解析
前言:在java开发中我们肯定会大量的使用集合,在这里我将总结常见的集合类,每个集合类的优点和缺点,以便我们能更好的使用集合。下面我用一幅图来表示其中淡绿色的表示接口,红色的表示我们经常使用的类。1:基本概念Java容器类类库的用途是保存对象,可以将其分为2个概念。1.1:Collection一个独立元素的序列,这些元素都服从一条或多条规则。其中List必须按照插入的顺序保存元素、Se...原创 2019-10-25 17:44:32 · 163 阅读 · 0 评论 -
Dubbo 服务注册&暴露剖析
Dubbo 服务暴露过程是通过 com.alibaba.dubbo.config.spring.ServiceBean 来实现的。Spring 容器 refresh() 完成后,会发送 ContextRefreshedEvent,ServiceBean 会接收到这个 event 然后调用 export()。Dubbo 服务暴露过程:1)获取 Invoker Invoker<?> i...原创 2019-10-24 19:30:54 · 226 阅读 · 0 评论 -
缓存奠基-缓存火爆概念学习
缓存雪崩缓存雪崩是由于原有缓存失效(过期),新缓存未到期间。所有请求都去查询数据库,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。解决方法:1.一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。2.给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存。缓存标记:记录缓存数据是否过期,如果过...原创 2019-10-22 17:42:36 · 78 阅读 · 0 评论 -
分布式服务架构之java远程调用技术浅析
在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来...转载 2019-10-21 18:42:46 · 237 阅读 · 0 评论 -
互联网高可用架构技术实践
一、什么是高可用高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。假设系统一直能够提供服务,我们说系统的可用性是100%。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。...转载 2019-10-21 18:19:57 · 177 阅读 · 1 评论 -
Java中锁的实现和内存语义浅析
概述锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程获取同一个锁的线程发送消息。锁在实际使用时只是明白锁限制了并发访问, 但是锁是如何实现并发访问的, 同学们可能不太清楚, 下面这篇文章就来揭开锁的神秘面纱.锁的内存语义当线程获取锁时, JMM会把线程对应的本地内存置为无效. 从而使得被监视器保护的临界区的变量必须从主内存中读取.当线程释放锁时,...原创 2019-10-15 19:08:40 · 191 阅读 · 0 评论 -
详谈java指令重排序的问题
指令重排序是个比较复杂、觉得有些不可思议的问题,同样是先以例子开头(建议大家跑下例子,这是实实在在可以重现的,重排序的概率还是挺高的),有个感性的认识/**一个简单的展示Happen-Before的例子.这里有两个共享变量:a和flag,初始值分别为0和false.在ThreadA中先给 a=1,然后flag=true.如果按照有序的话,那么在ThreadB中如果if(flag)成功的话...原创 2019-10-15 18:56:12 · 620 阅读 · 0 评论 -
JAVA面试题合集 JAVA面试题
分布式数据库面试专题系列:分布式通讯面试专题系列:分布式限流面试专题系列:常见算法面试题:开发框架面试题:面试扩充:面试经验:BAT面试常问:性能优化面试题:对标阿里P6级架构师点击链接或扫描二维码获取面试及更多学习资料:...原创 2019-10-15 12:09:15 · 322 阅读 · 0 评论 -
Java并发系列之ReentrantLock源码分析
在Java5.0之前,协调对共享对象的访问可以使用的机制只有synchronized和volatile。我们知道synchronized关键字实现了内置锁,而volatile关键字保证了多线程的内存可见性。在大多数情况下,这些机制都能很好地完成工作,但却无法实现一些更高级的功能,例如,无法中断一个正在等待获取锁的线程,无法实现限定时间的获取锁机制,无法实现非阻塞结构的加锁规则等。而这些更灵活的加锁...原创 2019-10-14 18:31:32 · 95 阅读 · 0 评论 -
BAT面试总结(二)
11. ArrayList、LinkedList、Vector的区别List的三个子类的特点ArrayList:底层数据结构是数组,查询快,增删慢;线程不安全,效率高。Vector:底层数据结构是数组,查询快,增删慢;线程安全,效率低。LinkedList:底层数据结构是链表,查询慢,增删快;线程不安全,效率高。Vector相对ArrayList查询慢(线程安全的)。Vector相...原创 2019-09-18 16:18:50 · 102 阅读 · 0 评论 -
BAT面试总结(三)
21. TreeMap、HashMap、LindedHashMap的区别LinkedHashMap可以保证HashMap集合有序,存入的顺序和取出的顺序一致。TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。HashMap不保证顺序,即为无序的,具有很快的访问速...原创 2019-09-18 17:09:47 · 161 阅读 · 0 评论 -
面试必知Redis
使用Redis有哪些好处?速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O支持丰富数据类型,支持string,list,set,sorted set,hash支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除redis相比m...原创 2019-09-23 17:54:51 · 101 阅读 · 0 评论 -
JVM中GC详解
在Java面试过程中,JVM是必问项目。主要问题一般都是集中到JVM GC的类型和策略上。今天主要谈到的是年轻代GC、老年代GC以及Minor GC、Major GC、Full GC之间的联系与区别。JVM堆内存分为两部分:年轻代(Young Generation)和老年代(Old Generation)。年轻代:产生新对象。年轻代被分为3个部分:一个Eden区和两个Survivor区...原创 2019-09-24 13:44:10 · 336 阅读 · 0 评论 -
Java中级工程师面试题
String、StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?String是字符串常量,StringBuffer和StringBuilder是字符串变量。StringBuffer是线程安全的,StringBuilder是非线程安全的。具体来说String是一个不可变的对象,每次修改String对象实际上是创新新对象,并将引用指向新对象。效率很低。...原创 2019-09-24 16:52:15 · 2034 阅读 · 0 评论 -
Java多线程教程
Java中的多线程是一个同时执行多个线程的过程。线程基本上是一个轻量级的子进程,是最小的处理单元。 多处理和多线程,都用于实现多任务处理。但是使用多线程而不是多处理,因为线程共享一个公共内存区域。它们不分配单独的内存区域,因此节省了内存,并且线程之间的上下文切换花费的时间少于进程。Java多线程主要用于游戏,动画等。Java多线程的优点1)它不会阻止用户,因为线程是独立的,您可以同时执行多个...原创 2019-09-25 20:54:44 · 496 阅读 · 0 评论 -
Java 单例模式
单例设计模式常用于JDBC链接数据库,饿汉模式和懒汉模式饿汉式单例对于饿汉模式,我们可这样理解:该单例类非常饿,迫切需要吃东西,所以它在类加载的时候就立即创建对象。懒汉式单例类对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备。它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返回。...原创 2019-09-26 18:13:14 · 148 阅读 · 0 评论 -
为什么Java程序员必须掌握Spring Boot?
Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,就单从我个人的博客的访问量大幅增加就可以感受到大家对学习 Spring Boot 的热情,那么在这么多人热衷于学习 Spring Boot 之时,我自己也在思考: Spring Boot 诞生的背景是什么?Spring 企业又是基于什么样的考虑创建 Spring Boot? 传统企业使用 Spring Boot 会...原创 2019-09-27 18:47:29 · 136 阅读 · 0 评论