自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

海锋博客

大量文档在有道笔记,有时间即会更新发帖

  • 博客(64)
  • 资源 (1)
  • 收藏
  • 关注

原创 SpringCloudGateway中ratelimiter源码分析

本章概要前言正文Redis分布式限流的核心组件如何配置路由如何处理请求如何刷新路由配置总结前言在SpringCloudGateway中官方默认提供了基于Redis的分布式限流方案,对于大部分的场景开箱即用。但实际应用场景下,针对不同的业务场景可能需要进行定制化扩展,此时很有必要了解其工作原理,从而更加快速有效的实现自定义扩展。正文此部分将通过3个层面逐步展开:Redis分布式限流的核心...

2019-06-22 23:37:21 5207 1

原创 Feign集成Hystrix源码分析以及扩展

前言在《Hystrix源码浅析》中分析过request cache的相关源码实现,而在Feign中集成了Ribbon与Hystrix两个重要组件,但很遗憾其默认设计中并没有对hystrix request cache的实现。故而本章节将从源码出发,了解Feign是如何集成Hystrix组件的,以便后续我们扩展Hystrix在Feign中的应用。正文部分将分为4个阶段分析,为何是4个阶段呢,看了就明...

2018-05-28 23:00:13 3883 1

原创 Hystrix源码浅析

前言最近在项目中需要使用Hystrix的request cache来提升服务的稳定性与高性能,其对于单个request请求,能够对指定方法methodA的返回值进行缓存,在多次调用methodA方法时仅会执行方法体一次,从而降低本次请求的复杂度。如果在methodA中存在对下游服务的依赖,则同步能够提高下游服务的稳定性,一定程度降低其并发性要求。Cache中的数据会存在更新,Hystrix同步提供...

2018-05-17 00:42:26 2484

原创 Hystrix实现ThreadLocal上下文的传递

