为了账号安全,请及时绑定邮箱和手机立即绑定

Seata Client配置Nacos学习入门

标签:
微服务
Seata与Nacos简介

Seata 是一个开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。它是一种将本地事务扩展为分布式事务的技术,主要解决微服务架构下分布式系统的事务一致性问题。Seata支持多种编程语言,包括Java、Go等。Seata的核心组件分为三个部分:

  • Transaction Service:全局事务的协调者,负责管理全局事务的生命周期。
  • Resource Service:资源事务的参与者,负责管理本地事务的执行,包括分支事务的提交、回滚等。
  • Model:提供一系列接口,用于注册、发现和管理事务。

Seata通过XA、TCC、SAGA和AT等模式来支持分布式事务,其中AT模式是Seata最常用的事务模式,它不需要任何应用程序代码的侵入,通过Seata的自动事务管理,能够自动识别和管理数据库的读写操作,从而保证分布式环境下的事务一致性。

Nacos的基本功能

Nacos是一个动态服务发现、配置管理和服务管理的平台。它最初的目的是为了解决Spring Cloud服务发现组件Eureka的一些痛点,如Eureka在Spring Cloud Alibaba中已不再维护。Nacos支持基于DNS和HTTP的发现,是一个更现代的服务发现和配置系统。Nacos具有以下功能:

  • 服务发现和健康检测:支持服务注册和发现,通过健康检测功能,确保服务可用性。
  • 动态配置服务:支持配置信息的动态更新和推送,使得配置管理更加灵活。
  • 动态DNS服务:支持基于DNS命名的服务发现。
  • 服务管理和运维:提供服务管理界面,便于运维人员监控和管理服务。

在分布式系统中,Nacos作为一个注册中心,其功能类似于Zookeeper、Consul等。

准备工作
安装Java环境

在开始配置Seata Client和Nacos之前,首先要确保已经安装了Java环境。Java环境的安装步骤如下:

  1. 访问Oracle官网或者OpenJDK官网下载Java开发工具包(JDK)。
  2. 下载完成后,解压下载的文件到指定目录,例如:C:\Program Files\Java\jdk1.8.0_291
  3. 配置环境变量,编辑环境变量的系统属性,添加Java的路径:例如,JAVA_HOME设为C:\Program Files\Java\jdk1.8.0_291PATH中添加%JAVA_HOME%\bin

通过运行命令java -version来验证Java环境是否配置成功。

下载并配置Seata Server

下载并安装Seata Server需要以下步骤:

  1. 访问Seata的GitHub仓库下载最新版本的Seata Server:https://github.com/seata/seata/releases
  2. 解压下载的文件到指定目录,例如:D:\seata-server
  3. 配置Seata Server的配置文件registry.confregistry-nacos.conf,这些配置文件决定了Seata Server如何与Nacos注册中心通信。以下是一个示例配置:

    # registry-nacos.conf
    server.port=8091
    server.nacos.address=127.0.0.1:8848
    server.nacos.namespace=f4596e2b-4f1b-4045-810a-1b3b1f83ab81
    server.nacos.cluster=default
    # registry.conf
    registry = nacos
  4. 启动Seata Server,确保Seata Server运行正常。启动命令如下:
    cd D:\seata-server
    sh ./bin/seata-server.sh -m nacos
下载并配置Nacos Server

下载并安装Nacos Server需要以下步骤:

  1. 访问Nacos的GitHub仓库下载最新版本的Nacos Server:https://github.com/alibaba/Nacos/releases
  2. 解压下载的文件到指定目录,例如:D:\nacos
  3. 配置Nacos Server的配置文件application.properties,该文件中需要设置数据库配置和Nacos配置的相关参数。以下是配置示例:

    # 数据库配置
    spring.datasource.platform=mysql
    nacos.db.num=1
    nacos.db.url=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
    nacos.db.user=root
    nacos.db.password=root
    
    # Nacos配置
    nacos.server.port=8848
    nacos.management.server.port=9848
  4. 启动Nacos Server,确保Nacos Server运行正常。启动命令如下:
    cd D:\nacos\bin
    sh startup.cmd -m standalone
Seata Client配置
Seata Client的引入

