自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

rhwayfun专栏

在等待的日子里,刻苦读书,谦卑做人,养得深根,日后才能枝叶茂盛!公众号:技术视点

  • 博客(239)
  • 收藏
  • 关注

原创 Spring Boot学习案例开源项目

为了更好的学习并使用springboot进行开发,维护了一个springboot学习案例开源项目,涉及springboot从基础开发到企业实战,涵盖不同场景的开发案例。公司内部所有的服务都基于springboot进行开发以完成服务化。下面是本开源项目的部分截图:涉及的内容包括但不限于:web开发数据库mybatis使用(含多数据源配置)缓存框架使用(caffeine、ehcache、redis

2017-09-10 23:50:38 20682 9

原创 写在2019年后的蚂蚁、头条、拼多多的面试总结

写在2019年后的蚂蚁、头条、拼多多的面试总结原文:https://github.com/rhwayfun/interview不想听我BB直接进入面试分享:准备过程蚂蚁金服面试分享拼多多面试分享字节跳动面试分享总结说起来开始进行面试是年前倒数第二周,上午9点,我还在去公司的公交上,突然收到蚂蚁的面试电话,其实算不上真正的面试。面试官只是和我聊了下他们在做的事情(主要是做双十一这...

2019-03-25 10:25:22 7900 3

原创 体系化认识微服务之四:服务注册发现机制

服务调用者要在众多的微服务中调用具体的服务提供者,必然涉及到负载均衡的问题,根据负载均衡的实现可以分为集中式LB、进程内LB和独立进程LB。集中式LBLB上有所有的服务地址配置,当服务消费者调用某个服务的时候,LB会根据负载均衡策略(随机、轮询等)将请求转发到具体的服务上。此外,服务调用者还需要知道LB的地址,通常的做法是运维在服务器上配置一个DNS域名或者IP,这个域名指向LB。...

2018-06-02 14:49:14 2419

原创 体系化认识微服务之三:微服务总体技术架构

体系化认识微服务之三:微服务总体技术架构这篇文章,介绍下微服务的总体架构体系,微服务拆分后涉及的服务众多,我们从一个全局的视角看下微服务架构涉及哪些方面。从上层到下层依次分为:接入层、网关、业务服务层、支撑服务层、平台服务层、基础设施层 技术构架总览:接入层接入层是入口,比如支付宝,接入层包括手机APP、Web、H5,是流量的入口,负责把外部的流量接入到系统的内部。网关...

2018-05-20 13:07:28 4549

原创 体系化认识微服务之二:如何实施微服务架构

微服务作为一种架构风格,其主要特点是由很多小的服务组成,且每个服务都是可独立部署的,任何 一个服务的升级部署都不会影响其他的服务。那么在企业中如何实施 微服务这种架构呢?按业务组织团队康威法则:设计系统的组织,其产生的架构设计等价于族之间的沟通架构。 在以往传统的软件架构中,所有的功能都是在一个单体系统中完成的,每个团队都可以在上面修改代码,开发测试部署也比较方面。但是随着业务的扩展...

2018-05-12 17:07:04 1100

原创 体系化认识微服务之一:什么是微服务

什么是微服务微服务作为一种架构风格,是从单体应用演化过来的。微服务真正让大家关注源于Martin·Fowler的一篇博客Microservices,文章对微服务定义如下: In short, the microservice architectural style is an approach to developing a single application as a suite ...

2018-05-06 13:34:32 1613

原创 MySQL规范整理

基础规范版本MySQL 5.7存储引擎InnoDB字符集utf8必要时候使用utf8mb4(1)utf8通用,无乱码风险,汉字3字节,英文1字节(2)utf8mb4是utf8的超集,有存储4字节例如表情符号时,使用它禁用存储过程、触发器、视图、Event能在服务端计算的就不要把压力放在数据库禁止存储大文件对象...

2018-04-06 21:48:01 1201

原创 重构:从方法论到实践

重构:从方法论到实践最近部门内部组织了一次大型重构,刚好借着这个机会学习了重构相关的内容,重构可以说代码优化利器,可以很好改善代码结构和开发效率。个人觉得重构应该是随时进行的,开发阶段、测试阶段、上线后,任何时候你觉得代码写得不够好或者有bug都应该重构。什么是重构通俗讲就是不影响外界访问的前提下,修改代码的行为。这里的修改代码包括重新设计(业务设计和技术设计)和代码结构的调整。...

2018-03-17 15:43:33 3107

原创 程序员练级:究上究下(持续更新中)

究上:学习优秀的设计和思路看源码:jdk 8、spring、mybatis、dubbo、rocketmq jdk 8:Map(HashMap/ConcurrentHashMap)、Collection(ArrayList/LinkedList/BlockingQueue)spring:bean生命周期、依赖注入、AOP实现(动态 VS 静态)、MVC、事务、springbootmyba...

2018-03-01 09:18:19 1161

原创 回顾2017:谈谈过去一年的成长

2017过去了,回顾2017希望能够看清楚现在的自己,在2018遇见更好的自己。前不久支付宝的年度账单刷屏朋友圈,作为一名程序员,我也来晒晒我的2017年度技术“账单”。2017年度成长“账单”Github:89 stars, 37 forks spring-boot-learning-examples: 62 stars, 27 forks java-skill-gra

2018-01-07 22:54:09 6252 5

原创 使用Spring Boot Starter开发RocketMQ

RocketMQ最早是阿里巴巴开源的MQ中间件,在阿里集团被广泛应用在订单,交易,充值,流计算,消息推送,日志流式处理,binglog分发等场景。现已捐献给Apache,目前是Apache下的顶级项目。捐献后的最新版本是4.1.0-incubating。在实际场景中使用MQ打交道最多的是发送消息和消费消息。RocketMQ支持广播消费和集群消费,广播消费是指每隔consumer实例都会收到消息,一条

2017-12-24 13:23:39 16861 2

原创 Dubbo Hessian2序列化问题

问题定义了一个接口,返回值为Map<String, Byte>,consumer收到结果后,使用Byte value = map.get(key)获取结果,抛出了如下类型转换异常: 如下:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Byte at sun.reflect.Native

2017-12-22 17:35:00 8765

原创 Sharding-JDBC读写分离探秘

前段时间写了篇如何使用Sharding-JDBC进行分库分表的例子,相信能够感受到Sharding-JDBC的强大了,而且使用配置都非常干净。官方支持的功能还包括读写分离、分布式主键、强制路由等。这里再介绍下如何在分库分表的基础上集成读写分离的功能。读写分离的概念 就是为了缓解数据库压力,将写入和读取操作分离为不同数据源,写库称为主库,读库称为从库,一主库可配置多从库。设置主从库后,第一个问题

2017-11-19 19:10:28 10004 3

原创 Sharding-JDBC分库分表使用实例

Sharding-JDBC是当当开源的用于分库分表的基础类库。定位轻量级java框架,可以通过客户端直接连接数据库,只需要在增加额外的数据源配置就可以轻松实现完整的分库分表功能。 Sharding-JDBC是一个开源的适用于微服务的分布式数据访问基础类库,它始终以云原生的基础开发套件为目标。目前Sharding-JDBC已经实现的功能包括(最新稳定版本为2.0.0.M1):分库分表读写分离

2017-10-28 12:33:48 11723 3

原创 【开源】大型网站架构技能图谱

之前在博客发布了一份大型网站架构技能图谱,陆陆续续有小伙伴希望有一份xmind源文件,我打算把这个图谱作为开源项目维护,有利于统一维护,同时也希望能够与大家相互提高。目前的想法是把源文件放在Github,同时把图片形式作为一个链接可以直接查看。目前已经维护在GitHub,java-skill-graph,欢迎Star和讨论。大家有什么更好的想法尽快提出来吧,让我们一起把这个项目维护起来(^o^)/~

2017-10-12 23:33:33 1308

翻译 【译】Scheduling Tasks

原文:Scheduling Tasks开始使用定时任务本指南将一步步引导您如何在Spring中使用定时任务。完成什么构建一个应用,实现的功能为每5秒打印出当前时间。这点可以通过Spring注解@Scheduled完成。准备什么大约需要15分钟一个您喜爱的文本编辑器或者IDE(集成开发工具)JDK 1.8或更高版本Gradle 2.3+ 或者 Maven 3.0+您也可以直接导入代码到ID

2017-10-11 21:32:13 814

原创 Spring bean id相同引发的故障

最近因为同事bean配置的问题导致生产环境往错误的redis实例写入大量的数据,差点搞挂redis。经过快速的问题定位,发现是同事新增一个redis配置文件,并且配置的RedisSentinelConfiguration的id是一样的,然后在使用@Autowired注入bean的时候因为spring bean覆盖的机制导致读取的redis配置不是原来的。总结起来,有两点问题:为什么相同bean i

2017-09-23 23:02:40 6296 1

原创 重试框架Spring retry实践

spring retry是从spring batch独立出来的一个能功能,主要实现了重试和熔断。对于重试室友场景限制的,不是什么场景都适合重试,比如参数校验不合法、写操作等(要考虑写是否幂等)都不适合重试。远程调用超时、网络突然中断可以重试。在微服务治理框架中,通常都有自己的重试与超时配置,比如dubbo可以设置retries=1,timeout=500调用失败只重试1次,超过500ms调用仍未返回

2017-09-03 17:16:19 41799 4

原创 Spring Security实战

spring security是一个多方面的安全认证框架,提供了基于JavaEE规范的完整的安全认证解决方案。并且可以很好与目前主流的认证框架(如CAS,中央授权系统)集成。使用spring security的初衷是解决不同用户登录不同应用程序的权限问题,说到权限包括两部分:认证和授权。认证是告诉系统你是谁,授权是指知道你是谁后是否有权限访问系统(授权后一般会在服务端创建一个token,之后用这个t

2017-08-20 13:19:00 3454 1

原创 Spring定时任务源码分析

之前在深入浅出spring task详细介绍了spring task的用法与使用示例,这篇文章更近一步,我们从源码的角度看看内部的实现机制。之所以写这篇文章是因为最近因为spring task的误用引发了一次线上的故障。本着一探究竟的精神,源码撸起。先还原下spring task是如何误用的,示例代码如下:package com.rhwayfun.springboot.task;import or

2017-08-13 00:21:33 5293 1

原创 Kafka术语解释

前一篇文章介绍了如何使用kafka收发消息,但是对于kafka的核心概念并没有详细介绍,这里将会对包括kafka基本架构以及消费者、生产者API涉及的术语进行说明。了解这些术语有助于更深入理解kafka。brokertopicstreampartitionoffsetproducerconsumerconsumer group

2017-07-31 23:04:50 2822

原创 Kafka消费者生产者实例

为了更为直观展示Kafka的消息生产消费的过程,我会从基于Console和基于Application两个方面介绍使用实例。Kafka是一个分布式流处理平台,具体来说有三层含义:它允许发布和订阅记录流,类似于消息队列或企业消息传递系统。它可以容错的方式存储记录流。它可以处理记录发生时的流。由于主要介绍如何使用Kafka快速构建生产者消费者实例,所以不会涉及Kafka内部的原理。一个基于Kafk

2017-07-30 18:22:56 29805 2

原创 Hibernate Validator参数校验

日常开发中经常会遇到需要参数校验的情况,比如某个字段不能为空、长度不能超过5等都属于参数校验的范围。对于简单的参数校验通过写几个if-else判断语句就搞定,但是对于复杂的多个参数校验的情况,就不是那么简单了,通常是各种循环嵌套+一堆if-else语句。一个字,丑!所以,这就需要引进本文的主人公——Hibernate Validator(下文简称hb)。顾名思义,这是出自ORM框架Hibernate

2017-07-29 19:37:48 3539

原创 redis事务浅析

事务可以简单理解为:把多件事当做一件事情处理,要么一起成功,要么一起失败。在Spring中可以配置一个事务管理器,然后在要进行事务处理的方法上添加@Transactional注解就可以了。对于redis事务,无外乎如此,有时候为了同时处理多个结构,会向redis发送多个redis命令。使用redis事务可以保证一个客户端在不被其他客户端打断的情况下执行多个redis命令。对于redis事务,我会从以

2017-07-23 12:16:42 2256

原创 缓存前置实践

说到缓存,可能最熟悉的是缓存的使用和更新策略。使用缓存的好处很多,可以提高响应速度,减轻数据库等存储的读写压力。关键是变“快”了。使用缓存有很多注意的地方,比如何时使用缓存,什么数据适合缓存,缓存什么时候失效。缓存是提高程序性能的“银弹”,不过这里不是将如何使用缓存,而是介绍缓存前置的思路和一些实践。缓存前置这里的缓存指的是应用缓存,或者说本地缓存,那么缓存前置就是指服务端的本地缓存转移到客户端,这

2017-07-09 20:32:14 2432

原创 Disconf实践指南:改造篇

上一篇文章Disconf实践指南:使用篇介绍了如何在项目中应用disconf,虽然实现了分布式配置的实时刷新,但是我们希望能够去除所有的配置文件,把配置都交给disconf管理,本地只需要实现配置监听接口就好了。改造包括: 统一配置到disconf 自定义配置解析实现 公共配置 #实现ing1、统一配置到disconf 主要是应用各个环境的配置信息,比如当前应用的配置信息appl

2017-06-18 13:50:07 3026

原创 Disconf实践指南:使用篇

在上一篇文章Disconf实践指南:安装篇介绍了如何在本地搭建Disconf环境,下面我们介绍如何在项目中使用Disconf。由于某些功能特性对源码做了修改,所以在官方文档并没有提及。 环境基于macOS Sirerra。Windows建议安装Linux虚拟机首先打开disconf控制台:http://localhost:8091,第一步:创建应用,awesome-project(自定);第二

2017-06-18 11:10:39 19573 5

原创 Disconf实践指南:安装篇

Disconf是百度开源出来的一款基于Zookeeper的分布式配置管理软件。目前很多公司都在使用,包括滴滴、百度、网易、顺丰等公司。通过简单的界面操作就可以动态修改配置属性,还是很方便的。使用Disconf后发现的一大好处是省却应用很多配置,而且配置可以自动load,实时生效。Disconf优点总结如下: 部署简单:同一个上线包,无须改动配置,即可在多个环境中上线 部署动态化:更改配

2017-06-17 23:50:35 8268 8

原创 缺少Log4j依赖导致应用启动失败的教训

最近,公司在做版本升级,所有对aaa(指代某个内部依赖)有依赖的应用需要排除掉。从这点看,几乎不会有什么问题,因为仅仅是排除一些maven依赖而已嘛。但是,一位同学在排除依赖的时候,仅仅是把aaa排除了,而没有在测试环境进行测试,在线上发布的时候,日志报dubbo服务注册失败(抛异常和dubbo admin没有看到注册的服务),导致应用启动失败(回滚后正常),影响正常业务5分钟。事后排查这个问题的时

2017-04-03 10:51:57 3912 3

原创 AspectJ切面执行两次原因分析

背景 转眼之间,发现博客已经将近半年没更新了,甚是惭愧。话不多说,正如标题所言,最近在使用AspectJ的时候,发现拦截器(AOP切面)执行了两次了。我们知道,AspectJ是AOP的一种解决方案,本质上是通过代理类在目标方法执行通知(Advice),然后由代理类再去调用目标方法。所以,从这点讲,拦截器应该只会执行一次。但是在测试的时候发现拦截器执行了两次。问题重现 既然问题已经明了,那么可以通

2017-03-19 16:01:06 10615 3

原创 深入浅出Spring task定时任务

深入浅出Spring task定时任务在工作中有用到spring task作为定时任务的处理,spring通过接口TaskExecutor和TaskScheduler这两个接口的方式为异步定时任务提供了一种抽象。这就意味着spring容许你使用其他的定时任务框架,当然spring自身也提供了一种定时任务的实现:spring task。spring task支持线程池,可以高效处理许多不同的定时任务。

2016-09-12 21:03:40 69507 15

原创 大型网站架构技能图谱(Java版)

在大型网站技术架构中,涉及到许多的技术,这些技术是具备大型网站架构设计能力的前提和基础。因为笔者对Java比较熟悉,所以下面的技术图谱都是围绕Java后端工程师展开的。如有不正确或者不完善的地方,欢迎补充。...

2016-09-05 19:37:46 14909 43

原创 大型网站架构演变史(含技术栈与价值观)

这篇文章是参考李智慧的《大型网站技术架构:核心原理与案例分析》和现蘑菇街CTO曽宪杰的《大型网站系统与Java中间件实践》写的一篇读书笔记。前言何谓大型网站?大型网站的特点是什么?大型网站架构发生演变的源动力是什么?大型网站的架构演变经历了哪些阶段?在演变的某个具体阶段使用到常用技术有哪些,为什么要使用这些技术,同时这些技术又解决了什么问题?笔者在初次接触大型网站时思考了以上几个问题,本着缘木求鱼的

2016-09-03 21:25:04 6885 4

原创 Ehcache缓存入门实战(附源码)

Ehcache缓存入门实战(附源码)Ehcache是一个强大、成熟的Java缓存框架,可以非常容易与其他库和框架集成。官网声称Ehcache可以作为TB级别的数据缓存,并且具有高扩展性。目前Ehcache的最新版本是3.1。本文不会深究缓存背后的原理,只是作为一个使用Ehcache的例子,由于最近需要做一个类似二级缓存的功能,特地学习了下Ehcache。发现Ehcache作为一个本地缓存框架使用还是

2016-08-11 16:49:45 5274 2

原创 Google Protocol Buffer序列化入门实战(附源码)

Google Protocol Buffer入门实战(附源码)Google Protocol Buffer(后面简称PB)是Google开源的一款二进制序列化工具,占用空间小,传输效率高。最近由于项目中使用到了PB,所以特地学习了PB,这篇文章也是自己学习PB的一些小结。根据官方定义,PB是一个语言中立,平台中立的,用于序列化结构化数据的协议。说到序列化,可能大家最容易想到的是JDK自带的序列化协议

2016-08-09 15:38:17 3862 4

原创 Zookeeper入门实战(注册中心)

Zookeeper入门实战(注册中心)Zookeeper是一个高性能的分布式协调服务,根据官方对Zookeeper(以后简称zk)的介绍,zk主要支持以下特性:管理配置信息,可以作为管理配置信息的中央服务器命名服务分布式锁分组服务,也就是leader选举在之前Dubbo分布式服务框架入门实战(附源码)这篇文章中,使用了zk作为服务注册中心了,由于zk能够及时将新注册的服务主动推送给消费者,

2016-08-09 12:05:04 6929

原创 Redis入门实战(附源码)

Redis入门实战(附源码)近期由于需要对Redis进行改造,所以顺便学习了下Redis。这篇文章是自己学习Redis写的小实例,简单易懂,超适合入门。 在网上看了很多Redis的入门文章,要么写的太深入,要么写的Level太高。总之,没有找到真正适合初学者的Redis入门文章。在此之前,对Redis有必要清楚以下问题:Redis是什么?Redis解决了什么问题?Redis的优势?如何

2016-08-08 19:19:23 7176

原创 Dubbo分布式服务框架入门实战(附源码)

Dubbo分布式服务框架入门实战首先,有必要清楚Dubbo是什么。官方文档的定义如下: DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。其实,总结起来就是: Dubbo是一个解决大规模服务治理的高性能分布式

2016-08-05 17:49:32 9189 4

原创 支付宝Sofa框架简明笔记

Sofa框架概述SOFA是Service Oriented Fabric Architecture是一种分布式架构解决方案,是一个应用中间件,包含了RPC、消息、监控和服务治理。开发框架的组成 一个标准的sofa工程从上到下可以分为测试层、展现层、业务层、核心领域层和通用层,并且从测试层到通用层是层级依赖的。一般来说,如果下层模块依赖了上层模块的代码,那么就会出现循环依赖,导致工程报错。在通用层,又

2016-07-28 20:20:12 37124 3

转载 如何在三个月内获得三年的工作经验

只要方法正确,3个月能做的事很多,并且,最重要的是:不仅要学,而且要习,那样才能真正有用。很多职场新人都谈到了工作经验的问题,似乎招聘公司不给你机会,你就没办法获得必要的工作经验,其实并不一定。很多资料在网上都是可以找到的,只是看你具备不具备足够的信息收集与处理能力,而这个收集与处理信息的过程,也能极大的提升你的职业能力。   我一直有个感觉,在“模仿中成长,在创新中成功”,其实在真正的职业工作中,

2016-07-11 19:26:18 3636

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除