前言Hystrix提供了基于信号量和线程两种隔离模式,通过在Hystrix基础章节中已经验证过,通过@HystrixCommand注解的方法体将在新的线程中执行,这样会带来些什么意想不到的意外呢,先来看一个示例:1、定义一个webapi,通过RequestContextHolder设定一个当前线程的上下文:@GetMapping(value = "/getServerInfo/{serviceNa...

2018-05-17 00:23:58 8876 5

原创 Consul小贴士-记一次Consul注册failing状态跟踪

前言最近抽了点时间基于最新的Consul1.0.2构建了集群,替换了原来的0.9.2服务。结果在启动基于SpringCloud D版的服务时所有节点的health状态均为DOWN,瞬间一切都不好了,本章记录如何进行坑点的排查并解决的过程,提供一个源码阅读的思路。本章概要1、场景描述;2、源码分析;场景1、首先看到如下config-server服务处于failing状态:2、通过其health端点即...

2018-04-23 16:40:52 2832

原创 基于IDEA构建Spark应用并部署

前言本章将介绍如何通过IDEA构建Spark应用,并最终部署。构建应用Java应用1、新建一个maven项目,并在POM中添加如下依赖:<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8&lt...

2018-03-15 23:03:47 996

原创 Win10安装使用Hadoop3.0.0

本章将一步一步在win10下安装Hadoop3.0.0,并启动服务进行简单的hdfs操作。准备工作1、Hadoop官方下载地址:http://hadoop.apache.org/releases.html选择最新的3.0.0版本后跳转至下面的页面选择红色框部分链接即可下载,建议采用专业的下载工具下载,速度更快2、将tar.gz包解压至D盘根目录:Note:必须用管理员权限解压3、配置环境变量:添加...

2018-03-15 22:45:48 39294 32

原创 Stable与PreSale版本同时在线的一些思考

最近部门在讨论代码流程管理,无论是采用标准的gitflow还是github的分支模型都无法规避一个话题,如何同步实现Stable和PreSale兼容的事宜,目前将采用fork项目、双主分支同步开发的双模式方案尝试,但仔细思考,以上两种方式在研发过程有一个共性,均需要我们类似的维护多项目,但又需要指定里程碑的MR操作。先不去想是否是最合适的,但有一种可能大家都不是那么在意的傻瓜方式,通过版本(开关)...

2018-03-11 22:04:15 453

原创 Spark在Win10下的环境搭建

前言本章将介绍如何在WIN10下实现spark环境搭建。本章概要1、版本说明2、环境准备:jdk配置;scala安装与配置;spark安装与配置;hadoop安装与配置;版本说明jdk:1.8scala:2.11.8spark:2.3.0hadoop:2.8.3环境准备jdk配置1、配置JAVA_HOME与Path:Path2、验证配置:scala安装与配置1、scala下载:访问官方地址http...

2018-03-08 10:15:06 38860 31

原创 Spring-Retry应用

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

2018-03-05 01:22:04 2868

原创 Guava-Retry实践

前言在实际业务中,有非常多场景需要我们进行重试操作,编码中通过采用各种回调的方式来抽象重试的实现,但都不是那么理想。通过简单的调研,目前主要有Guava-Retry和Spring-Retry作为三方库比较流行,本章节将介绍Guava-Retry的实际应用。Guave在github地址(https://github.com/rholder/guava-retrying),可以看到其已经有很长一段时间...

2018-03-04 22:09:49 8430 1

原创 Stream进阶篇-KafkaBinder与RabbitBinder共存应用

前言在《Stream基础篇-Stream入门应用》中已经介绍过,Spring Cloud Stream预定义实现了Kafka、RabbitMQ两个消息中间件的绑定器Binnder,在大部分业务场景下,可能都只需要使用一个类型的Binder即可满足业务需求。但我们无法排除在多个业务系统复杂应用的场景下,可能需要同时连接Kafka和RabbitMQ,本章将介绍如何在单个应用内,实现KafkaBin

2018-02-07 01:35:55 3775

原创 Stream进阶篇-动态绑定消息通道

前言在之前的章节中,所有消费者和生产者均通过@EnableBinding定义,此方式能够快速的构建生产消费关系,但仔细想想,如果我们需要根据一定的条件决策消息生产者将消息发往哪个通道,貌似当前简单粗暴的方式无法满足。如此常见的场景,springcloud必然会帮我们想到,通过BinderAwareChannelResolver的bean实例即可实现动态通道的选择,其会伴随@EnableBind

2018-02-06 23:11:50 10981

原创 Stream进阶篇-消息分区实现验证&源码简析

前言在《消费组实现验证》章节,已经介绍了如何通过消费组避免单个消息被多个实例重复消费。但还有一些场景需要满足,同一个特征的数据被同一个实例消费,比如同一个id的传感器监测数据必须被同一个实例统计计算分析,否则可能无法获取全部的数据。又比如部分异步任务,首次请求启动task,二次请求取消task,此场景就必须保证两次请求至同一实例。本章将介绍如何通过消息分区实现上述场景应用。本章概要

2018-02-06 02:12:39 2335 5

原创 Stream进阶篇-消费组实现验证

前言通常在生产环境,我们的每个服务都不会以单节点的方式运行在生产环境,当同一个服务启动多个实例的时候,这些实例都会绑定到同一个消息通道的目标主题(Topic)上。默认情况下,当生产者发出一条消息到绑定通道上,这条消息会产生多个副本被每个消费者实例接收和处理,但是有些业务场景之下,我们希望生产者产生的消息只被其中一个实例消费,这个时候我们需要为这些消费者设置消费组来实现这样的功能,实现的方式

2018-02-05 21:39:27 4013 5

原创 Stream进阶篇-StreamListener实现多个方法调度

前言在《Stream进阶篇-实体对象数据的生产消费与转换》章节,已经展示了如何获取header信息,本小节将更加具体的展示其特性,并结合@StreamListener注解的condition参数实现多个监听者方法的选择调度。场景描述:如上图,sender服务发送消息至user-channel通道,如果头信息中flag值为aa则被StreamListener1接收;如果flag值为bb则被Strea...

2018-02-05 21:24:07 26296 3

原创 Stream进阶篇-实体对象数据的生产消费与转换

前言在各微服务通信中,主要以json字符串作为内容载体,在实际业务中,通常会自定义实体亦或是构造Map、List等数据作为生产消费对象,SpringBoot通过对MessageConvertor的实现,已经很好的协助我们完成了Json与对象的转换过程,在MVC的REST-API部分已经被充分应用。那么在Stream中呢,是否还需要我们每次硬编码实现呢,答案是否定的。本章节将实现验证Stream

2018-02-05 21:11:43 6462

原创 Stream基础篇-Stream入门应用

Spring Cloud Stream是什么?Spring Cloud Stream是一个用来为微服务应用构建消息驱动能力的框架。它可以基于Spring Boot来创建独立的、可用于生产的Spring应用程序。它通过使用Spring Integration来连接消息代理中间件以实现消息事件驱动的微服务应用。简单的说,Spring Cloud Stream本质上就是整合了Spring Boo

2018-02-04 16:17:40 10157 5

原创 Mono入门应用

前言Flux 和 Mono 是 Reactor 中的两个基本概念。Flux 表示的是包含 0 到 N 个元素的异步序列。在该序列中可以包含三种不同类型的消息通知:正常的包含元素的消息、序列结束的消息和序列出错的消息。当消息通知产生时,订阅者中对应的方法onNext(), onComplete()和 onError()会被调用。Mono 表示的是包含 0 或者 1 个元素的异步序列。该序列中

2018-02-03 17:35:38 65604 4

原创 Consul常用端点介绍

前言Consul提供的REST API可以通过访问官方网站(https://www.consul.io/api/agent.html)查看最新最详细的说明,可以用来增删查改nodes、services、checks、configguration。本章节仅仅介绍最常用的一些端点。本章概要1、端点分类;2、分类说明;端点分类所有的endpoints主要分为以

2018-02-02 22:26:27 1084

原创 Zinkin进阶篇-Zipkin-dependencies的应用

前言之前章节中已经实现了zipkin数据持久化至elasticsearch,但其带来了一个负面作用,无法正常显示dependencies。通过阅读zipkin在github说明,可以看到已经有了解决方案,本章将介绍如何实现并验证。本章概要1、寻找解决方案;2、方案验证;寻找解决方案1、通过阅读Zipkin在Github(https://github.com/

2018-01-30 13:51:38 12855 11

原创 Consul-Template&Nginx实现Consul集群高可用

前言在《构建Consul集群》章节中介绍了如何实现consul集群的构建,通过对consul的进一步了解,其并没有提供的对cluster直接操作的client-api,故需要针对Consul集群构建一个统一入口,但这个并不需要我们过多的担心,Consul的小伙伴Consul-Template正是为此而生,通过Nginx+ConsulTemplate能够非常方便的实现,本章将来介绍如何配置应用并

2018-01-19 23:50:54 8064 3

原创 Feign小贴士-MultipartFile与RequestBoby的共存BUG修复

前言 在Zuul章节介绍过如何通过Feign实现文件的上传,但当时留下一个大大的BUG,通过feign-form实现文件上传,会导致无法解码@Requestboby中传递的Map、User等等对象,会造成500错误,鉴于此在feign-form项目中提了一个Issue(https://github.com/OpenFeign/feign-form/issues/19)很开心作者在3个多月后给出

2018-01-19 23:23:06 10444

原创 1、Eureka实现服务注册与发现

有道迁移样式不够友好,故提供链接如下;http://note.youdao.com/noteshare?id=6f6e31803027e075a8fa2446cd3df3f8&sub=DFB2B79124BE4898860660F0EADD44E9

2017-07-03 13:28:14 494

原创 Zuul进阶篇-okhttp替换httpclient

前言在当下微服务的场景下,HTTP请求方式成为了集成各服务的最佳方式。在 Java 平台上,Java 标准库提供了 HttpURLConnection 类来支持 HTTP 通讯。不过 HttpURLConnection 本身的 API 不够友好,所提供的功能也有限。大部分 Java 程序都选择使用 Apache 的开源项目 HttpClient 作为 HTTP 客户端。Apache Htt

2017-07-03 13:15:00 30629 4

原创 Kafka+ELK集成

前言在《ELK接入微服务工程》章节中实现了通过ELK对微服务日志收集查询管理工作,那么对于大型系统,特别是微服务设计下的分布式系统,我们的日志来源非常之多,如果直接通过logstash收集输出至elasticsearch很有可能会导致elasticsearch奔溃,如何进行有效的流量控制显得很重要,消息队列能够很好的解决此顾虑。Kafka具有很好的分布式扩容能力,且在高并发场景下优势明显,

2017-04-27 14:01:25 3353

原创 ELK接入微服务工程

前言基于上一个章节,我们已经将ELK完整的构建完成,本章节将实际在微服务工程项目中接入ELK,并进行简单的数据检索验证。本章概要1、微服务工程改造;2、启动ELK相关组件;3、日志采集输出验证;微服务工程改造本次改造的工程基于springcloud学习章节的demo工程展开,本次仅改造eurekaserver(springcloud-eureka

2017-04-26 21:49:29 2535

原创 JPA集成MyCAT实现读写分离

在高并发的互联网项目中,数据库的压力一直是一个瓶颈,而大量的操作均为读操作,通过MySQL的读写分离,一主多从的当时能够大大的降低数据库的压力。在之前的Springboot章节中有过类似的话题,当时我们可以通过配置多个数据源,通过不同的数据源指向实现读写分离,还实现了基于AOP的动态数据源切换,当然这也需要归功于Spring提供了数据源的路由功能,不过此方式依然会对我们的业务代码造成侵入,本章将通

2017-04-26 01:41:57 4514 1

原创 通过MyCAT中间件实现读写分离

紧接着上一章节的《MySQL一主多从配置》,本章节将介绍如何搭建mycat中间件,并用mycat来做读写分离.本章概要1、MyCat关键特性2、下载MyCat主程序3、基础设施4、配置MyCat&验证Mycat关键特性关键特性支持SQL92标准支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQ

2017-04-26 01:35:11 837

原创 MySQL事务隔离级别&锁机制分析论证

基本概念1、事务隔离级别说明ANSI/ISO SQL标准定义了4中事务隔离级别:未提交读(read uncommitted),提交读(read committed),重复读(repeatable read),串行读(serializable)。对于不同的事务,采用不同的隔离级别分别有不同的结果。不同的隔离级别有不同的现象。主要有下面3种现在:a、脏读(dirty read):一

2017-04-26 01:25:19 1322 4

原创 可靠事件实现微服务下最终一致性事务

通过《消费者实现应用内分布式事务》、《生产者实现应用内分布式事务管理》、《实现持久订阅消费者》三个章节的实践,其实我们已经可以通过消息队列实现多应用的分布式事务,应用内的事务保证了消息不会被重复生产消费、持久化订阅保证了消息一定会被消费(进入死信队列特殊处理),但其对于业务来说耦合性还是太强,在进行业务处理的同时消息处理名,其采用的仍然是应用内的事务处理,并不适合在大型高性能高并发系统实践,那么本

2017-04-01 09:35:14 5858 1

原创 DynamoDB初体验

前言DynamoDB作为AWS云服务一部分,也支持本地化应用,本章将介绍如何在本地构建基础运行环境。本章概要安装DynamoDB Local;AWS CLI安装;AWS CLI使用安装DynamoDB Local通过官方下载安装文件,下载完成后直接解压即可;启动服务通过如下命令即可启动:java -Djava.library.path=./DynamoDBLocal_lib -jar

2017-03-28 14:58:35 8722

原创 JVM内存组成&调优参数详解

总内存大小=堆内存区 + 持久代(永久代、方法区)区大小+程序计数器+Java虚拟机栈+本地方法栈;名词解释:1、堆内存区:Java程序在运行时创建的所有类实例或数组都放在同一个堆中。而一个Java虚拟实例中只存在一个堆空间,因此所有线程都将共享这个堆。每一个 java程序独占一个JVM实例,因而每个 java程序都有它自己的堆空间,它们不会彼此干扰。但是同一java程

2017-01-07 20:07:35 8201

原创 实现持久订阅消费者

在很多的业务场景下,如果有多个订阅者,其不在线则会丢失生产者发出的消息,仅有在线状态下方可接收到消息,那么是否有方式可以实现离校订阅消息的读取呢,并保证可靠传递以及不重复消费呢,本章将通过持久订阅者实现。本章概要1、定义持久订阅消费者;2、取消持久订阅消费者;定义持久订阅消费者1、首先关注一下几个信息,在没有定义持久订阅者时1.1、没有任何订阅者

2017-01-07 19:53:19 2194

原创 同时消费队列和发布订阅两类型消息

在《实现生产者P2P&subpub兼容模式》中实现了生产者两种消息类型的兼容模式,在消费者中对于单应用同样有这样的需求,我们需要能够在一个应用内同时消费队列和发布订阅两个类型的消息。本章概要1、回顾;2、编码;3、验证;回顾在springboot下,目前我们切换队列和发布订阅模式均通过spring.jms.pub-sub-domain属性配置。《实现

2017-01-07 19:46:06 4725 1

原创 消费者实现应用内分布式事务

在《生产者实现应用内分布式事务管理》中我们已经实现了消息生产与关系型数据库MySQL的应用内分布式事务,结合上一章《消费者JmsListener应用源码浅析》中对源码的分析,本章将实现消费者实现应用内分布式事务。本章概要1、基础工程目录;2、新增事务相关代码案例;3、事务验证;实践1、首先看下本工程的目录红色部分为在《优化生产者连接工

2017-01-07 19:37:25 1064

原创 消费者JmsListener应用源码浅析

在之前的章节中,特别是《消费者本地事务》我们并没有进行任何配置,为什么事务生效了呢(不考虑关系型数据库的结合,结合后MQ事务仍然生效,但关系型数据库事务没有作为整体事务管理),下面我们通过对源码的分析来探索Spring如何帮助我们实现了。本章概要1、JmsListener注解解析2、其他消费方式实现(3种)3、分布式事务的支持JmsListener注解解析

2017-01-07 19:30:09 21354

原创 消费者本地事务

之前在《实现应用内分布式事务管理(生产者)》章节已经重点介绍了生产者如何实现应用内的本地事务、分布式事务,对于消费者同样有事务管理的需求,本章节将重点介绍springboot下目前消费者本地事务。本章概要1、构建消费者基础工程;2、事务验证;3、尝试多种消息Response方式;4、切换监听来源--由队列至发布订阅;5、同步消息消费浅析;构建消费者基础工

2017-01-07 19:12:34 1499

原创 优化生产者连接工厂(带有session缓存)

之前的连接工厂中,JmsTemlate每次发送消息时都会重新创建connection、session、productor等对象,从而导致性能的下降,是否有类似pool的连接池协助我们提高性能呢?答案必然是肯定的。本章概要1、缓冲连接工厂对比选择;2、源码分析;3、CachingConnectionFactory连接工厂的实现;4、探索:ActiveMQXAConnect

2017-01-07 18:21:10 4236

原创 实现生产者P2P&subpub兼容模式

在《实现应用内分布式事务管理(生产者)》章节其实已经对JmsTemplate进行了重新注册,在源码JmsAutoConfiguration可以看到如下代码设置:jmsTemplate.setPubSubDomain(this.properties.isPubSubDomain());其主要设置我们的jmsTemplate是队列还是发布订阅类型消息,isPubSubDomain可以在appl

2017-01-07 18:16:42 1595

HIbernate Struts2 开发

实现数据库的增、删、查、改。每种用不同的执行方式。是个不错的学习案例。相信对您的学习一定有帮助。

2009-12-13

空空如也

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

TA关注的人

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