Seata Client是Seata的核心组件之一,它帮助应用程序加入到Seata的分布式事务管理中。在Java项目中引入Seata Client可以通过Maven或Gradle等构建工具进行。以下是如何在Maven项目中引入Seata Client的步骤:

  1. 在项目的pom.xml文件中添加Seata Client的依赖:

    <dependency>
       <groupId>io.seata</groupId>
       <artifactId>seata-all</artifactId>
       <version>1.6.0</version>
    </dependency>
  2. 配置Seata Client的配置文件seata.conf,该配置文件位于项目的类路径下,如src/main/resources/config。配置文件中需要指定Seata Server的地址和端口等信息,例如:
    server{
       ## server mode: AT, TCC, SEATA XA, MT
       mode = AT
    }
    service{
       vgroupMapping.my_test_group = "default"
       defaultVgroup = "default"
       registry{
           registryMode = "nacos"
           nacos{
               serverAddr = "127.0.0.1"
               namespace = "f4596e2b-4f1b-4045-810a-1b3b1f83ab81"
               cluster = "default"
           }
       }
       vgroup.my_test_group{
           loadBalance = "leastconnection"
       }
       applicationId = "demo"
       applicationDataDir  = "../data"
    }
Seata Client的配置文件详解

Seata Client的配置文件seata.conf主要包括以下几个部分:

  • server:配置Seata Server的模式,支持AT、TCC、SEATA XA和MT等模式。
  • service:配置Service相关的属性,包括注册中心的类型、Seata Server的地址和端口、服务ID等信息。
    • vgroupMapping:虚拟分组映射,将虚拟分组映射到Seata Server的集群标识符。
    • defaultVgroup:默认的虚拟分组。
    • registry:配置注册中心的信息。
    • registryMode:注册中心的类型,如Zookeeper、Nacos等。
    • nacos:配置Nacos的相关信息,如服务器地址、命名空间和集群名称等。
    • vgroup:配置虚拟分组的负载均衡策略。
    • applicationId:应用程序ID,用于标识一个应用。
    • applicationDataDir:应用程序数据目录,用于指定数据存储的路径。
Nacos作为Seata注册中心配置
Nacos作为注册中心的作用

Nacos作为Seata的注册中心,其主要作用是管理和维护Seata Server、Seata Client的注册与发现。通过Nacos注册中心,Seata Client可以动态发现Seata Server,从而实现服务的自动配置和管理。Nacos注册中心支持高可用、动态配置更新和推送等特性,使得Seata在分布式系统中的运行更加稳定和高效。

配置Seata Client连接Nacos

在Seata Client的配置文件seata.conf中,配置Nacos作为注册中心的方法如下:

  1. 修改registryModenacos,表示使用Nacos作为注册中心。
  2. 配置nacos.serverAddr为Nacos Server的地址和端口。
  3. 配置nacos.namespace为Nacos的命名空间。
  4. 配置nacos.cluster为Seata Server的集群名称。

例如,以下是一个完整的配置文件示例:

server{
   mode = AT
}

service{
   vgroupMapping.my_test_group = "default"
   defaultVgroup = "default"
   registry{
       registryMode = "nacos"
       nacos{
           serverAddr = "127.0.0.1"
           namespace = "f4596e2b-4f1b-4045-810a-1b3b1f83ab81"
           cluster = "default"
       }
   }
   vgroup.my_test_group{
       loadBalance = "leastconnection"
   }
   applicationId = "demo"
   applicationDataDir  = "../data"
}
开发示例
创建一个简单的分布式事务应用

为了更好地理解Seata Client与Nacos的集成,我们将创建一个简单的分布式事务应用程序。假设我们有一个订单服务(Order Service)和库存服务(Stock Service),两个服务之间需要保证事务的一致性。

基础环境搭建

假设你已经有一个Spring Boot项目,以下是项目的基础结构:

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           └── order
│   │               ├── OrderApplication.java
│   │               ├── config
│   │               │   └── SeataConfig.java
│   │               └── service
│   │                   └── OrderService.java
│   └── resources
│       └── application.yml
└── test
    └── java
        └── com
            └── example
                └── order
                    └── OrderApplicationTests.java

配置文件

src/main/resources目录下创建application.yml文件,配置Spring Boot项目的基本信息:

