自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 资源 (3)
  • 收藏
  • 关注

原创 用阿里云K8S搭建SpringCloud(服务发现:Consul)微服务--问题小结

导言公司原有的微服务是基于Eureka做微服务microservice间的服务发现,以及通过阿里云的Loadbalance设施实现gateway层的负载,以及通过流量权重切换实现分批发布。原来的方式保证了一定程度的微服务化,把很多重要服务的领域边界都可以划分清楚,几乎很少的服务间请求,所有的数据都在gateway层通过rxJava进行并行io请求和数据组装。保证了业务的灵活性和扩展性。随着公司业务发展,今年开始有一块跟原来业务区别较大的新产品规划。如果再按eureka去搭一套的话,机器资源是相对浪费的

2021-02-09 17:22:38 2949

原创 【十】分布式微服务架构体系详解——架构设计理念

前言前面几课的内容从分布式架构的一些常见场景出发,介绍了分布式的各种问题和解决方案以及目前一些比较成熟的技术实现。在实施微服务架构时,我们更多的是使用这些成熟的技术。作为一个架构师或者想在技术架构领域深耕的开发人员,对于分布式系统相关的技术不仅仅要会用。在做技术选型及方案时,更需要对这些技术的实现思路、算法以及优点和限制进行了解。本节课内容作为整个课程系列的收尾,会把微服务架构结合Docker的一些技术选型进行介绍,包括服务的持续集成、容器编排以及日志采集和安全技术做个简单的引申,希望能给各位读者一些参考

2020-07-28 10:29:08 1112 3

原创 【九】分布式微服务架构体系详解——共识问题

前言分布式架构体系中,一致性和共识是分不开的概念,一致性也是我们解决很多分布式问题的关键。比如通过一致性模型可以实现数据集群的数据复制;通过基于阻塞的2PC协议可以实现分布式的原子性提交,保证事务数据的一致。我们在07课 分布式一致性介绍了分布式一致性的一些理论,并且引出了分布式共识(Consensus)的话题。共识就是让分布式系统中所有节点都对一些值达成共识。在分布式系统中,解决共识问题可以帮助我们处理很多分布式问题,包括前一章介绍的原子提交协议,以及本章会稍后介绍的全序广播。本文主要介绍具有容错特

2020-07-28 10:27:45 1258

原创 【八】分布式微服务架构体系详解——分布式事务实践

