nacos、feign、hystrix、seata整合

1,166 阅读3分钟

项目说明:

以电商项目为例,分为订单服务、用户服务、库存服务,每个服务用SpringBoot搭建,服务间通过nacos注册,使用feign进行服务间调用,hystrix作熔断降级,seata强一致性保证分布式事务

前期准备:

  1. 代码地址:github.com/yunmengmeng…
  2. 新建数据库,导入sd-order项目下的initial.sql文件
  3. 后期将会补充gateway作网关

启动nacos

下载2.0.3版本的nacos

地址:github.com/alibaba/nac…

配置数据库

解压后,进入conf目录,将nacos-mysql.sql导入数据库,修改application.properties的数据库配置

image.png

启动

进入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中心看到服务已注册

image.png

其余项目依次按上述步骤注册到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配置列表新增配置

image.png

项目配置

新建Person类,并写入以下代码

image.png

项目启动后,可以看到控制台输出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

地址:github.com/seata/seata…

解压后,进入conf目录,打开registry.conf文件,将type属性修改为nacos,nacos配置下应用名称改为seata

image.png

进入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>

项目配置

  • 添加各个项目配置文件里的事务组的名称

image.png

  • 将seata的registry.conf复制到每个项目的resources目录下

  • 修改每个项目下的file.conf文件,注意这里的vgroupMapping.my_test_tx_group = "default"属性,其中my_test_tx_group是yml文件配置的,default是seata.nacos的cluster名称

  • 创建分布式数据源

image.png

分布式事务

申明分布式事务

OrderServiceImpl类方法添加@GlobalTransactional注解

image.png

调用接口

调用http://localhost:8083/create?userId=1&productId=1&count=10&money=100, 执行成功后看到order表生成记录,account和storage数量减少,说明提交成功

注意order表主键的自增值

image.png

将OrderServiceImpl的那一行注释放开,再次调用接口,返回失败

查看order表主键的自增值,主键+1且order表没有新数据,分布式事务回滚成功

image.png

数据库存储

seata默认以文件存储,如果要以数据库存储,需要编辑bin目录下的file.conf,设置为db,同时执行sd-order项目下的seata-db.sql