前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微服务架构(Saga)及示例eventuate

微服务架构(Saga)及示例eventuate

原创
作者头像
mariolu
修改2020-06-28 00:32:20
2.8K0
修改2020-06-28 00:32:20
举报
文章被收录于专栏:CDN及云技术分享

一、微服务架构

微服务目的是做到服务可随时动态扩缩。有以下三种策略服务拆分,水平扩展,水平复制。

微服务架构把这三个维度比喻成一个立方体。

图1、微服务的三维架构
图1、微服务的三维架构

1.1 水平扩展:X轴线

使用负债均衡平衡后端服务。后端服务多为单体,水平扩展用于克隆单体。

而如果后端有缓存的关系(cookie或者服务端保存会话,是保存在内存中,而不是数据库),就不能适用水平扩展或者不能只简单地水平扩展,所以这个水平扩展更新用单机服务的扩展。

图2、水平扩展
图2、水平扩展

X轴的水平扩展很好实现,一般用tcp四层代理和http7层代理,4层和7层的区别在于

tcp四层代理不需要状态,7层更适用于检查http头或者一些值来达到平衡。

应用场景:

一开始没考虑扩展的服务,当运行到某个瓶颈时候,优先考虑这种简单粗暴的水平扩展

app proxy应用代理或者 application delivery controller (ADC)应用流量分发控制器

代理把计算型服务,也常见于在云应用场景中。

1.2 功能性扩展:Y轴线

单体功能拆分成服务。它也是个典型的7层负载均衡

Y轴扩展(功能扩展),把功能拆分成服务;又通过SOA和RESTful api把服务组合成功能

Y轴扩展是一个前置条件是,ADC流量分配器从uri区分。

一个功能扩展和水平扩展相结合的例子是:

图3、功能扩展
图3、功能扩展

1.3 基于数据的扩展(非服务本身,服务实例可以一致)

z扩展是介于X和Y扩展,使用基于数据分片的策略,

z扩展在每个节点都运行同样一份程序,这种有点像X水平扩展,但是和X水平扩展不一样的时候,Z扩展服务的数据段不一样,

基于访问数据段来分发流量。

这种z扩展是基于访问数据的流量分发,所以也适用于高级的vip用户得到更好的服务。

图4、数据扩展
图4、数据扩展

二、微服务的SAGA模式

sage是a sequence of local transactions. 一个服务提交完自己的数据库,将数据流向 下一个服务。使用异步消息来协调本地事务。

2.1 和传统分布式事务区别

维持跨服服务一致性的传统方式是分布式事务,两阶段提交保证事务中的所有参与方都可以完成提交,或者在失败时同时回滚。

很多流行组件不支持分布式事务NoSql(Cassandra ,MongoDB),RabbitMQ, Kafka。所以传统的分布式事务不能完美兼容一些流行组件。

  • 传统ACID事务对待违反业务规则的办法,可以轻松回滚事务。
  • SAGA无法自动回滚,所以需要补偿事务,

2.2 SAGA的补偿事务设计架构模式

2.2.1 协同式:

把SAGA的决策和执行顺序逻辑分布在sage的每一个参与方中,他们通过交互事件的方式进行沟通

2.2.2 编排式:

把saga的决策和执行顺序集中在一个sage编排器勒种。saga编排器发出命令式消息给个个saga参与方,指示这些参与方完成具体操作(本地事务)

三、编译运行示例eventuate(一个实现SAGA模型的微服务框架例子)

3.1 编译安装

下载源码

代码语言:javascript
复制
git clone https://github.com/eventuate-tram/eventuate-tram-sagas.git

这个项目是采用gradle编译工具链(一个java编译框架),编译设定属性在gradle.properties文件。

图5 gradle.preperties属性
图5 gradle.preperties属性

进入源码目录执行./build-and-test-everything.sh ,这个文件背后调用了设置环境变量,然后调用gradlew编译。

在编译之前需要安装java8、docker-compose、docker。java8是用来当jvm。docker*是安装mysql、zookeeper、kafka的组件服务。

3.2 解决编译问题

3.2.1 问题:cannot find symbol @PostConstruct

图6 java版本问题
图6 java版本问题

,解决办法:确保安装的是java8,而不是java11

安装完多个版本的java,可以用以下命令切换:

图7 切换java版本
图7 切换java版本

3.2.2 问题:gradle build daemon disappeared unexpectedly(it may have been killed or may hava crashed)

gradle daemon模式是编译会在后台启动一个daemon服务,用于加快持续集成编译,下次编译会利用上次编译的缓存,编译得更快。但是这个问题其实本质是内存不足。我一开始用1G的云服务器编译,都是这种诡异的问题,换到4G内存的云服务器编译,这些问题都消失 了,这个架构背后还会docker启动zk、kafka和mysql服务,以及jvm编译环境都是比较耗内存的。所以建议是这里用4G以上的内存机器进行编译。

图8 编译机内存不足问题
图8 编译机内存不足问题

3.2.3 问题:Exit-code 1 when calling docker-compose, stdout:

这个是没有安装docker,需要按照官网的指导正确安装docker和docker-compose。配置yum源如果是centos服务器的话。然后yum安装完docker,记得service docker restart启动。然后还需要安装python pip服务,使用pip安装docker-compose

图9 docker服务缺失
图9 docker服务缺失

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、微服务架构
    • 1.1 水平扩展:X轴线
      • 1.2 功能性扩展:Y轴线
        • 1.3 基于数据的扩展(非服务本身,服务实例可以一致)
        • 二、微服务的SAGA模式
          • 2.1 和传统分布式事务区别
            • 2.2 SAGA的补偿事务设计架构模式
              • 2.2.1 协同式:
              • 2.2.2 编排式:
          • 三、编译运行示例eventuate(一个实现SAGA模型的微服务框架例子)
            • 3.1 编译安装
              • 3.2 解决编译问题
                • 3.2.1 问题:cannot find symbol @PostConstruct
              • 3.2.2 问题:gradle build daemon disappeared unexpectedly(it may have been killed or may hava crashed)
                • 3.2.3 问题:Exit-code 1 when calling docker-compose, stdout:
            相关产品与服务
            容器镜像服务
            容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档