微服务、分库分表、分布式事务管理、APM链路跟踪性能分析演示项目
好多年没发博,最近有时间整理些东西,分享给大家。
所有内容都在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工具只能三选一。
最简单运行方式操作步骤:
- JDK 8+;
- 部署nacos,用于Dubbo注册中心;
比较简单,参考Nacos快速开始即可。 - MySQL数据库;
建库脚本sql-schema.sql,是演示分库分表用的建库脚本,简单方式运行只需要其中mydemo-dn1单库即可。 - 修改项目配置信息;
配置信息都在parent pom.xml中,包括数据库连接信息、nacos地址等。 - 编译打包;
执行sh package.sh,Windows环境装了git bash就可以运行。 - 运行演示项目:
依次启动服务和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
- 通过http://localhost:8090/shop访问,执行操作查看效果;
分布式事务管理
阿里云分布式事务管理GTS的开源版Seata,2019年1月开源出来,1.0.0版已经发布。相关概念、部署和使用方法参考Seata分布式事务管理框架概览。
Seata提供AT、TCC、Saga三种柔性事务模式,AT模式对应用几乎透明,使用方便,目前来看:
- 性能开销还比较高;
- 在使用Mycat、Sharding-Proxy进行分库分表时,Seata会产生不少路由到全分片执行的SQL操作,详细参考Seata分布式事务管理框架概览文末;
数据库分库分表
本项目演示了使用Mycat和Sharding-Proxy进行分库分表,相关概念、部署和使用方法,参考MyCat分库分表概览、Sharding-Proxy分库分表概览,这2个分库分表开源方案与DRDS对比,参考DRDS产品概览。
Mycat、Sharding-Proxy和DRDS都实现了MySQL协议,成为独立的中间件,将分库分表、读写分离等数据存储的弹性伸缩方案与应用隔离,并且实现语言无关。
APM全链路监控
演示项目支持PinPoint、SkyWalking、ZipKin三种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链路跟踪性能分析演示项目的更多相关文章
- 转数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...
- 数据库分库分表(sharding)系列(一)拆分实施策略和示例演示
本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...
- 据库分库分表(sharding)系列(一) 拆分实施策略和示例演示
本文原文连接: http://blog.csdn.net/bluishglc/article/details/7696085 ,转载请注明出处!本文着重介绍sharding切分策略,如果你对数据库sh ...
- mysql 分库分表 ~ 柔性事务
一 定义 TCC方案是可能是目前最火的一种柔性事务方案二 具体 内容 TCC=try(预设)-confrim(应用确认)-canal(回滚取消)三 目的 解决跨服务调用场景下的分布式事务问题,避免使用 ...
- Microservices 微服务概念和优点 自治 弹性 级联故障 微服务的问题 CAP 分布式事务 修改一个服务并对其部署而不影响其他任务服务
https://en.wikipedia.org/wiki/Microservices https://zh.wikipedia.org/wiki/微服務 微服務 (Microservices) 是一 ...
- 分布式事务-Sharding 数据库分库分表
Sharding (转)大型互联网站解决海量数据的常见策略 - - ITeye技术网站 阿里巴巴Cobar架构设计与实践 - 机械机电 - 道客巴巴 阿里分布式数据库服务原理与实践:沈询_文档下载 ...
- Mycat读写分离、主从切换、分库分表的操作记录
系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...
- mycat+ mysql集群 分库分表
mycat介绍Mycat数据库分库分表中间件国内最活跃的.性能最好的开源数据库中间件!Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.Postg ...
- 分库分表之ShardingSphere
目录 分库分表诞生的前景 分库分表的方式(垂直拆分,水平复制) 1.垂直拆分 1.1 垂直分库 1.2 垂直分表 2.水平拆分 2.1 水平分库 2.2 水平分表 分库分库中间件 ShardingSp ...
随机推荐
- DSDT/SSDT
版权说明:本文章参考tonymacx86的Patching LAPTOP DSDT/SSDTs这篇文章 如果需要转载,请注明原文地址:http://blog.csdn.net/wr132/articl ...
- js -- 操作sqlite数据库
最近看到一个使用js来操作sqlite数据库的,测试了一下,具体使用的是 js操作类: https://github.com/kripken/sql.js/(sqlite js 驱动) 异步请求:ht ...
- 直接打印类,调用toString()方法
直接打印类,调用的是继承的Object类的toString()方法,Object类的toString()方法是这样实现的:getClass().getName() + "@" + ...
- 2.12 使用@DataProvider
提供数据的一个测试方法.注解的方法必须返回一个Object[] [],其中每个对象 []的测试方法的参数列表中可以分配.该@Test 方法,希望从这个 DataProvider 的接收数据, ...
- 三种方法获取 lua时间戳
ngx.now() 返回:1523174287.735 毫秒级精度的时间戳(获取的是nginx缓存的时间戳,并非实时刷新, 如果希望刷新,可以在获取前一行加上 ngx.update_tim ...
- 解决for循环插入同一元素无法重复插入问题
var el = document.createElement("div"); el.appendChild(document.createTextNode("hello ...
- 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 ...
- JavaScript arguments对象浅析
arguments对象 概念 用法 属性 arguments对象 概念 arguments 是一个类数组对象.代表传给一个function的参数列表. 用法 function a() { consol ...
- linux备忘命令
1,安装vim以后把vim中的tab键设置为4个空格 vim ~/.vimrc一下,如果没有会创建新的, 然后添加下面两行: set ts=4 set expandtab 如果第二行内容是noexpa ...
- python开发基础04-列表、元组、字典操作练习
练习1: # l1 = [11,22,33]# l2 = [22,33,44]# a. 获取内容相同的元素列表# b. 获取 l1 中有, l2 中没有的元素列表# c. 获取 l2 中有, l1 中 ...