springboot + seata + httpclient调用

这篇具有很好参考价值的文章主要介绍了springboot + seata + httpclient调用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

三个项目,彼此使用seata自带的httpclient来完成相互调用,三个项目分别是:seata_user、seata_msg、seata_online,对应三个数据库。其中seata_online是调用入口,分别调用seata_user、seata_msg,其中当参数等于5的时候,会抛出异常,3个数据库均回滚事务;参数不等于5的时候,3个数据库正常保存数据。

三个项目引入seata的版本如下

        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-spring-boot-starter</artifactId>
            <version>1.6.1</version>
        </dependency>
        <dependency>
            <groupId>io.seata</groupId>
            <artifactId>seata-core</artifactId>
            <version>1.6.1</version>
        </dependency>


        <dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
            <version>2.2.0</version>
        </dependency>

一、seata_user

        1、application.yml

server:
  port: 40023
  undertow:
    # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
    io-threads: 4
    # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
    # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
    worker-threads: 200
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    # 每块buffer的空间大小,越小的空间被利用越充分
    buffer-size: 1024
    # 是否分配的直接内存
    direct-buffers: true

mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  config-location: classpath:mapper/config/sqlMapConfig.xml

spring:
  servlet:
    multipart:
      enabled: true
      max-file-size: 100MB
      max-request-size: 100MB
  application:
    name: seata_user
  datasource:
    dynamic:
      primary: user #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        user:
          url: jdbc:mysql://127.0.0.1:3306/business_platform_demo?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
          username: root
          password: root
          type: com.alibaba.druid.pool.DruidDataSource
          driver-class-name: com.mysql.cj.jdbc.Driver
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    max-active: 100
    max-wait: 1000

management:
  endpoints:
    web:
      exposure:
        include: '*'

swagger:
  title: app端
  scanpackages: com.cn

logging:
  level:
    com.cn: info

servlet:
  multipart:
    enabled: true
    max-file-size: 100MB
    max-request-size: 100MB


# seata配置
seata:
  enabled: true
  # Seata 应用编号,默认为 ${spring.application.name}
  application-id: ${spring.application.name}
  # Seata 事务组编号,用于 TC 集群名
  tx-service-group: ${spring.application.name}-group
  # 开启自动代理
  enable-auto-data-source-proxy: true
  # 服务配置项
  service:
    # 虚拟组和分组的映射
    vgroup-mapping:
      gulimall-order-group: default
    grouplist:
      default: 192.168.3.21:8091
  config:
    type: nacos
    nacos:
      serverAddr: 192.168.3.133:8848
      group: SHOP_GROUP
      namespace: 53e24698-1032-41cc-966f-129931d10ec9
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 192.168.3.133:8848
      namespace: 53e24698-1032-41cc-966f-129931d10ec9
      group: SHOP_GROUP

        2. 在nacos上新建如下配置:service.vgroupMapping.seata_user-group

springboot + seata + httpclient调用

         3.  新建mapper

@Mapper
public interface IUserMapper extends BaseMapper<PortalUserEntity> {
}

         4. 新建service

@Service
@Slf4j
public class UserService {

    @Autowired
    private IUserMapper userMapper;

    @Transactional
    public void saveTmp(PortalUserEntity info) {
        info.setId(SnowflakeIdWorkerUtil.getId());
        info.setAddTime(DateUtil.getTime("yyyy-MM-dd HH:mm:ss"));
        this.userMapper.insert(info);
    }

}

        5. 新建controller

@RestController
@RequestMapping(value = "mobile/demo")
@Api(tags = "Demo")
public class DemoController {

    @Autowired
    private UserService userService;

    @ApiOperation(value = "saveUser")
    @PostMapping(value = "saveUser")
    public ResultMsg saveUser(
            @RequestBody PortalUserEntity user
    ) {
        this.userService.saveTmp(user);
        return ResultMsg.builder();
    }
}

        6. 启动,启动后的地址及端口:http://127.0.0.1:40023/mobile/demo/saveUser

二、seata_msg

        1、application.yml

server:
  port: 40024
  undertow:
    # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
    io-threads: 4
    # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
    # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
    worker-threads: 200
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    # 每块buffer的空间大小,越小的空间被利用越充分
    buffer-size: 1024
    # 是否分配的直接内存
    direct-buffers: true

mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  config-location: classpath:mapper/config/sqlMapConfig.xml

