项目说明:
以电商项目为例,分为订单服务、用户服务、库存服务,每个服务用SpringBoot搭建,服务间通过nacos注册,使用feign进行服务间调用,hystrix作熔断降级,seata强一致性保证分布式事务
前期准备:
- 代码地址:github.com/yunmengmeng…
- 新建数据库,导入sd-order项目下的initial.sql文件
- 后期将会补充gateway作网关
启动nacos
下载2.0.3版本的nacos
配置数据库
解压后,进入conf目录,将nacos-mysql.sql导入数据库,修改application.properties的数据库配置
启动
进入bin目录,执行.\startup.cmd -m standalone,启动成功后,输入地址http://localhost:8848/nacos,账号密码为nacos
服务注册
引入jar包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
yml配置
spring:
application:
name: sd-account
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
# 默认为true,如果属性为false,则不注册到nacos
registerEnabled: true
启动
启动项目后,可以在nacos中心看到服务已注册
其余项目依次按上述步骤注册到nacos中心
服务配置
引入jar包
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.0.3.RELEASE</version>
</dependency>
yml配置
新建bootstrap.yml,并写入以下配置
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
# 与配置中心配置格式相同
file-extension: yaml
# 与配置中心data-id相同
name: sd-account
nacos配置
在nacos配置列表新增配置
项目配置
新建Person类,并写入以下代码
项目启动后,可以看到控制台输出Person(name=zhangsan, age=14)
至此,nacos整合完成
Feign与Hystrix
Feign
引入jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启用Feign
在启动类或配置类加注解@EnableFeignClients
服务间调用
以订单服务类调用用户服务类为例,新增AccountClient类
// 调用nacos的sd-account服务
@FeignClient(name = "sd-account")
public interface AccountClient {
@GetMapping("/decrease")
String decrease(@RequestParam Long userId, @RequestParam BigDecimal money);
}
Hystrix
Hystrix用来熔断、降级,Feign的jar包含有Hystrix相关部分,不用再引jar包
启用Hystrix
feign:
hystrix:
enabled: true
项目配置
新建AccountClientHystrix类,并写入以下代码
@Component
public class AccountClientHystrix implements AccountClient {
@Override
public String decrease(Long userId, BigDecimal money) {
return "invoke failed";
}
}
指定AccountClientHystrix为熔断类
@FeignClient(name = "sd-account", fallback = AccountClientHystrix.class)
当调用超时或sd-account服务未启动时,触发回退,最终调用AccountClientHystrix->decrease()方法。
Seata
启动Seata
下载1.4.0版本的seata-server
解压后,进入conf目录,打开registry.conf文件,将type属性修改为nacos,nacos配置下应用名称改为seata
进入bin目录,启动脚本
配置数据库
执行sd-order目录下的seata-initial.sql,本文仅使用一个库,如果是多个数据库,每个库下都要导入该文件
引入jar包
<!-- TM事务发起者 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-seata</artifactId>
<version>${spring-cloud-alibaba-seata.version}</version>
</dependency>
<!-- 连接TC,创建分布式数据源 -->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-all</artifactId>
<version>${seata.version}</version>
</dependency>
项目配置
- 添加各个项目配置文件里的事务组的名称
-
将seata的
registry.conf复制到每个项目的resources目录下 -
修改每个项目下的
file.conf文件,注意这里的vgroupMapping.my_test_tx_group = "default"属性,其中my_test_tx_group是yml文件配置的,default是seata.nacos的cluster名称 -
创建分布式数据源
分布式事务
申明分布式事务
OrderServiceImpl类方法添加@GlobalTransactional注解
调用接口
调用http://localhost:8083/create?userId=1&productId=1&count=10&money=100, 执行成功后看到order表生成记录,account和storage数量减少,说明提交成功
注意order表主键的自增值
将OrderServiceImpl的那一行注释放开,再次调用接口,返回失败
查看order表主键的自增值,主键+1且order表没有新数据,分布式事务回滚成功
数据库存储
seata默认以文件存储,如果要以数据库存储,需要编辑bin目录下的file.conf,设置为db,同时执行sd-order项目下的seata-db.sql