好多年没发博,最近有时间整理些东西,分享给大家。

所有内容都在github项目liuzhibin-cn/my-demo中,基于SpringBoot,演示Dubbo微服务 + Mycat, Sharding-Proxy分库分表 + Seata分布式事务管理 + ZipKin, SkyWalking, PinPoint性能分析链路跟踪APM工具,有详细文档,可以快速运行


演示项目架构


运行演示项目

package.sh为打包脚本:

  • sh package.sh:最简单运行方式,使用单个MySQL数据库、nacos注册中心,运行4个Dubbo服务和1个Web应用;
  • sh package.sh -mycat:使用Mycat分库分表;
  • sh package.sh -sharding-proxy:使用Sharding-Proxy分库分表;
  • sh package.sh -seata:使用Seata分布式事务管理;
  • sh package.sh -zipkin:使用ZipKin进行链路跟踪、性能分析;
  • sh package.sh -pinpoint:使用PinPoint进行链路跟踪、性能分析;
  • sh package.sh -skywalking:使用SkyWalking进行链路跟踪、性能分析;

参数可以组合,例如sh package.sh -mycat -seata -zipkin,分库分表参数只能二选一,APM工具只能三选一。

最简单运行方式操作步骤:

  1. JDK 8+;
  2. 部署nacos,用于Dubbo注册中心;

    比较简单,参考Nacos快速开始即可。
  3. MySQL数据库;

    建库脚本sql-schema.sql,是演示分库分表用的建库脚本,简单方式运行只需要其中mydemo-dn1单库即可。
  4. 修改项目配置信息;

    配置信息都在parent pom.xml中,包括数据库连接信息、nacos地址等。
  5. 编译打包;

    执行sh package.sh,Windows环境装了git bash就可以运行。
  6. 运行演示项目:

    依次启动服务和Web应用:
    java -jar item-service\target\item-service-0.0.1-SNAPSHOT.jar
    java -jar stock-service\target\stock-service-0.0.1-SNAPSHOT.jar
    java -jar user-service\target\user-service-0.0.1-SNAPSHOT.jar
    java -jar order-service\target\order-service-0.0.1-SNAPSHOT.jar
    java -jar shop-web\target\shop-web-0.0.1-SNAPSHOT.jar
  7. 通过http://localhost:8090/shop访问,执行操作查看效果;

分布式事务管理

阿里云分布式事务管理GTS的开源版Seata,2019年1月开源出来,1.0.0版已经发布。相关概念、部署和使用方法参考Seata分布式事务管理框架概览

Seata提供AT、TCC、Saga三种柔性事务模式,AT模式对应用几乎透明,使用方便,目前来看:

  1. 性能开销还比较高;
  2. 在使用Mycat、Sharding-Proxy进行分库分表时,Seata会产生不少路由到全分片执行的SQL操作,详细参考Seata分布式事务管理框架概览文末;

数据库分库分表

本项目演示了使用MycatSharding-Proxy进行分库分表,相关概念、部署和使用方法,参考MyCat分库分表概览Sharding-Proxy分库分表概览,这2个分库分表开源方案与DRDS对比,参考DRDS产品概览

Mycat、Sharding-Proxy和DRDS都实现了MySQL协议,成为独立的中间件,将分库分表、读写分离等数据存储的弹性伸缩方案与应用隔离,并且实现语言无关。

APM全链路监控

演示项目支持PinPointSkyWalkingZipKin三种APM工具进行全链路跟踪和性能分析,相关概念、部署和使用方法,参考PinPoint部署和使用SkyWalking部署和使用ZipKin部署和使用

三种APM工具对比:

  • 使用方式:PinPoint和SkyWalking都采用javaagent方式,对应用代码几乎没有侵入性;ZipKin需要和应用打包到一起,并在应用中完成各种配置,属于强依赖关系;
  • 链路跟踪能力:整体上看相差不大,基本都参照Google Dapper,也都支持对大量主流框架的跟踪,细节上有些差异:
    • 对单次RPC调用分析,ZipKin定义的Annotations更精细,参考ZipKin部署和使用
    • PinPoint和SkyWalking都提供将额外方法添加到调用链跟踪的功能,其中PinPoint对代码完全没有侵入性,SkyWalking则需要对方法添加注解;
    • SkyWalking支持在Span中添加自定义tag功能,利用该功能可以将方法参数值等额外信息记录到Span中,有利于问题分析;
  • UI功能:PinPoint和SkyWalking UI功能比较丰富,都提供应用/服务、实例等层级的性能统计,两者各有特色;ZipKin UI功能最弱,只提供依赖关系、具体调用链查看分析;

    额外的UI功能,可以读取APM工具的数据,自定义开发;
  • 社区支持:ZipKin架构灵活、文档完善,社区支持度最高,Spring Cloud和Service Mesh(istio)官方提供ZipKin支持;SkyWalking是华为员工开发,已成为Apache项目;PinPoint为韩国公司开源;