spring:
  servlet:
    multipart:
      enabled: true
      max-file-size: 100MB
      max-request-size: 100MB
  application:
    name: seata_msg
  datasource:
    dynamic:
      primary: company #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        company:
          url: jdbc:mysql://127.0.0.1:3306/business_company_demo?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
          username: root
          password: root
          type: com.alibaba.druid.pool.DruidDataSource
          driver-class-name: com.mysql.cj.jdbc.Driver
      seata: true
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    max-active: 100
    max-wait: 1000

management:
  endpoints:
    web:
      exposure:
        include: '*'

swagger:
  title: seata_user
  scanpackages: com.cn

logging:
  level:
    com.cn: info

servlet:
  multipart:
    enabled: true
    max-file-size: 100MB
    max-request-size: 100MB


# seata配置
seata:
  enabled: true
  # Seata 应用编号,默认为 ${spring.application.name}
  application-id: ${spring.application.name}
  # Seata 事务组编号,用于 TC 集群名
  tx-service-group: ${spring.application.name}-group
  # 开启自动代理
  enable-auto-data-source-proxy: true
  # 服务配置项
  service:
    # 虚拟组和分组的映射
    vgroup-mapping:
      gulimall-order-group: default
    grouplist:
      default: 192.168.3.21:8091
  config:
    type: nacos
    nacos:
      serverAddr: 192.168.3.133:8848
      group: SHOP_GROUP
      namespace: 53e24698-1032-41cc-966f-129931d10ec9
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 192.168.3.133:8848
      namespace: 53e24698-1032-41cc-966f-129931d10ec9
      group: SHOP_GROUP

        2、在nacos上加入以下配置:service.vgroupMapping.seata_msg-group

springboot + seata + httpclient调用

        3、新建mapper

@Mapper
public interface IMsgMapper extends BaseMapper<MsgEntity> {
}

        4、新建service

@Service
@Slf4j
public class MsgService {

    @Autowired
    private IMsgMapper msgMapper;


    @Transactional
    public void saveTmp(MsgEntity info) {
        info.setId(SnowflakeIdWorkerUtil.getId());
        info.setCreateTime(DateUtil.getTime("yyyy-MM-dd HH:mm:ss"));
        this.msgMapper.insert(info);

    }

}

        5、新建controller

@RestController
@RequestMapping(value = "mobile/demo")
public class Demo2Controller {

    @Autowired
    private MsgService msgService;

    @ApiOperation(value = "saveMsg")
    @PostMapping(value = "saveMsg")
    public ResultMsg saveMsg(
            @RequestBody MsgEntity msg
    ) {
        this.msgService.saveTmp(msg);
        return ResultMsg.builder();
    }

}

        6、启动后的访问地址:http://127.0.0.1:40024/mobile/demo/saveMsg

三、seata_online      

        1、application.yml

server:
  port: 40025
  undertow:
    # 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接, 默认设置每个CPU核心一个线程
    io-threads: 4
    # 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载
    # 它的值设置取决于系统线程执行任务的阻塞系数,默认值是IO线程数*8
    worker-threads: 200
    # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
    # 每块buffer的空间大小,越小的空间被利用越充分
    buffer-size: 1024
    # 是否分配的直接内存
    direct-buffers: true

mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
  config-location: classpath:mapper/config/sqlMapConfig.xml

spring:
  servlet:
    multipart:
      enabled: true
      max-file-size: 100MB
      max-request-size: 100MB
  application:
    name: seata_online
  datasource:
    dynamic:
      primary: master #设置默认的数据源或者数据源组,默认值即为master
      strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
      datasource:
        master:
          url: jdbc:mysql://127.0.0.1:3306/business_portal_demo?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
          username: root
          password: root
          type: com.alibaba.druid.pool.DruidDataSource
          driver-class-name: com.mysql.cj.jdbc.Driver
      seata: true
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password:
    max-active: 100
    max-wait: 1000

management:
  endpoints:
    web:
      exposure:
        include: '*'

swagger:
  title: seata_user
  scanpackages: com.cn

logging:
  level:
    com.cn: info

servlet:
  multipart:
    enabled: true
    max-file-size: 100MB
    max-request-size: 100MB



