- 博客(41)
- 收藏
- 关注
原创 Selenium+Phantomjs做Java爬虫
背景以前,觉得爬虫是不稳定的,而且不被业界允许的,从来没想过会在实际的项目中使用。现在,由于各种突发情况,必须使用爬虫才能完成相应任务。起初,觉得爬虫不过是爬取网页,解析网页就可以了,比较简单,谁知一路心酸泪。查阅各种资料,Java相关的爬虫工具也比较多,由于时间关系,只简单看了下面几种,分析如下: HtmlUnit webmagic ...
2019-09-09 22:37:43 4741 1
原创 Feign表单文件传输遇到的坑
遇坑说明曾经也经常使用Feign进行数据传输,更多的是关注服务熔断和降级的处理。最近参与的一个项目中,有一个发送邮件的功能,本来一切都是那么的简单,最开始的时候,内部写一个工具类调用就可以了,已经成功上线运行。过了一段时间, 邮件里面需要发送附件,后面针对文件都需要做安全扫描,需要调用内部公共扫描接口,由于申请权限过程复杂,流程很长,项目运行过程中不能等待。这时就想着调用已有服务的接口,传输邮...
2019-08-04 14:03:09 4137
原创 springboot2与定时任务的那点事
定时任务,顾名思义就是把任务定在某个时间点去做,可能是一次执行,也可能是循环往复,无论是那种形式,在如今都是非常的简单。在Java中,Executors中的newSingleThreadScheduledExecutor(),以及Timer都可以实现定时功能,但是它们只能实现一些简单的定时任务,如果我们想实现类似cron表达式的复杂定时任务,它们就显得有些力不从心了。SpringBoot针对定...
2019-07-09 22:56:40 428
原创 springboot2与rabbitmq整合
MQ作为消息队列中间件,经常会被我们用到各种环境中,例如:异步处理、削峰、解耦等。RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),轻量、高性能、健壮、可伸缩,是经常被使用的MQ之一。简介在spring中使用rabbitmq,我们可以借助Spring AMQP模块。Spring AMQP包含两部分内容:spring-amqp和spring-ra...
2019-04-27 19:54:47 2077
原创 springboot2与swagger2整合
传统的做法,我们应该会为每个系统准备一份接口文档,方便各个团队之间的交流。但是在微服务快速发展的今天,各个系统之间的交流基本都依赖于接口调用,这样就导致接口变得越来越多,开发人员在开发的同时还要维护文档,任务量加重,哀声一片,也可能会出现开发人员未及时维护文档,使得文档与接口信息不一致。传统做法,在如今是一个不太友好的方式,为了解决上述问题,Swagger出现了。Swagger是一款可以通过注...
2019-04-21 00:45:21 6840 1
原创 springboot2与mongodb整合
MongoDB是一款高性能的分布式文件存储数据库,类似于JSON的存储格式,结构松散,易部署,易扩展,支持索引,简单易用,广泛用于各种类型的系统。MongoDB功能强大,SpringBoot也与之进行集成,下面我们就来看看到底如何使用。项目搭建先来一个demo看看应该如何进行整合使用,再来详细描述其中的细节。由于在工作中,接触较多的就是maven,所以还是采用maven的方式进行项目构建。...
2019-04-13 21:51:36 1109
原创 springboot2与cache-redis整合
缓存,两个字经常出现在我们的耳旁,它被用作数据的高性能读写,防止每次都需要进行数据库的读写,减少性能消耗。Spring从3.1版本开始就提供了cache支持,SpringBoot更是提供了spring-boot-starter-cache用于我们快速进行缓存开发,支持多种缓存组件整合:Redis、EhCache、Hazelcast等。接下来我们就以当前最火的Redis来为大家介绍cache的使用。...
2019-04-08 22:45:37 1457
原创 springboot2与redis整合
Redis,对于大家来说应该不陌生,是经常使用的开发技术之一。原始的RDBMS关系型数据库,能够存储海量的数据,但是在某些特殊的情况下,性能并不是特别的好,例如热点数据的读写,数据缓存等。Redis作为NoSQL中的一员,基于内存数据存储,支持多种数据结构,单线程处理,是一款高性能的可持久化key-value数据库。对于Redis就不做过多介绍了,相信大家或多或少都了解过,下面重点描述Spring...
2019-04-05 15:56:45 4081
原创 springboot2与mybaties整合
在实际项目中,应该很少有不使用数据库的项目吧,目前来看,大部分的公司使用的都是mysql+mybaties做持久化存储。因此,在这里为大家讲解一下springboot与mybaties应该如何整合。以下内容纯属个人见解,若有不对的地方,望大家指正。项目搭建通过第一篇文章,我们已经能够很熟练的搭建springboot项目了,这里,我们就减少项目搭建的步骤,若大家不会搭建,可以返回第一篇文章了...
2019-03-31 22:16:43 426
原创 springboot2入门
还在copy-paste代码吗?还在从另外的项目中拷贝JDBC、Mybaties、Spring等相关的XML配置吗?在使用Spring的时候,大家会发现,想成功布置一个web项目,需要配置许多的XML文件,并且这些步骤是一成不变的,会浪费很多时间在上面,严重影响开发效率。或许公司都有相应的基础架构,只要拷贝过来就可以成功的运行,但也是很繁琐的。为了解决这些重复的操作,简化开发人员的配置,更加关注核...
2019-03-29 23:43:30 453
原创 设计模式之代理模式
本文主要给大家介绍代理模式的定义,用途以及如何实现代理。“代理”一词,相信大家在日常生活中也是经常听到的吧,例如:某个人有多套房子,希望链家帮他出租或者销售出去。又或者某个大明星不想参演某个电视剧,助理帮忙拒绝。这时链家和助理其实就充当的是代理的作用。定义与特点给某一个对象提供一个代理对象,并由代理对象控制对原对象的访问。通俗来讲代理对象就是代替真实对象与其它对象进行交互,由代理对象来调用...
2019-03-19 22:39:28 195
原创 设计模式之单例模式
单例模式是日常开发中经常使用的模式之一,需要大家对它有足够的了解。尽管单例模式理解相对其它模式简单,但是在一些特殊情况下,实现单例模式也需要特别注意。定义用来创建独一无二的,只有一个对象实例的类。在实际项目中,单例模式使用非常频繁,例如:线程池、数据库连接池、缓存、日志对象、Spring默认Bean对象等。在这些情况下,若使用过多实例,可能会导致系统资源使用过量、数据不一致等问题。大家...
2019-03-17 21:56:11 139
原创 设计模式之观察者模式
本文主要为大家介绍观察者模式的定义,特点以及如何实现一个观察者模式。在手动实现观察者模式之后,也会为大家介绍JDK内置观察者模式的使用。定义定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式的特点就是观察者和被观察者是抽象耦合的。被观察者只知道观察者对象实现了公共的接口(Observer),不知道观察者对象具体是谁,更加不...
2019-03-16 23:16:29 159
原创 存储过程
在日常开发过程中,接触到存储过程的机会或许不多,通常只需要关注业务逻辑sql就可以很好的完成工作。但在某些情况下,例如报表、数据分析等,使用存储过程,能够简化一系列的复杂sql,执行速度更快(预编译过),出错率低。综合来看,存储过程是我们应该必须掌握的一个技能。MySQL中存储程序分为存储过程和函数,它们本质上都是存储程序。函数只能通过return来返回结果并且不能使用临时表和某些函数,所以函...
2019-03-11 22:16:37 241
原创 SpringBoot与ActiveMQ整合实现手动ACK
看这篇文章之前,我相信大家已经有过ActiveMQ的基本知识,已经知道JmsTemplete、MessageListenerContainer、Connection、Session、ConnectionFactory等相关知识,在后续的介绍里,还是会简单的进行介绍,以便更好的了解。 项目搭建 和SpringBoot整合之前,我们先导入相关依赖包,如...
2019-03-10 21:20:38 6082 2
原创 Java内存区域
作为Java开发人员,大家都知道内存都是虚拟机自动管理的,我们不需要做任何操作,项目就能正常运行。那么问题来了,我们需要了解Java中内存是如何分配的吗?没错,虚拟机帮助我们管理内存,内存分配以及回收都不用手动操作,但是如果系统出现内存溢出或者是泄漏,我们如何定位是哪一块内存出现的问题呢。因此,了解虚拟机是如何使用内存,是我们前进的必要一步。运行时数据区域的划分在java程序运行过程中,j...
2019-01-27 22:23:17 228
原创 死锁
死锁,多么可怕的一个词,当生产环境出现此问题时,不仅问题难以排查,而且消耗极大的人力。或许大家会说,怎么可能引起死锁,整个项目我都不涉及多线程,你牛逼,走开,哈哈。大家或许想到了,我们可以使用无锁的方式解决啊,可以,无锁确实可以根除死锁问题,但是当业务逻辑复杂,无锁方式难度太大,我们或许会更加偏向于加锁。现在问题来了,有锁就可能产生死锁。定义死锁就是指两个或多个线程执行过程中,相互占用对方...
2019-01-16 23:05:28 206
原创 线程私有:ThreadLocal
不知道大家有没有接触过ThreadLocal这个类,我还清楚的记得,自己当初第一次使用到这个类是缓存用户信息。刚开始学习java时,那个时候并没有想到什么分布式啊,单点登录(SSO),就使用ThreadLocal来保存用户一些全局信息,获取非常方便。那时,我只知道它是线程隔离的,非常好用,渐渐的,当它的身影出现越多的时候,对它的了解也就加深了一点,现在就让我们来领略一下ThreadLocal的魅力...
2019-01-09 23:47:33 526
原创 并发容器(一)—线程安全的Map
相信大家都使用过HashMap、ArrayList等数据结构,在非并发的情况下,它们都能很好的工作,但是一到并发环境,就可能出现各种各样的问题。这是为什么呢?当然,它们是非线程安全的,大家都知道。为什么它们是线程不安全的呢?在并发环境中,我们应该使用什么容器呢?在这里先以HashMap简单介绍。并发下的HashMap在并发环境中,我们来看看使用同一个HashMap会出现什么问题呢?示例如下...
2019-01-06 21:19:37 1711 1
原创 线程池-Executors
在实际项目中,大家或多或少都会遇到多线程设计问题。这是为什么呢?为了尽可能提高系统的吞吐量和性能。创建和使用线程非常简单,这也就导致很多项目在各种任务中频繁的创建线程,虽然与进程相比,线程是一种轻量级工具,但是创建和销毁都需要花费时间,太过于频繁,也会耗尽CPU和内存资源。大量的使用线程,如果导致系统出现OOM,这就违反我们的初衷了。使用线程,我们要有一个度,真实环境中,应该对线程加以控...
2018-12-22 21:18:53 1012
原创 Akka-SpringBoot集成
当我们已经了解Akka的基础知识之后,我们更多的是想知道在实际项目中,我们应该怎样使用起来。按照目前业界使用的技术来看,spring应该占主流,由于spring本身需要太多的配置文件,流程繁杂,这里采用较轻量的springboot来向大家介绍,只是省去诸多配置文件,操作过程都一样。与springboot集成,是因为我们想把ActorSystem、Actor等组件的创建纳入SpringBoot容...
2018-12-16 22:12:56 7065 3
原创 Akka工具(二)—Event Bus
某一天小明:你好,你是报刊工作人员吗?报刊:是的,请问,你有什么需要吗?小明:我想订阅报刊,关于娱乐、经济、社会类的,其它的我不想要,可以吗?报刊:可以的,并且你可以随时取消订阅。小明:好的,谢谢你。祝你工作愉快!通常该过程我们都是在软件上实现的,但是这并不影响我们要说明的内容。实际项目中,业务是复杂多样的,一个业务可能需要依赖另外一个业务,同时也可能取消和该业务的关联,如...
2018-12-01 22:49:55 1777
原创 Akka工具(二)—Future
Future被Akka设计用来处理并发执行结果的数据结构,我们可以通过同步(阻塞)或异步(非阻塞)的方法接受结果。使用Future,我们可以在Actor外部获取某个Actor的消息,在介绍Actor消息发送方式时,我们进行过简单介绍,现在我们先来回忆一下Future的常规用法。 Future消息处理 ask发送消息会返回一个Future对象,通过该对象我们可...
2018-12-01 20:13:03 989
原创 Akka工具(一)—Scheduler
小李:小胖,12月06日是我爸的生日,我怕那一天忘了,应该怎么办啊,你到时能提醒我一下吗?非常感谢。小胖:我也可能忘记啊,你再想想其它办法吧!小李:那怎么办啊,这么重要的日子,我可不能忘记啊。小胖:咦,你不是已经有手机了吗?我听说现在手机有日历功能,有定时提醒功能,可以试试看。小李:对啊,我们要物尽其用啊。五分钟后......小李:好了,我刚刚测试了一下,果然可行,谢谢你啊...
2018-11-24 13:12:23 2063
原创 消息路由
Akka具有分布式、集群、微服务等特点,可以快速构建高可用、高性能的分布式应用。多个Actor之间消息传递,可以使用tell、ask、forward等简单方式,但是当一组Actor需要进行有规律的消息传递时,就显得稍微复杂。Akka路由组件,就是为了解决我们复杂的消息传递,例如广播、轮询、随机等,有两种实现方式:配置和代码创建。 什么是路由 路由就是一...
2018-11-18 21:09:17 2339
原创 邮箱-Mailbox
Actor之间发送消息,并不是直接通过API的方式直接实现,而是依赖于自己的邮箱(mailbox)。这就好比在旧社会中,大家进行信件交流,发件人把自己的信件放到自己的邮箱中,送件人每天早上从你的邮箱中取出信件,在这个过程中,邮箱就起到了中间存储作用,所有的信件都会放在里面。在Actor系统中,邮箱是一个队列结构,默认遵循FIFO,可以根据我们的需要自定义。 Actor...
2018-11-11 22:23:44 11072
原创 线程调度(Dispatcher)
在前面的章节中,我们已经了解到Actor的基本知识点,例如创建方式、生命周期、消息通信、监控、容错。关于actor通信,大家都很熟悉,通过tell和ask就可以实现,但是,现在我想跟大家谈论一下actor的消息是如何进行调度的。 Dispatcher 在Akka中,为了保证消息处理的及时性和线程的使用效率,Dispatcher对线程池做了一些协调工作。简单...
2018-11-03 22:48:38 3904
原创 Actor监控与容错机制
在如今的IT行业中,如果一个系统不具备高可用以及稳定性,那么它迟早会被淘汰的。也许有时出现故障并不是代码本身的问题,网络(连接超时、读超时等)、服务器故障、用户操作有误等原因,也不能影响用户的体验。程序发生故障时,我们要尽可能保证用户体验不受影响,这就需要我们的系统具有良好的容错机制,能保证服务在不可用时自我修复。 监督策略 Actor作为Akka中最基本...
2018-10-05 20:18:38 808
原创 Actor简介(二)
在上一部分,我们已经介绍了actor的基本用法,知道如何创建一个actor。我相信大家肯定不想局限于如此,一定想把actor紧紧的握在手中,掌握它的生死。come on ,来吧! Actor生命周期 线程在运行历程中,会经历创建、准备、等待、阻塞等阶段,这一系列我们称之为生命周期。当然,actor也有它自己的生命历程,比如创建、运行、重启和销毁等。在理想的...
2018-10-04 10:15:51 2246 1
原创 Actor简介(一)
在开发初期,业务单一、系统简单,一台机器或许就能支撑,这个时候,单机上的任务大多直接调用API的方式就能完成。然而当业务需求日益增多,功能逐渐复杂化,我们就需要考虑把项目拆分成分布式环境,这时,多系统通信就需要通过网络实现。JDK内置的并发包在单机上游刃有余,在分布式环境中,就不是那么完美了。Akka通过Actor很好的解决了远程通信问题。 Actor初识 ...
2018-09-26 22:27:52 5511 2
原创 centos7常用命令
一. 系统指令1.uname -a查看系统版本2.more /etc/*release 查看更多信息3.cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 查看cpu核数4.cat /proc/cpuinfo 查看cpu详细信息5.hostname 查看计算机名6.env 查看环境变量7.uptime 查看系统运行...
2018-09-25 22:07:02 271
原创 初识Akka
单机系统,我们使用JAVA API中的Executor、Fork/Join(分而治之)等,就能很好的解决的多线程并发问题,但在分布式集群项目中,它们或许并没有那么完美。 背景 当今社会,人们在享受互联网带来便利的同时,对产品的要求越来越高,响应快、稳定性好。为了达到用户的要求,产品开发或维护阶段,服务化、分布式、并行计算成为开发人员面临的难题。 ...
2018-09-16 22:38:00 494
原创 elk(elasticsearch+logstash+kibana)安装入坑
关于日志,大家应该都有所了解,日志的作用是为了排查问题,尤其是突发的问题,或者提供监控报警功能。传统的日志监控,都是在生产机上通过命令grep或less等命令查询日志文件,当服务器集群,数量多的时候,传统方式效率低下,无法及时确定问题,难以监控。最近公司打算优化日志监控,查阅大量资源,发现了一款开源日志系统-elasticsearch+logstash+kibana。下面大致介绍一下elk的三...
2018-09-02 12:10:51 665
原创 线程间通信
在日常开发中,多线程之间通常会进行相互协作完成任务。为了支持线程间通信,JDK提供了很多很有趣的方法,其中很普遍的就是等待/通知机制。JDK中使用等待wait()方法和通知notify()/notifyAll()实现,这两个方法不是线程内部所有,而是属于Object。等待/通知机制—第一种方式:public final void wait() throws InterruptedExcep...
2018-08-22 22:30:30 151
原创 Lock的学习与使用
多线程是复杂的,为了使开发者写出简单、安全的并发程序,JDK提供了大量的API和框架。在上一节,大家已经认识了线程间同步的一个重要手段sychronized,现在,我们来学习一下JDK1.5新增的线程同步工具类Lock。Lock不仅具有sychronized的所有特性,在它的基础上,增加了许多其它的功能,相较于sychronized,Lock更加灵活。当然,我们不是说sychroni...
2018-07-29 23:08:20 521
原创 浅谈线程安全与sychronized
使用多线程处理相关业务,在一定程度上能够获得更高的执行效率,提高程序性能,但是,如果我们在写多线程程序时,不加强注意,容易出现数据不一致性,也就是我们常说的 "线程安全" 问题。线程安全是我们在设计多线程程序时必须保证的一点,如果我们写出的程序数据正确性不能得到保证,即使程序性能得到提高,也是毫无意义的。非线程安全在什么时候会出现呢?当多个线程对同一对象实例进行并发访问时,可能得到错误的结...
2018-07-22 23:25:46 235
原创 线程是什么
在介绍线程之前,我们就不得不想到一个词 "进程"。关于进程,我相信大家都有所了解。经常在面试的时候,面试官或多或少都会问到进程与线程的区别。 下面,我们就来了解"进程"这个概念: 引用百度百科上的介绍:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。大家或许不是很理解这句...
2018-07-21 22:29:00 1975
原创 JAVA内存模型—JMM
在今天和明天之间,有一段很长的时间;趁你还有精神的时候,学习迅速地办事。 —— 歌德 在介绍java内存模型之前,先提出一个问题,如何保证一个线程看到的数据是正确的?大家可能认为这个问题很没有意思,很简单,在一个线程里,程序都是串行化执行的,你读取到的数据肯定是正确的。现在,我们讨论的是多线程,在多线程里,数据的一致性就变得比较复杂了。 JAVA虚拟机规范定义了一...
2018-07-09 22:24:53 144
原创 阻塞和非阻塞
在介绍阻塞和非阻塞之前,我们先来了解一下多线程间一个重要的概念——临界区。临界区——一种公有的资源或者共享数据,它可以被多个线程使用。临界区资源一次只能被一个线程使用,其它线程必须等待上一个线程执行完成之后,才能使用。临界区资源是多线程之间重要保护对象,当临界区资源同时被多个线程访问时,容易出现错误。代码示例:/** * @author php * @date 2018/7/2 */pub...
2018-07-02 23:10:16 11320 6
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人