前言分布式计算领域中,一个重要的场景就是共识问题。前文也简单提及过,共识即是让分布式系统中所有节点对于一些值达成共识。共识问题的处理一般用于Leader选举(比如单主复制的集群,只有主节点接受数据写入,如果这个leader 节点挂了,需要其他节点能选举出新的leader,使用选举算法需保证选举出一个新Leader)以及原子提交(跟事务ACID的A概念是一样的,分布式的原子提交需要保证所有节点都最终获得一样的数据结果,事件的操作都执行成功或者都放弃)。我们常说的分布式事务一般是指解决分布式系统的原子提交(A

2020-07-28 10:26:36 559

原创 【七】分布式微服务架构体系详解——分布式一致性

前言我们在前面几篇文章中介绍了,分布式环境下会有网络延迟,节点挂掉的问题。这些问题解决的理论都和分布式一致性息息相关。无论是数据存储的集群,或者微服务系统的集群,为了达到高可用性,我们希望系统能够对分布式问题有很好的容错,保证一直会给用户一个好的Response。通过本章节,我们将了解到分布式系统中的一些“可能”以及“不可能”。本文先介绍分布式系统中几个重要的理论:CAP、BASE、FLP不可能结果,以及这些理论的应用领域,可以让大家对耳熟能详的技术的背后理论有个更好的了解。然后再介绍下分布式一致性模型

2020-07-28 10:19:08 609 1

原创 【六】分布式微服务架构体系详解——分布式存储集群的事务

前言微服务架构下,比较典型的一个分布式问题就是并发。并且并发访问的资源可能分布在不同的数据存储的实例上。比如很多电商系统的下单减库存流程。订单的微服务和商品的微服务,底层的数据库是分离的。如果没有并发的事务控制,并发场景下会出现“超卖”。如果订单的DB和商品的DB是同一个库,可以使用关系型数据库支持的本地事务做处理。但分布式场景下类似的并发问题要怎么解决?这个也是分布式架构必须要处理的课题之一。为了理解并解决应用系统层面的分布式事务问题,我们需要先从最底层的存储服务的事务讲起,后续的章节基本都是围绕“分布

2020-07-28 10:18:08 684

原创 【五】分布式微服务架构体系详解——服务发现和服务通信

前言微服务架构的概念比容器技术早,但是却随着容器技术在13年的兴起,基于容器技术的微服务架构越来越被广泛应用。容器的轻量级部署方式很适合为每个微服务提供基础运行环境。本文会基于Docker容器,先介绍下服务发现的问题和可用的方案,然后对同步通信以及异步通信的技术做一些对比介绍。最后会结合DDD(Domain-Driven Design)的思想来分析合理的通信模型。Docker 容器的基础知识本文会略过,对Docker感兴趣的同学还可以去看看 Docker源码 ,Docker是用Go语言写的,Go语言很

2020-07-28 10:17:09 797

原创 【四】分布式微服务架构体系详解——数据分区

前言对于大规模的分布式集群,或者对于数据密集型应用来说,为了提高吞吐量和性能以及可用性,一般会结合使用数据复制和数据分区。数据复制将对单库的请求压力分给更多的数据库实例,数据分区将每个实例中的庞大的数据文件以一定规则切分成更小的数据文件,并可以存储到不同的磁盘(或数据节点Node)上,提高请求的并发性能,同时,增加了扩展性。本文将介绍分布式存储集群的高可用的另外一个解决方案——数据分区,以及以Mysql为示例看一些数据分区的具体实现。理解数据分区复制和分区的差别是什么?请看下面一张图:分区和分表

2020-07-28 10:15:45 518 1

原创 【三】分布式微服务架构体系详解——数据复制

前言一个高可用的分布式系统,底层的存储也是需要高性能、高可用的。上一篇介绍了一些数据存储产品,如果数据存储服务都是单库的,那么在唯一的单库发生故障时,将导致上层的微服务系统也都无法正常运行。为了加强可用性,我们需要更多的数据库节点,一个节点挂了,可以快速切换到可用的节点提供服务。有更多的节点提供服务可以带来很多好处,比如高可用、高性能,基于地理分布的数据中心可以提升用户访问速度。为了提供更好的性能和可用性,也需要解决一些复杂的问题,尤其是多Node的数据复制问题。第一篇文章中有介绍到网络延迟的问题,在多

2020-07-28 10:14:52 580

原创 【二】分布式微服务架构体系详解——数据存储

前言微服务架构下,很适合用DDD(Domain-Drive Design)思维来设计各个微服务。使用领域驱动设计的理念,工程师们的关注点需要从CRUD思维中跳出来。更多关注通用语言的设计、实体以及值对象的设计。至于数据仓库,会有更多样化的选择。分布式系统中数据存储服务是基础,微服务的领域拆分、领域建模可以让数据存储方案的选择更具灵活性。不一定所有的微服务都需要有一个底层的关系型数据库作为实体对象实例的存储。以一个简单的电商系统为例:“用户微服务”和“商品微服务”都分别需要关系型数据库存储结构化的关联数据

2020-07-28 10:13:38 868 1

原创 【一】分布式微服务架构体系详解——分布式系统的问题

前言无论是SOA或者微服务架构,都是必须要面对和解决一些分布式场景下的问题。如果只是单服务、做个简单的主备,那么编程会成为一件简单幸福的事。只要没有bug,一切都会按照你的预期进行。然而在分布式系统中,如果想当然得去按照单服务思想编程和架构,那可能会收获很多意想不到的“惊喜”:网络延迟导致的重复提交、数据不一致、部分节点挂掉但是任务处理了一半等等。在分布式系统环境下编程和在单机器系统上写软件最大的差别就是,分布式环境下会有很多很‘诡异’的方式出错,所以我们需要理解哪些是不能依靠的,以及如何处理分布式系统的

2020-07-28 10:09:41 855 1

原创 【0-导言】如何构建分布式系统的知识体系

对于开发工程师们来说,相信对于这种招聘要求的描述并不陌生:”熟悉分布式系统的设计和应用;熟悉分布式、缓存、消息、搜索等机制;能对分布式常用技术进行合理应用,解决问题”。 现在基本上大多数大、中型企业都会要求工程师们,除了要能在分布式环境中进行开发,还要了解其中的原理、机制,对于架构师来说还需要能够独立设计分布式系统。 分布式(计算机)系统的概念起源很早,目前已经基本涵盖了大多数系...

2018-09-02 21:57:48 3423 8

原创 分布式微服务架构的技术体系

花了一些时间对微服务架构体系的理论以及实践进行了总结。一部分课程已经整理完毕上线了。 课程链接:微服务架构的技术体系详解 课程简介: 微服务架构的技术体系、社区目前已经越来越成熟。在最初系统架构的搭建,或者当现有架构已到达瓶颈需要进行架构演进时,很多架构师、运维工程师会考虑是否需要搭建微服务架构体系。虽然很多文章都说微服务架构是复杂的、会带来很多分布式的问题,但只要我们了...

2018-07-10 20:55:19 6119 8

原创 JVM性能调优实践——G1 垃圾收集器分析、调优篇

前言关于G1 GC以及其他垃圾收集器的介绍可以参考前一篇JVM性能调优实践——G1 垃圾收集器介绍篇。了解了G1垃圾收集器的运行机制之后,就可以针对一些GC相关参数来调整内存分配以及运行策略。下文的调优主要针对G1垃圾收集器进行介绍,以及会分析一下G1 GC的日志格式。 G1 GC日志分析在执行具体的调优任务前,需要结合GC日志以及应用本身的特点。打印详细GClog,...

2018-06-04 13:58:15 18893 18

原创 JVM性能调优实践——G1 垃圾收集器介绍篇

前言前面两篇主要整理了性能测试的主要观察指标信息:性能测试篇,以及JVM性能调优的工具:JVM篇。这一篇先简单总结一下GC的种类,然后侧重总结下G1(Garbage-First)垃圾收集器的分代,结合open-jdk源码分析下重要算法如SATP,重要存储结构如CSet、RSet、TLAB、PLAB、Card Table等。最后会再梳理下G1 GC的YoungGC,MixedGC收集过程。 ...

2018-05-30 17:34:59 25579 42

原创 JVM性能调优实践——JVM篇

前言在遇到实际性能问题时,除了关注系统性能指标。还要结合应用程序的系统的日志、堆栈信息、GClog、threaddump等数据进行问题分析和定位。关于性能指标分析可以参考前一篇JVM性能调优实践——性能指标分析。 JVM的调优和故障处理可以使用JDK的几个常用命令工具。因为本文是基于Docker容器内部的Springboot服务。需要调整一下docker容器的启动参数,才可以使用jma...

2018-05-24 11:46:49 35180 10

原创 JVM性能调优实践——性能测试篇

前言本文主要基于工作中,关于性能调优的一些零散的信息整理。总结性的信息,以测试环境为例。系统信息如下: os: Linux 64位jdk:java version “1.8.0_121”, HotSpot(TM) 64-Bit Server VMdocker version: 17.04.0-ce第一篇先整理一些性能指标。第二篇整理一下jvm的性能问题分析,以及基于dock...

2018-05-15 17:11:56 6854

原创 Mysql InnoDB连接池占满问题

简单做一下线上问题排查的记录。使用的Mysql引擎是 InnoDB 5.7。 排查log通过排查应用日志(只有其中一台机器),可以马上定位到问题是数据库连接池满了。具体日志如下:2018-05-10 10:42:16.824 WARN 5 [xec-3303] SqlExceptionHelper SQL Error: 0, SQ...

2018-05-11 22:22:28 8554

原创 SpringData3.x以及SpringBoot2集成Elasticsearch5.x

说明关于如何在SpringBoot 1.x 的版本中集成Elasticsearch 2.x可以参考前文Elasticsearch实践(二)在Springboot微服务中集成搜索服务。2017年底,SpringData项目终于更新了Elasticsearch5.x版本的对应release版本:3.0.2.RELEASE。本文结合一个本地的示例,对于ES版本升级进行简单介绍。目前ES已经出到了6.

2018-01-26 11:14:50 15668 1

原创 基于Spring-statemachine的有限状态机(FSM)的介绍及示例

前言本文主要介绍一下状态机以及相关的一些概念。结合一个简单的订单状态流程,示例怎样在Springboot中集成Spring-statemachine。有限状态机(Finite-state machine)有限状态机(英语:finite-state machine,缩写:FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。示例中以一个常见的“订单”的状态转移为例。

2017-11-26 20:31:19 52193 16

原创 Elasticsearch实践(二)在Springboot微服务中集成搜索服务

关于如何用Docker搭建Elasticsearch集群环境可以参考前一篇:Elasticsearch实践(一)用Docker搭建Elasticsearch集群。本文主要介绍,如果在Springboot体系中集成Elasticsearch服务。本文基于:Elasticsearch版本是2.2.4,Springboot版本是1.5.3.RELEASE,spring-data-elasticsearch

2017-11-23 14:32:57 36821 9

原创 Elasticsearch实践(一)用Docker搭建Elasticsearch集群

前言本系列文章主要是针对之前搭建以及实践基于springboot的搜索服务的总结。主要分为两部分: 1. 对于用Docker搭建分布式Elasticsearhc集群的一个介绍,以及一些实施中遇到问题的总结。(本篇) 2. 后面一篇会整理一下在基于Springboot的微服务体系中,如何更轻量级得使用Elasticsearhc以及一些复杂使用场景。搜索服务简述结合业务的场景,在目前的商品体系需要构

2017-11-18 10:21:24 25966 8

原创 基于docker-swarm搭建持续集成集群服务

前言本文只为自己搭建过程中的一些简单的记录。如果实践中有疑问,可以一起探讨。 为了能在本机(macOS)模拟集群环境,使用了vb和docker-machine。整体持续集成的几个机器设施如下: 服务节点:三个manager节点,一个worker节点。manager需要占用更多的资源,manager配置尽量高一些。swarm的manager节点的容错率是 (N-1)/2 。N是mana

2016-12-18 17:39:02 21925

原创 通过字节码分析JDK8中Lambda表达式编译及执行机制

关于Lambda字节码相关的文章,很早之前就想写了,线上产品的后端技术,能快速迭代,除了得益于整体微服架构之外,语言层面上,也是通过Java8的lambda表达式的运用以及rxJava响应式编程框架,使代码更加简洁易维护,调用方式更加便捷。本文将介绍JVM中的方法调用相关的字节码指令,重点解析JDK7(JSR-292)之后新增的invokedynamic指令给lambda表达式的动态

2016-04-23 13:07:01 26484 16

原创 基于Redis实现分布式锁-Redisson使用及源码分析

在分布式场景下,有很多种情况都需要实现最终一致性。在设计远程上下文的领域事件的时候,为了保证最终一致性,在通过领域事件进行通讯的方式中,可以共享存储(领域模型和消息的持久化数据源),或者做全局XA事务(两阶段提交,数据源可分开),也可以借助消息中间件(消费者处理需要能幂等)。通过Observer模式来发布领域事件可以提供很好的高并发性能,并且事件存储也能追溯更小粒度的事件数据,使各个应用系统拥有更好

2016-04-14 13:40:26 34336 9

原创 领域服务、领域事件

综合前两篇总结,这篇对领域服务和领域事件做一个梳理。先说明下本文的领域服务和应用服务。SOA服务,或者应用间的RPC调用,Restful接口,或者通过消息中间件进行系统间的交互的,都可以归类为应用服务。相较之下,领域服务不一定涉及到远程调用或者重量级事务操作。所以上下文集成也就涉及到,怎样的方式去划分限界上下文,怎么样设计才能尽量减少应用服务的耦合,以及应用服务对于本地模型的防腐。领域服务概念借用《

2016-03-12 19:19:09 23125

原创 领域驱动设计整理——实体和值对象设计

实体引言在领域驱动设计里,实体的设计可以说是通用语言的核心,也是最开始在模型划分中需要考虑的。怎么样设计实体和怎么样划分限界上下文同样重要。实体的概念就是要保证通用语言的完整性。领域驱动让设计实体的关注点从数据的属性和表的关联转化到了富有行为的领域概念上。 实体是具有可变性的,这是一个和值对象比较明显的区分,也即实体是可以持续得变化,持续得修改,并且具有唯一的标识。在设计实体的时候需要跳出CRUD的

2016-01-10 21:49:10 22488

原创 领域驱动设计整理——概念&架构

领域、子域、限界上下文DDD(Domain-Drive Design)的概念或者说业界的声音其实可以追溯到几十年前了。最近开始想要系统得整理一下DDD的一些东西。这一篇是一个简单的引子,也是mark一下自己接触到的概念和理解。 对于领域的概念其实很好理解,就如字面意思一样,比如出版书籍领域,广告设计领域。圈定了一定的范畴,并且在这个范畴内,所有团队成员对于某一概念的理解是一致的。比如书籍就是我们需

2015-12-13 16:53:15 21787

原创 Docker 容器部署 Consul 集群

Consul 介绍  Consul 提供了分布式系统的服务发现和配置的解决方案。基于go语言实现。并且在git上开放了源码consul-git。consul还包括了分布式一致协议的实现,健康检查和管理UI。Consul和zk相比较起来,更加轻量级,而且一致性上基于RAFT算法,zk使用的Paxos 算法。跟zk比较起来更加轻量级,Consul提供了通过一个DNS或者HTTP接口的方式来控制执行,而z

2015-09-29 13:39:31 25218

原创 ASM(六) 利用TreeApi 动态生成以及转换方法字节码

一、MethodNode概述      ASM的TreeApi 对于Method的转换、生成也提供了一系列的组件和接口。其功能主要基于前一章提到的MethodNode类。MethodNode中大多数属性和方法都和ClassNode类似,其中最主要的属性就是InsnList了。InsnList是一个双向链表对象,包含了存储方法的字节指令序。先来看下InsnList中的主要是属性和方法:

2015-08-29 18:52:50 22659 2

原创 从字节码指令看重写在JVM中的实现

Java是解释执行的,包括动态链接的特性,都给解析或运行期间提供了很多灵活扩展的空间。面向对象语言的继承、封装和多态的特性,在JVM中是怎样进行编译、解析,以及通过字节码指令如何确定方法调用的版本是本文如下要探讨的主要内容,全文围绕一个多态的简单举例来看在JVM中是如何实现的。

2015-07-30 19:22:35 19482

原创 ASM(五) 利用TreeApi 解析生成及转换Class

篇开始介绍ASM另一部分主要的Api。TreeApi。这一部分源码是关联的asm-tree-5.0.4的版本。 在介绍前,先要知道一点, Tree工程的接口基本可以完成大部分我们之前介绍的Core中的功能。但是在实际使用中更加便利,当然也会更加消耗时间和性能。完成一个简单的生成编译后的Class字节码的任务,可能会花费多余Core的30%的时间,同时也会消耗更多内存。但是通过下面的介绍,相信在选择用哪种Api上,我们也会做出自己的取舍和判断。

2015-07-15 19:57:27 21213

原创 ASM(四) 利用Method 组件动态注入方法逻辑

这篇继续结合例子来深入了解下Method组件动态变更方法字节码的实现。通过前面一篇,知道ClassVisitor 的visitMethod()方法可以返回一个MethodVisitor的实例。那么我们也基本可以知道,同ClassVisitor改变类成员一样,MethodVIsistor如果需要改变方法成员,注入逻辑,也可以通过继承MethodVisitor,来编写一个MethodXXXAdapte

2015-07-02 20:17:39 20860 2

原创 ASM(三) 利用Method组件动态生成方法的字节码

一、概述      ASM的CoreApi 中还提供了对class 中方法的生成和解析的组件。前面两篇着重介绍了ClassVisitor 组件的应用场景。ClassVisitor Api 中的visitMethod(int access, String name, String desc, String signature, String[] exceptions)方法返回了一个MethodV

2015-07-01 21:48:30 20817

原创 JVM StackMapTable 属性的作用及理解

在Java 6版本之后JVM引入了栈图(Stack Map Table)概念。为了提高验证过程的效率,在字节码规范中添加了Stack Map Table属性,以下简称栈图,其方法的code属性中存储了局部变量和操作数的类型验证以及字节码的偏移量。也就是一个method需要且仅对应一个Stack Map Table。在Java 7版本之后把栈图作为字节码文件中的强制部分。 本来程序员是不需要关心JV

2015-07-01 21:48:24 25307 10

原创 JVM 字节码指令对于栈帧数据操作举例

这一篇其实是对前面一篇《JVM字节码执行模型及字节码指令集》的一个延续和举例。结合例子看一下条件判定和无条件跳转指令对虚拟机栈的数据操作。     我们先来看一段代码例子。这里addEspresso()添加浓度方法会判断参数,如果参数package bytecode;/** * * Created by yunshen.ljy on 2015/6/21. */public

2015-06-21 16:23:14 18826

原创 JVM字节码执行模型及字节码指令集

JVM执行模型,是如何把Class文件里的字节码转换成我们的虚拟机栈的操作指令,以及整个虚拟机栈的内部数据结构是怎样的,这篇文章后续会详细介绍,并且稍微扩展下JVM规范中的一些字节码指令集。

2015-06-19 16:25:05 22648 3

原创 ASM(二) 利用Core API 变更类成员

这一篇把这producer(ClassReader)和consumer(ClassWriter)来结合起来介绍一下如何动态添加 移除 Java 类成员以及利用一些ASM工具类。

2015-06-13 17:32:38 18993

原创 ASM(一) 利用Core API 解析和生成字节码

ASM是一个提供字节码解析和操作的框架。Cglib框架就是基于ASM框架实现的,被广泛应用的Hibernate,Spring就是基于Cglib 实现了AOP技术。    在说到AOP的Java实现,可能会优先想到java的Proxy api,通过invoke方法拦截处理相应的代码逻辑,但是proxy 是面向接口的,被代理的class的所有方法调用都会通过反射调用invoke 方法,相对性能开销

2015-06-09 18:58:44 20229

原创 基于Docker的微服务架构的企业级服务集群实践(五)—— 服务集群

服务集群的解决方案企业在实践使用Docker部署、运行微服务应用的时候,无论是一开始就布局微服务架构,或者从传统的单应用架构进行微服务化迁移。都需要能够处理更复杂的集群中的服务调度、编排、监控等问题。下面主要为大家介绍在服务集群下,如何更安全、高效得使用Docker,以及在架构设计上,需要考虑的方方面面。 负载均衡这里说的是集群中的负载均衡,如果是纯服务端API的

2018-05-31 09:53:39 2472

蜂潮运动image

蜂潮运动image

2016-04-14

Vagrant中搭建Docker虚拟环境(上)-Mac

Vagrant提供了可配置、可复用的虚拟开发和部署环境,对于开发人员来说,Vagrant可以帮你统一团队成员的开发环境。也可以提供一套一致的线上线下环境。vagrant 在mac上通过命令行工具可以管理统一的镜像(BOX)所以vagrant还需要依赖VirtualBox等提供系统(支持linux,windows,OS X等)环境。这篇文章主要介绍下个人在mac上的配置过程。后面一篇会介绍vagrant上搭建docker(一种轻量级的LinuxContainer),让docker更加轻量级得管理我们统一的虚拟环境。

2015-09-18

C语言程序设计报告

实用,详细易懂,最常见的程序设计。

2008-07-20

空空如也

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

TA关注的人

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