IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 【Seata】Seata+Http调用方式,保证事务的一致性 -> 正文阅读

[网络协议]【Seata】Seata+Http调用方式,保证事务的一致性

场景:有A和B两个服务,均已集成nacos、seata服务。

A服务中修改表数据后再调B服务,B服务中再保存一条数据。服务之间用Http形式调用(dubbo调用肯定没问题,已在用)

期望:保持事务一致性,不希望出现A服务修改数据成功,B服务保存数据失败,要么都成功,要么都失败。

实现:正常情况下是没问题的,出异常后事物回滚需要验证。

A服务:?调用B服务后,制造一个异常信息。? ? ??

    Map<String, String> params = Maps.newHashMap();
    params.put("username", "123");
    JSONObject postResult = HttpUtils.post("http://localhost:8081/ipc-report/test/save", 
    params, JSONObject.class);
    System.out.println("------:" + JSONUtil.toJsonStr(postResult));
    int i = 1 / 0;
    HttpPost post = new HttpPost(url);
    if (StringUtil.isNotEmpty(postData)) {
        post.addHeader("Content-type", "application/json");
        post.addHeader("token", "123");
        post.addHeader("loginSource", "1");
        post.addHeader(RootContext.KEY_XID, RootContext.getXID());
        StringEntity entity = new StringEntity(postData, "UTF-8");
        post.setEntity(entity);
    }

上方代码为调用B服务,并制造一个异常。在调用时,向header中放三个值。

B服务:获得header中的数据,并保存一条数据

    @ApiOperation(value = "添加用户")
    @PostMapping("/save")
    public ApiResult<Boolean> save(@Validated @RequestBody TestUserSaveModel saveModel, HttpServletRequest request) {
        String token = request.getHeader("token");
        String loginSource = request.getHeader("loginSource");
        String username = saveModel.getUsername();
        System.out.println("----- token: " + token);
        System.out.println("----- loginSource: " + loginSource);
        System.out.println("----- username: " + username);
        testUserService.saveUser(saveModel);
        return ApiResult.success("添加用户成功", true);
    }

结果:

A服务日志如下:

B服务日志如下:

seata也是直接通过mvc中拦截器去获取事务ID,只要在请求头上附上对应的header即可:

post.addHeader(RootContext.KEY_XID, RootContext.getXID());

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-12-10 11:24:18  更:2021-12-10 11:25:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:15:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码