# seata配置
seata:
  enabled: true
  # Seata 应用编号,默认为 ${spring.application.name}
  application-id: ${spring.application.name}
  # Seata 事务组编号,用于 TC 集群名
  tx-service-group: ${spring.application.name}-group
  # 开启自动代理
  enable-auto-data-source-proxy: true
  # 服务配置项
  service:
    # 虚拟组和分组的映射
    vgroup-mapping:
      gulimall-order-group: default
    grouplist:
      default: 192.168.3.21:8091
  config:
    type: nacos
    nacos:
      serverAddr: 192.168.3.133:8848
      group: SHOP_GROUP
      namespace: 53e24698-1032-41cc-966f-129931d10ec9
  registry:
    type: nacos
    nacos:
      application: seata-server
      server-addr: 192.168.3.133:8848
      namespace: 53e24698-1032-41cc-966f-129931d10ec9
      group: SHOP_GROUP

        2、在nacos上加入以下配置:service.vgroupMapping.seata_online-group

springboot + seata + httpclient调用

        3、新建mapper

@Mapper
public interface IOnmessageMapper extends BaseMapper<OnlineMessageEntity> {
}

        4、新建service

@Service
@Slf4j
public class OnMessageService {

    @Autowired
    private IOnmessageMapper onmessageMapper;


    @Transactional
    public void add(OnmessageEdit info) {
        OnlineMessageEntity msg = new OnlineMessageEntity();
        BeanUtils.copyProperties(info, msg);
        msg.setId(SnowflakeIdWorkerUtil.getId());
        msg.setCreateDate(DateUtil.getTime("yyyy-MM-dd HH:mm:ss"));
        if (StringUtils.isEmpty(msg.getImgs())) {
            msg.setImgs("");
        }
        this.onmessageMapper.insert(msg);
    }

}
import com.alibaba.fastjson.JSONObject;
import com.cn.exception.MyException;
import com.cn.msg.ResultMsg;
import com.cn.util.JsonUtil;
import com.cn.web.portal.vo.OnmessageEdit;
import io.seata.integration.http.DefaultHttpExecutor;
import io.seata.spring.annotation.GlobalTransactional;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;



@Service
public class DemoService {

    @Autowired
    private OnMessageService onMessageService;

    private void saveUser() throws IOException {
        // 参数拼接
        JSONObject params = new JSONObject().fluentPut("title", "我爱我的祖国")
                .fluentPut("content", "通知们好,我爱我的祖国");
        // 执行调用
        HttpResponse response = DefaultHttpExecutor.getInstance().executePost("http://127.0.0.1:40024", "/mobile/demo/saveMsg",
                params, HttpResponse.class);
        // 解析结果
        ResultMsg result = JsonUtil.fromJson(EntityUtils.toString(response.getEntity()), ResultMsg.class);
        if (!result.isSuccess()) {
            throw new MyException(result.getMsg());
        }
    }

    private void saveMsg() throws IOException {
        // 参数拼接
        JSONObject params = new JSONObject().fluentPut("phone", "13909384351")
                .fluentPut("userName", "cn_yang").fluentPut("userType", "0").fluentPut("userStatus", 0);
        // 执行调用
        HttpResponse response = DefaultHttpExecutor.getInstance().executePost("http://127.0.0.1:40023", "/mobile/demo/saveUser",
                params, HttpResponse.class);
        ResultMsg result = JsonUtil.fromJson(EntityUtils.toString(response.getEntity()), ResultMsg.class);
        if (!result.isSuccess()) {
            throw new MyException(result.getMsg());
        }
    }

    @GlobalTransactional
    public void save0(Long id) throws IOException {
        saveUser();
        saveMsg();
        OnmessageEdit lineMsg = new OnmessageEdit();
        lineMsg.setTitle("标题").setContent("alsdkfja").setMsgType("0");
        onMessageService.add(lineMsg);
        if (id == 5) {
            throw new MyException("尝试跑出异常");
        }
    }


}

 以上DemoService中,注意一下4个依赖

import io.seata.integration.http.DefaultHttpExecutor; // seata自带的httpclient执行器
import io.seata.spring.annotation.GlobalTransactional; // 全局事务
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;

        5、新建controller

@RestController
@RequestMapping(value = "mobile/demo")
public class Demo2Controller {

    @Autowired
    private DemoService demoService;

    @ApiOperation(value = "save2")
    @GetMapping(value = "save2")
    public ResultMsg save2(
            @ApiParam(name = "id") @RequestParam Long id
    ) {
        try {
            this.demoService.save0(id);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResultMsg.builder();
    }

}

