暂时未有相关云产品技术能力~
暂无个人介绍
列式存储?OLAP?ClickHouse究竟是何方神圣
JDK9相比于JDK8,究竟变强了多少
如何快速学习一门新技术
时间类有多复杂,JDK竟设计了三版
Maven是Apache下的一个开源项目,目前可以用于构建和管理任何基于 Java 的项目的工具,让 Java 开发人员的日常工作更轻松。为了让开发人员更轻松,Maven做到了以下几点:
装饰者模式(Decorator)的定义是:在不必改变原类文件情况下,允许向一个现有的对象添加新的功能。比如一个毛坯房,可以使用灰色去装饰厨房,可以使用白色装饰客厅,但是不管使用多少颜料去装饰这个房间,房子的本质是不会发现变化的。 使用装饰者模式除了可以在不改变原类的前提下装饰对象之外,还可以随意组合各个装饰类,比如有三个装饰类,分别是给原类上红、黄、绿三种颜色。在使用时,可以将任意两种或任意三种装饰类搭配。接下来将会用代码演示上面的这个例子。
策略模式是设计模式中一个相对来说比较好理解,应用也十分广泛的设计模式。在我工作这些年所接触的项目中,有一个项目在整体上就使用了策略模式。在百科上,针对策略模式是这样介绍的:策略模式指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。 以某火锅品牌为例,同样是最后的收费环节,学生周末8.8折,工作日的指定时间6.9折,非学生全额支付。同样的收费方式在不同的情况下有不同的计算方式,这里就可以使用策略模式来实现。
建造者(Builder)模式在百度百科上的定义:是一种将复杂对象的构建和它的表示分离,使得同样的构建过程可以创建不同的表示。 这段话在理解上十分抽象,简单来讲就是如果一个对象很复杂,使用建造者模式允许用户通过简单的方式构建这个对象,而不用关心对象具体构建的细节。且可以使用同样的构建过程可以创建出不同的对象。 接下来将会通过具体的代码实例去讲解建造者模式。
SpringBoot以其自动装配的能力被广泛应用,我们在写代码时肯定遇到过很多spring-boot-starter命名的依赖,比如spring-boot-starter-web,在pom文件中引入这些starter依赖后,SpringBoot就能通过自动装配的技术扫描到这些类并装载到Bean容器中。
当有数据要从生产者发往消费者的时候,在kafka底层有这样一套流程。首先生产者调用send方法发送消息后,会先经过一层拦截器,接着进入序列化器。序列化器主要用于对消息的Key和Value进行序列化。接着进入分区器选择消息的分区。
Kafka是一个分布式的基于发布/订阅模式的消息队列,同时它又是一个分布式的事件流平台。既可作为消息队列,又可作为数据管道、流分析的应用。目前Kafka的最大应用还是消息队列。 市面上主流的消息队列有RabbitMQ,ActiveMQ、Kafka等等,其中RabbitMQ,ActiveMQ这些主要是Java应用中的队列,而Kafka主要在大数据场景下使用。 消息队列主要应用场景有如下几种:削峰、限流、解耦、异步通信等。
在正常的开发过程中,百分之99的对象实例都是通过new进行创建的,但是在实际的场景中,还是存在一些不通过new生成对象实例的应用场景。 比如:需要生成大量类似的对象实例时,如果都通过new去创建,性能并不好。 又比如:通过很复杂的方式生成了一个对象,现在要再创建出一个类似的对象出来。 上面的两种应用场景都可以通过“拷贝”这个动作来实现,这种根据一个已有的原型对象,拷贝生成新的对象的方式,就是设计模式中的原型模式(prototype)。 在Java中,可以通过Cloneable接口和clone方法很好地实现原型模式。
读取到的数据是DataFrame,接下来的操作就是对DataFrame的操作了。 (五)总结 SparkSQL是对Spark原生RDD的增强,虽然很多功能通过RDD就可以实现,但是SparkSQL可以更加灵活地实现一些功能。我是鱼仔,我们下期再见。
Spark计算框架封装了三种主要的数据结构:RDD(弹性分布式数据集)、累加器(分布式共享只写变量)、广播变量(分布式共享支只读变量)
前段时间我从一家偏传统软件行业跳到了互联网行业,到今天为止满打满算工作了一个月。就这一个月的时间已经足够看出两者之间巨大的差距了,也希望通过这篇分享给正在纠结去哪一种类型公司的人一个参考。
前段时间公司规划了一个新的项目,我成了这个项目的负责人。在做技术选型时,有一个需求阻碍了前进的步伐。大概有十亿条数据,数据总量在六百G左右,这些海量的数据需要每天根据一定的逻辑计算得到几千万的值。当数据量达到这种程度时,Java应用已经无法支撑了,于是在技术选型时选中了大数据计算框架--Spark。
事情的起因要从最近的一个新产品说起,最近部门有一个新的大数据产品规划,在考虑技术实现时,有一个动态表字段扩展的需求,比如原来表结构里只有a、b字段,需要不断的往里新增c、d、e等等字段,并且数据量也特别大。
后端写完所有的微服务之后,最终是要交给前端去调用。我们都知道每个微服务都有各自的端口号,如果前端直接通过IP加端口的方式去调用微服务会很麻烦。如果想对请求增加限制也会变得十分困难。这个时候微服务网关就出现了。
ElasticSearch中可以将数据以对象的方式存储并查询,但是ES底层的Lucene 没有内部对象的概念,因此如果通过默认的方式往ES中插入对象,ES会将对象层次结构扁平化为字段名称和值的简单列表。 比如下面这一段数据:
在程序中,每new() 一个对象,就会有一个对象实例生成。有时候在程序中,需要有一个在完整运行状态下只需要生成一个的实例,我们把这种实例称为单例。 抽象到设计模式中,这种只生成一个实例的模式就是单例模式(Singleton)。
监听器可以在使用过程时监听某些事件的发生,然后对这些事件做出响应处理。监听器对应用场景很多,用户的每一个操作都可以被定义为一个事件,通过监听器就能对某些业务场景中的事件进行监听。 Spring中提供了ApplicationListener监听事件,本文会从应用出发讲解Spring的监听器,并逐步深入到源码之中。
最近遇到一个功能点,数据库中一张很简单的表有一千多条数据,这里的数据主要做到了值域映射的作用,简单来讲就是我可以通过中文名拿到数据库中对应的code值。原本的实现方式是每次用到之后去查一次sql,虽然不会有什么问题,但是只要是走了网络io,都会消耗时间。所以这个方案需要想办法优化。 优化的方式其实很简单,数据量不多,一千多条数据放在内存里也占不了多少空间。因此完全可以把一次性把数据加载到内存中,后面只需要每次去内存里调用就可以了。
最近一直忙于对付即将上线的系统,期间也碰到了很多问题。最近印象比较深的是一个内存溢出的报错。测试告诉我最近某个功能总是没有效果,于是我就去线上看了一下错误日志,这不看不知道,一看吓一跳,满屏的OutOfMemoryError ,出于隐私保护,这里只展示其中的一点异常信息:
有一个总工厂负责生产各种电视产品,此时来了一个生产小米电视的需求,就会分配出一个制作小米电视的工厂,然后就能用该工厂生产小米电视了。 上面这种通过工厂来实例化类的方式抽象到设计模式中就是工厂方法模式。
最近一段时间整个公司有不少应用上线,上线后慢慢开始暴露一些问题,除去bug之外,一个很值得关注的点就是系统的优化。毕竟优化系统不仅可以使得程序更加稳定,还能节省一些资源的浪费。作为一个技术氛围很不错的公司,很多人会把自己的优化方案发出来和大家一起讨论,只不过没想到这一讨论把公司CEO以及几位P8、P9大佬都给炸出来了。
在平常的编码之中,有一个错误总会在你的意料之外出现,那就是空指针异常。空指针的出现也很简单,你得到了一个null对象,调用了一些方法,出现空指针异常。空指针会出现在各种地方,常见的比如Map.get()没有获取到对象就调用对象例的方法,类对象没有获取到就调用类中的方法。
Spring中的Bean简单来讲就是一个个被Spring容器管理的Java对象,我们写了一个类之后,这个类只是一个单纯的Java类,可以通过new的方式去创建它。当我们把这个类添加到Spring的容器里之后,这个类就变成了Bean,由Spring容器管理,可以通过自动注入的方式去使用。
如何给JVM虚拟机巧妙地设计参数对大部分开发来说一直是个随缘的事情,可能是去网上拷贝一套参数,可能是沿用公司其他应用的参数。但是这个随缘的操作可能就会给未来留下隐患。给JVM分配的内存过大倒是没什么问题,无非浪费点资源,但是如果分配的内存过小,就有可能导致频繁的Full GC,给人一种系统一直很卡的感觉。这篇文章就通过一个实例分析一下如何结合场景设置JVM虚拟机参数。 当然,本文更重要的是希望能通过预估参数的这个过程,让你更加了解虚拟机内部的一些东西,要想最准确的参数设置,用一些工具记录下JVM各个区域的变化会更有效。
首先看一张图:下图是Java虚拟机运行时数据区,JVM的内存模型可以分为方法区、虚拟机栈、本地方法栈、堆和程序计数器。
很多人可能会觉得JVM字节码很神秘,我们写的一行行代码放到底层竟然可以用一串16进制的数字保存。再到计算机底层竟然可以用0和1执行如何复杂的代码。JVM的设计确实十分巧妙,但对我们几乎所有开发者来说,这些底层的内容我们已经不需要再去掌握了,因此今天我们不去讲JVM字节码究竟是怎么设计的,我们通过最简单的方法来快速读懂JVM字节码。
最早写JDBC的时候,要手动配连接信息,要一条条手写sql语句。后来Mybatis出现了,不需要再手动配置连接信息,sql语句也和代码隔离开来,但是还免不了写Sql。接着出现了MybatisPlus,这下连Sql都不用写了。
首先了解一下什么是模板,在工厂中指定某一样工具的时候,会先设计一个模子,然后就根据这个模子制造成各种颜色的工具。虽然制造出来的工具可能样式、颜色都不同,但是基本的样子和模子是一模一样。 抽象到编程中,我们设计一个抽象类模板,指定代码的执行流程,后续子类实现各自的代码逻辑,但是执行流程和抽象父类一样,这种设计模式就是模板方法模式。
最近突然有个想法想造点轮子,平常写的代码业务居多,因此想写点别的。于是就有了造轮子系列。登录认证应该是每个程序员写的第一个功能,至少对我来说是的,于是我的第一个造轮子项目也打算写登录认证,只不过换成了分布式统一认证项目。希望达到的效果是接入的项目可以通过简单的配置快速接入,不用再关注登录认证的事情。
在前面关于ES的一系列文章中,已经介绍了ES的概念、常用操作、JavaAPI以及实际的一个小demo,但是在真实的应用场景中,还有可能会有更高阶的一些用法,今天主要介绍两种相对来说会更难一些的操作,聚合查询。该文档基于ElasticSearch7.6,将介绍restful查询语法以及JavaApi。 阅读本文需要你有ElasticSearch的基础。
现在网络上已经有不少上传jar包至中央仓库的教程,但是我搜了一大圈之后发现当时的做法目前并不适用,因此决定自己写下上传jar包至中央仓库的方式,写这篇文章的时间是2021年8月18日
CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的老年代收集器。CMS是基于标记-清除算法的老年代垃圾回收器,CMS是目前应用最广泛的老年代垃圾回收器。 CMS的使用只需要在JVM的启动参数中增加(-XX:+UseConcMarkSweepGC)参数即可激活使用CMS垃圾收集器。 CMS基于“标记-清除”算法实现,是HotSpot虚拟机的第一款真正意义上的并发收集器,基本上实现了垃圾收集线程与用户线程同时工作。
上面的这段代码通过循环逐一将arr的下标加1,从而实现了遍历数组的功能。 但是通过循环实现遍历的话依赖于集合对象内部,因此就有了一种能顺序访问集合对象中各个元素,又无需依赖对象内部表示的设计模式--迭代器模式。
引用一个最经典的例子,我们自己家里的电压都是220V的,而早期的手机充电时所用的都是5V的电压。要想让手机在220V的家庭电压下充电,就需要一个电源适配器。在编程中,也经常会出现一个类程序无法直接去使用,而需要通过适当变换的行为抽象出来的设计模式就是适配器模式。
Netty是一个异步的,基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。Netty的应用十分广泛,可以说主流的框架中,如果有网络方面的需求,一般用的都是netty框架。比如Dubbo、ES、Zookeeper中都用到了Netty。因此即使在平常工作中没有Netty的使用场景,Netty还是十分值得我们去学习的。
我从工作开始之前开始写博客,写到现在发现以前写的内容在现在看来有了更多想法,因此有了现在的知识重写计划,最主要的目的是维护github上的知识体系,让JavaStarter更加成熟。
以前我做过一个项目,其中有个需求就是每天定时把sql server中的数据同步到Mysql中,当时写了一段Java的代码来实现,一套Java代码中需要写两个数据源的连接以及两套sql的代码,十分不方便。如果还要实现Oracle、Mysql、SqlServer的互相同步,那代码逻辑就更加复杂。而且通过代码的方式,同步600万条数据要花费2个多小时,性能效率十分低下。
在开发中,定时任务是一种十分常见的应用场景,比如每天晚上12点同步数据,又或者每隔一个小时拉取一次数据。 在Java中,实现定时任务的方式有很多,最简单的在线程中通过Thread.sleep睡眠线程,或者采用SpringBoot中的@Schedule注解,又或者采用定时线程池ScheduledExecutorService来实现。
过滤器Filter基于Servlet实现,过滤器的主要应用场景是对字符编码、跨域等问题进行过滤。Servlet的工作原理是拦截配置好的客户端请求,然后对Request和Response进行处理。Filter过滤器随着web应用的启动而启动,只初始化一次。 Filter的使用比较简单,继承Filter 接口,实现对应的init、doFilter以及destroy方法即可。
再牛逼的程序员都写不出完美无缺的代码,作为后端开发工程师,一不小心就会遇到线上故障。如果线上故障处理不及时,就可能导致各种严重的后果。恰好最近部门出现了一次挺严重但幸运的是影响面不大的线上故障,最后在阿里工作十年的leader分享了线上问题的排查思路。结合这次分享,写下了这篇Java线上问题排查攻略。
IO流是Java中比较难理解的一个知识点,但是IO流在实际的开发场景中经常会使用到,比如Dubbo底层就是NIO进行通讯。本文将介绍Java发展过程中出现的三种IO:BIO、NIO以及AIO,重点介绍NIO。
最近发现一件事情,自己写的代码和公司里工作5到10年的前辈写的代码虽然功能一样,但是他们的代码更规范,更优雅。比如有时候我会给一个需求写一个方法,但是有些人就可以好几个需求通过同一个方法实现。因此有了今天这个疑问,怎样才能写出规范的好代码?
String str和new String()有什么区别?这个问题之前在面试中有被问到过一次,当时面试结束后也写了自己关于这个题目的理解,不过最近在看Effect Java的时候发现书中也提到了关于String的用法,刚好就放到一起聊一下。
分库分表故名思意是将一张表拆分成多个表,可能是一个库中的分表,也可能是分库又分表。分库分表主要解决的问题是数据库的性能瓶颈问题。即使建立索引,当数据量超过一定值时,查询效率就注定会降下来。通过分库分表,可以将原本的大数据拆分到多个表或者库中。
在之前的项目中只用到了SpringSecurity,后来发现公司的架构中有Oauth2,虽然自己在业务中没有过接触,但是觉得还是需要去了解一下,因此就有了这篇博客。本博客会从概念和简单的应用出发,讲解Oauth2的理论及实践,不涉及数据库等操作。
在大多数系统中,都需要支持搜索的功能,以简单博客系统为例,虽然说Mysql也可以通过模糊查询匹配到对应的数据,但是效率实在太低。这个时候就需要拿出分布式搜索引擎ElasticSearch了。本博客重点在于ES的集成使用,因此前端采用最简单的方式呈现,大家只需要关注后端逻辑即可。(本博客基于ES7.6.1,和ES6.X版本有较大差异)