spring:
  application:
   name: order-service
 server:
   port: 8080

seata:
   enabled: true
   service:
       vgroup-mapping:
           default:
               consumer:
                   data:
                       enabled: false
       transaction-service-group: default
       registry:
           type: nacos
           nacos:
               server-addr: 127.0.0.1:8848
               namespace: f4596e2b-4f1b-4045-810a-1b3b1f83ab81
               cluster: default
       application-id: ${spring.application.name}
       config-file: file:resource:${user.dir}/conf/seata.conf

主启动类

创建一个主启动类OrderApplication.java

package com.example.order;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }
}

配置类

创建一个配置类SeataConfig.java,用于动态配置Seata Client连接Nacos:

package com.example.order.config;

import io.seata.common.Configuration;
import io.seata.common.ConfigurationFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SeataConfig {

    @Bean
    public Configuration seataConfig() {
        return ConfigurationFactory.getInstance().getConfig();
    }
}

服务类

创建一个服务类OrderService.java,模拟订单服务的业务逻辑:

package com.example.order.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class OrderService {

    @Autowired
    private StockService stockService;

    @Transactional
    public void createOrder(Long userId, Long productId, Integer quantity) {
        stockService.decreaseStock(productId, quantity);
    }
}

库存服务

假设已经有库存服务StockService.java,其中包含扣减库存的方法:

package com.example.order.service;

import org.springframework.stereotype.Service;

@Service
public class StockService {

    public void decreaseStock(Long productId, Integer quantity) {
        // 扣减库存的逻辑
    }
}

测试

在测试类OrderApplicationTests.java中编写简单的测试用例,验证分布式事务的一致性:

package com.example.order;

import com.example.order.service.OrderService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class OrderApplicationTests {

    @Autowired
    private OrderService orderService;

    @Test
    public void contextLoads() {
        orderService.createOrder(1L, 2L, 1);
    }
}

测试类中,我们调用了订单服务的方法createOrder,该方法中包含了对库存服务的调用。通过这种方式,我们可以验证在分布式环境下,订单服务和库存服务之间的事务一致性。

常见问题与解决方法
常见配置错误及解决办法

在配置Seata Client连接Nacos的过程中,可能会遇到一些常见的配置错误,例如:

  • 配置文件路径错误:确保配置文件seata.conf位于正确的路径下,并且Spring Boot项目能够正确读取到该文件。
    • 解决方法:检查配置文件的路径和名称是否正确,确保配置文件能够被项目正确读取。
  • Nacos配置错误:Nacos的地址、端口或命名空间配置错误,导致Seata Client无法成功注册到Nacos。
    • 解决方法:检查seata.conf文件中的nacos.serverAddrnacos.namespacenacos.cluster等参数是否正确配置。
  • Seata Server未启动:在配置Seata Client时,如果Seata Server未运行,会导致Seata Client无法成功注册和发现服务。
    • 解决方法:检查Seata Server是否已经启动,可以通过Seata Server的日志文件查看启动状态。
Nacos注册失败的排查

当Seata Client配置完成并尝试注册到Nacos时,可能会遇到注册失败的情况。以下是一些排查方法:

  • 检查Nacos Server的状态:确保Nacos Server运行正常,可以通过Nacos的管理界面或者命令行工具查看Nacos的状态。
    • 排查命令curl http://localhost:8848/nacos/naming/nameservice
  • 检查Seata Client的日志:查看Seata Client的日志文件,检查是否有注册失败的相关日志信息。
    • 日志文件路径:一般位于Seata Client的日志目录下,如../data/logs
  • 检查Nacos配置:确保Nacos的配置文件application.properties中的参数配置正确。
    • 配置文件检查项
    • spring.datasource.platform=mysql
    • nacos.db.url
    • nacos.db.user
    • nacos.db.password
    • nacos.server.port
    • nacos.management.server.port
  • 检查Seata Client的配置文件:确保Seata Client的配置文件seata.conf中的registryModenacos.serverAddrnacos.namespacenacos.cluster等参数配置正确。
    • 配置文件检查项
    • registryMode = "nacos"
    • serverAddr = "127.0.0.1"
    • namespace = "f4596e2b-4f1b-4045-810a-1b3b1f83ab81"
    • cluster = "default"
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消