学习记录之注册中心Nacos及Dubbo(1)
Dubbo实现微服务调用:
确定调用关系

order模块调用stock模块的减少库存的功能
order模块调用cart模块的删除购物车的功能
business模块调用order新增订单的功能
要想实现Dubbo调用
必须按照Dubbo规定的配置和行业标准的结构来实现
Dubbo调用的好处是直接将要消费的目标(例如order模块中消费stock的方法)编写在当前消费者的业务逻辑层中,无需编写新的代码结构,开发流程不会因为Dubbo而变化
修改stock模块
创建csmall-stock-service项目
如果当前项目会成为Dubbo的生产者
需要将提供给别的服务调用的方法单独编写在一个项目中
这个项目中有的方法,别人才能调用到
pom文件新增了Dubbo和当前项目业务逻辑层接口的依赖,yml文件中要添加dubbo的配置信息:
将业务逻辑层实现类方法声明为Dubbo可调用的方法:
如果当前项目是服务的提供者(生产者)还需要在SpringBoot启动类上添加@EnableDubbo的注解,才能真正让Dubbo功能生效
修改order模块支持Dubbo,因为order模块在Dubbo的调用关系中,既是生产者又是消费者
它消费cart和stock的服务,同时又为business模块提供服务
因为order模块也是生产者@EnableDubbo注解仍然要写
负载均衡:
在实际开发中,一个服务基本都是集群模式的,也就是多个功能相同的项目在运行,这样才能承受更高的并发,这时一个请求到这个服务,就需要确定访问哪一个服务器.

Dubbo框架内部支持负载均衡算法,能够尽可能的让请求在相对空闲的服务器上运行
Dubbo内部默认支持负载均衡算法
在不同的项目中,可能选用不同的负载均衡策略,以达到最好效果
Loadbalance:就是负载均衡的意思
Dubbo内置负载均衡策略算法
Dubbo内置4种负载均衡算法
- **random loadbalance:随机分配策略(默认)**
- round Robin Loadbalance:权重平均分配
- leastactive Loadbalance:活跃度自动感知分配
- consistanthash Loadbalance:一致性hash算法分配
实际运行过程中,每个服务器性能不同
在负载均衡时,都会有性能权重,这些策略算法都考虑权重问题
随机分配策略
随机生成随机数,在哪个范围内让哪个服务器运行
优点:算法简单,效率高,长时间运行下,任务分配比例准确
缺点:偶然性高,如果连续的几个随机请求发送到性能弱的服务器,会导致异常甚至宕机
权重平滑分配:
如果几个服务器权重一致,那么就是依次运行
但是服务器的性能权重一致的可能性很小
所以我们需要权重评滑分配
一个优秀的权重分配算法,应该是让每个服务器都有机会运行的
如果一个集群服务器性能比为5:3:1
1>A 2>A 3>A 4>A 5>A 6>B 7>B 8>B 9>C10>A
上面的安排中,连续请求一个服务器肯定是不好的,我们希望所有的服务器都能够穿插在一起运行
Dubbo2.7之后更新了这个算法使用"**平滑加权算法**"优化权重平均分配策略

活跃度自动感知:
记录每个服务器处理一次请求的时间,安装时间比例来分配任务数,运行一次需要时间多的分配的请求数较少
一致性Hash算法:
根据请求的参数进行hash运算
以后每次相同参数的请求都会访问固定服务器
因为根据参数选择服务器,不能平均分配到每台服务器上
Seata概述:
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务,也是Spring Cloud Alibaba提供的组件
Seata官方文档 https://seata.io/zh-cn/ 更多信息可以通过官方文档获取
单体项目中的事务,使用的技术叫Spring声明式事务能够保证一个业务中所有对数据库的操作要么都成功,要么都失败,来保证数据库的数据完整性,但是在微服务的项目中,业务逻辑层涉及远程调用,当前模块发生异常,无法操作远程服务器回滚,这时要想让远程调用也支持事务功能,就需要使用分布式事务组件Seata
事务的4个特性:ACID特性
- 原子性
- 一致性
- 隔离性
- 永久性
Seata保证微服务远程调用业务的原子性
Seata将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
Seata的运行原理(AT模式)
观察下面事务模型

上面结构是比较典型的远程调用结构
如果account操作数据库失败需要让order模块和storage模块撤销(回滚)操作,声明式事务不能完成这个操作,需要使用Seata来解决

Seata构成部分包含
* 事务协调器TC
* 事务管理器TM
* 资源管理器RM
我们使用AT(自动)模式完成分布式事务的解决
AT模式运行过程
1.事务的发起方(TM)会向事务协调器(TC)申请一个全局事务id,并保存
2.Seata会管理事务中所有相关的参与方的数据源,将数据操作之前和之后的镜像都保存在undo_log表中,这个表是seata组件规定的表,没有它就不能实现效果,依靠它来实现提交(commit)或回滚(roll back)的操作
3.事务的发起方(TM)会连同全局id一起通过远程调用运行资源管理器(RM)中的方法
4.RM接收到全局id,去运行指定方法,并将运行结果的状态发送给TC
5.如果所有分支运行都正常,事务管理器(TM)会通过事务协调器通知所有模块执行数据库操作,真正影响数据库内容,反之如果有任何一个分支模块运行异常,都会通知TC,再由TC通知所有分支将数据库操作回滚,恢复成运行之前的样子