微服务、分库分表、分布式事务管理、APM链路跟踪性能分析演示项目的更多相关文章

  1. 转数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...

  2. 数据库分库分表(sharding)系列(一)拆分实施策略和示例演示

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...

  3. 据库分库分表(sharding)系列(一) 拆分实施策略和示例演示

    本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...

  4. mysql 分库分表 ~ 柔性事务

    一 定义 TCC方案是可能是目前最火的一种柔性事务方案二 具体 内容 TCC=try(预设)-confrim(应用确认)-canal(回滚取消)三 目的 解决跨服务调用场景下的分布式事务问题,避免使用 ...

  5. Microservices 微服务概念和优点 自治 弹性 级联故障 微服务的问题 CAP 分布式事务 修改一个服务并对其部署而不影响其他任务服务

    https://en.wikipedia.org/wiki/Microservices https://zh.wikipedia.org/wiki/微服務 微服務 (Microservices) 是一 ...

  6. 分布式事务-Sharding 数据库分库分表

      Sharding (转)大型互联网站解决海量数据的常见策略 - - ITeye技术网站 阿里巴巴Cobar架构设计与实践 - 机械机电 - 道客巴巴 阿里分布式数据库服务原理与实践:沈询_文档下载 ...

  7. Mycat读写分离、主从切换、分库分表的操作记录

    系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...

  8. mycat+ mysql集群 分库分表

    mycat介绍Mycat数据库分库分表中间件国内最活跃的.性能最好的开源数据库中间件!Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.Postg ...

  9. 分库分表之ShardingSphere

    目录 分库分表诞生的前景 分库分表的方式(垂直拆分,水平复制) 1.垂直拆分 1.1 垂直分库 1.2 垂直分表 2.水平拆分 2.1 水平分库 2.2 水平分表 分库分库中间件 ShardingSp ...

随机推荐

  1. DSDT/SSDT

    版权说明:本文章参考tonymacx86的Patching LAPTOP DSDT/SSDTs这篇文章 如果需要转载,请注明原文地址:http://blog.csdn.net/wr132/articl ...

  2. js -- 操作sqlite数据库

    最近看到一个使用js来操作sqlite数据库的,测试了一下,具体使用的是 js操作类: https://github.com/kripken/sql.js/(sqlite js 驱动) 异步请求:ht ...

  3. 直接打印类,调用toString()方法

    直接打印类,调用的是继承的Object类的toString()方法,Object类的toString()方法是这样实现的:getClass().getName() + "@" + ...

  4. 2.12 使用@DataProvider

         提供数据的一个测试方法.注解的方法必须返回一个Object[] [],其中每个对象 []的测试方法的参数列表中可以分配.该@Test 方法,希望从这个 DataProvider 的接收数据, ...

  5. 三种方法获取 lua时间戳

    ngx.now()    返回:1523174287.735    毫秒级精度的时间戳(获取的是nginx缓存的时间戳,并非实时刷新, 如果希望刷新,可以在获取前一行加上 ngx.update_tim ...

  6. 解决for循环插入同一元素无法重复插入问题

    var el = document.createElement("div"); el.appendChild(document.createTextNode("hello ...

  7. How To Use These LED Garden Lights

    Are you considering the lighting options for the outdoor garden? Depending on how you use it, LED ga ...

  8. JavaScript arguments对象浅析

    arguments对象 概念 用法 属性 arguments对象 概念 arguments 是一个类数组对象.代表传给一个function的参数列表. 用法 function a() { consol ...

  9. linux备忘命令

    1,安装vim以后把vim中的tab键设置为4个空格 vim ~/.vimrc一下,如果没有会创建新的, 然后添加下面两行: set ts=4 set expandtab 如果第二行内容是noexpa ...

  10. python开发基础04-列表、元组、字典操作练习

    练习1: # l1 = [11,22,33]# l2 = [22,33,44]# a. 获取内容相同的元素列表# b. 获取 l1 中有, l2 中没有的元素列表# c. 获取 l2 中有, l1 中 ...