        6、启动后的访问地址:http://127.0.0.1:40025/mobile/demo/save2?id=3  当id=5的时候,抛出异常,事务回滚,三个库里面的数据均恢复原样;当id不等于5的时候,正常插入数据。文章来源地址https://www.toymoban.com/news/detail-409978.html

到了这里,关于springboot + seata + httpclient调用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HTTP POST接口带参数的HttpClient请求方法和调用

    接口自动化测试,今天遇到POST接口带参数,参数在url上,发现原来的工具类中没有该方法,重新调试加上。  doPost方法如下: 参考: [Java 接口自动化框架]httpclient4.5.3(CloseableHttpClient) https的工具类HttpsClientUtils

    2024年02月06日
    浏览(48)
  • postman,浏览器测试接口正常,HttpClient 调用就报错

    一次奔溃的经历 事情是这样的:第三方提供了一个接口需要对接,我就对接了,测试环节的时候怎么都调不通,各种排查,各方人员都动员了起来,就是没有找到问题,下面把问题报错的原因呈上: 就是报错 508 ,返回一个空的 Response body. 刚开始出现这个问题,我怀疑是不

    2024年02月01日
    浏览(40)
  • SpringBoot 项目中 对http调用异常处理

    spring 中 http调用 resp 会返回3个值 status/heard/body 分2种情况的异常 1.status 代表了通信异常, 也是我们常说的 http 状态码         只能是纯数字         200-成功, 404-不能访问的资源, 500-服务器异常         比较坑的是, 有些服务会, 把业务异常和这个进行合并, 或者篡改  2.bod

    2024年02月17日
    浏览(40)
  • 解决Docker部署SpringBoot项目时各容器的相互调用

    目录 一、项目问题场景: 二、问题分析: 三、解决各容器互相调用的办法: 1、第一步: 2、第二步: 3、第三步: 一、项目问题场景: 项目打包成jar包后,通过 可以正常连接我本地的docker容器中的其他服务,如mysql,nacos,sentinel,rabbitmq等等 但是当我将这个jar包打包成镜

    2024年02月16日
    浏览(44)
  • springboot dubbo seata nacos集成 分布式事务seata实现

    官网:http://seata.io/zh-cn/docs/overview/what-is-seata.html Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。 官网;https://cn.dubbo.apache.org/zh-cn/overview/what/

    2024年02月13日
    浏览(48)
  • SpringBoot之RestTemplate使用Apache的HttpClient连接池

    SpringBoot自带的RestTemplate是没有使用连接池的,只是SimpleClientHttpRequestFactory实现了ClientHttpRequestFactory、AsyncClientHttpRequestFactory 2个工厂接口,因此每次调用接口都会创建连接和销毁连接,如果是高并发场景下会大大降低性能。因此,我们可以使用Apache的HttpClient连接池。

    2024年02月11日
    浏览(44)
  • SpringBoot Seata 死锁问题排查

    现象描述:Spring Boot项目,启动的时候卡住了,一直卡在那里不动,没有报错,也没有日志输出 但是,奇怪的是,本地可以正常启动 好吧,姑且先不深究为什么本地可以启动而部署到服务器上就无法启动的问题,这个不是重点,重点是怎么让它启动起来。(PS:我猜测可能是

    2024年02月05日
    浏览(56)
  • Springboot项目中加载Groovy脚本并调用其内部方代码实现

    项目中部署到多个煤矿的上,每一种煤矿的情况都相同,涉及到支架的算法得写好几套,于是想到用脚本实现差异变化多的算法!一开始想到用java调用js脚本去实现,因为这个不需要引入格外的包,js对我来说也没啥学习成本,后来发现js的方法的参数中没办法使用java的对象

    2024年02月07日
    浏览(40)
  • 在springboot项目中调用通义千问api多轮对话并实现流式输出

    阿里灵积提供了详细的官方文档 官方文档中提到只需要把每轮对话中返回结果添加到消息管理器中,就可以实现多轮对话。本质上就是将历史对话再次发送给接口。 官方文档中提出使用streamCall()方法就可以实现流式输出,在 ResultCallbackGenerationResult 参数中可以指点每个事件的

    2024年04月12日
    浏览(52)
  • SpringBoot项目调用openCV报错:nested exception is java.lang.UnsatisfiedLinkError

    今天在通过web项目调用openCV的时候提示如下错误: 如下图所示: 但是通过直接启动java main函数确正常,初步诊断和SpringBoot热加载有关,遂将pom中如下配置注释掉: 重新启动web项目,异常排除。

    2024年01月16日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包