springcloud -远程调用方式

如果我们要进行远程微服之间的调用该如何完成呢,本文以案例推动以养老系统中老人支付购买商品为例,一步步实现远程微服务的调用。

目标

微服务之间的调用方式

image-20231208093750862

老人支付

common模块设计

统一返回

package com.wnhz.ssc.common.result;import lombok.Getter;@Getter
public enum RespCode {SUCCESS(2000,"success"),FAILED(5000,"success"),INFO(8000,"INFO");int code;String msg;RespCode(int code, String msg) {this.code = code;this.msg = msg;}
}
package com.wnhz.ssc.common.result;import lombok.Getter;
import java.util.Date;/*** 设计统一的返回对象* @param <T>*/
@Getter
public class HttpResp<T> {private int code;private String msg;private T result;private Date time;private HttpResp(){}public static <T> HttpResp<T> success(T result){HttpResp<T> httpResp = new HttpResp<>();httpResp.code=RespCode.SUCCESS.getCode();httpResp.msg = RespCode.SUCCESS.getMsg();httpResp.result = result;httpResp.time = new Date();return httpResp;}public static <T> HttpResp<T> failed(T result){HttpResp<T> httpResp = new HttpResp<>();httpResp.code=RespCode.FAILED.getCode();httpResp.msg = RespCode.FAILED.getMsg();httpResp.result = result;httpResp.time = new Date();return httpResp;}}

支付模块

image-20231208121550634

拆分业务

image-20231208094538261

实体类

image-20231208102244501

package com.wnhz.ssc.domain.entity.po;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;
import java.util.Date;/*** 交易的实体类*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("tranx_tab")
public class Tranx {@TableId(value = "tranx_id")private Long id;@TableField("tranx_account")private Long account;@TableField("tranx_money")private BigDecimal money;@TableField("tranx_status")private String status;@TableField("tranx_create_time")private Date createTime;
}

image-20231208111403166

package com.wnhz.ssc.domain.entity.po;import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;
import java.util.Date;
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("account_tab")
public class Account {@TableId(value = "account_id")private Long id;@TableField("account_num")private Long num;@TableField("account_password")private String password;@TableField("account_status")private String status;@TableField("account_balance")private BigDecimal balance;@TableField("account_create_time")private Date createTime;
}

配置

bootstrap.yml

spring:application:name: ssc-cloud-paycenter#nacos配置cloud:nacos:config:server-addr: 192.168.201.81:7777namespace: ssc-cloud-idfile-extension: yamlshared-configs:- data-id: db.yamlgroup: DEVrefresh: true- data-id: mbatisplus.yamlgroup: DEVrefresh: truediscovery:server-addr: ${spring.cloud.nacos.config.server-addr}namespace: ${spring.cloud.nacos.config.namespace}group: DEV

老人模块

支付业务

bootstrap.yml

spring:application:name: ssc-cloud-older#nacos配置cloud:nacos:config:server-addr: 192.168.201.81:7777namespace: ssc-cloud-idfile-extension: yamldiscovery:server-addr: ${spring.cloud.nacos.config.server-addr}namespace: ${spring.cloud.nacos.config.namespace}group: DEV

创建RestTemplate

@Configuration
public class SscConfig {@Autowiredprivate RestTemplateBuilder restTemplateBuilder;@Beanpublic RestTemplate restTemplate() {return restTemplateBuilder.build();}
}

controller调用

@RestController
@RequestMapping("/api/older")
public class OlderController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/getBlance")public HttpResp getBalance(long phone){String url = "http://localhost:20001/api/paycenter/getByNum?num="+phone;ResponseEntity<HttpResp> entity = restTemplate.getForEntity(url,HttpResp.class);return entity.getBody();}
}

测试

GET http://localhost:20010/api/older/getBlance?phone=1233321

远程调用

RestTemplate

将微服务能够负载均衡调用

loadBalance

     <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
  @LoadBalanced@Beanpublic RestTemplate restTemplate() {return restTemplateBuilder.build();}

image-20231208145809130

feign(OpenFeign)

带参数: @RequestParam

@FeignClient(value = "ssc-cloud-paycenter")
public interface IPaycenterFeign {@GetMapping("/api/paycenter/getByNum")HttpResp<Account> getByNum(@RequestParam("num") long num);
}
  <dependencies><dependency><groupId>com.wnhz.ssc.cloud.common</groupId><artifactId>ssc-cloud-common</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>com.wnhz.ssc.cloud.paycenter.api</groupId><artifactId>ssc-cloud-paycenter-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies>

大家有兴趣可以尝试完成以下业务

老人模块进行支付业务。

  1. 和支付模块进行连接,验证用户的用户名num、密码password 确认连接成功。在连接成功后.
  2. 在确认连接成功后,产生token,时间30分钟,30分钟后如果在进行支付查询等业务,需要重新连接。将token存储redis中。
  3. 连接后,进行查询,支付等业务,需要携带连接的token,进行远程操作。
  4. 如果token过期,篡改等行为,终止连接,并通知调用方。
  5. 支付过程需要使用异步方式完成(自定义线程池)。
  6. 页面
  7. 老人模块等待支付的响应,在30秒没有响应,继续等待1分钟,3分钟,如果3分钟之后任然没有获取结果则发起请求查询。
  8. 请将交易记录记。录到tranx_tab中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2813720.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

书生·浦语大模型全链路开源体系介绍

背景介绍 随着人工智能技术的迅猛发展&#xff0c;大模型技术已成为当今人工智能领域的热门话题。2022 年 11 月 30 日&#xff0c;美国 OpenAI 公司发布了 ChatGPT 通用型对话系统 并引发了全球 的极大关注&#xff0c;上线仅 60 天月活用户数便超过 1 亿&#xff0c;成为历史…

开源人脸检测模型MTCNN简单的例子

阅读本文之前可以先参阅----神经网络中的重要概念 如何快速入门深度学习 当使用MTCNN模型进行人脸检测时&#xff0c;你可以使用Python编程语言和相应的深度学习库来实现。下面是一个简单的例子&#xff0c;演示了如何使用MTCNN模型进行人脸检测&#xff1a; 首先&#xff0c;…

每日学习总结20240227

每日总结 20240227 1.如何将字符串通过串口以十六进制进行传输 将文件名或者文件内容通过串口传输&#xff0c;再解析&#xff0c;拼接成源文件 1.1 文件转换 1.1.1 转十六进制 在Linux中&#xff0c;你可以使用 xxd 命令将文本文件转换为十六进制格式。以下是如何在Linux中…

天翼云登录参数JavaSrcipt逆向

天翼云登录参数 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目标网站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目标参数 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四个参数 …

【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

&#x1f38a;【蓝桥杯嵌入式】专题正在持续更新中&#xff0c;原理图解析✨&#xff0c;各模块分析✨以及历年真题讲解✨都已更新完毕&#xff0c;欢迎大家前往订阅本专题&#x1f38f; &#x1f38f;【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 &#x1f38f;【蓝桥杯嵌入式】蓝桥…

软件测试笔记(三):黑盒测试

1 黑盒测试概述 黑盒测试也叫功能测试&#xff0c;通过测试来检测每个功能是否都能正常使用。在测试中&#xff0c;把程序看作是一个不能打开的黑盒子&#xff0c;在完全不考虑程序内部结构和内部特性的情况下&#xff0c;对程序接口进行测试&#xff0c;只检查程序功能是否按…

Web前端3D JS框架和库 整理

在WebGL库和SVG/Canvas元素的支持下&#xff0c;JavaScript变得惊人的强大。几乎可以为网络构建任何东西&#xff0c;包括基于浏览器的游戏和本地应用&#xff0c;许多最新的突破性功能都在3D上运行。 为此&#xff0c;「数维图小编」整理了19个交互式3D Javascript库和框架&am…

开心的金明

好久没发文章了&#xff0c;随着这一题开始2024年吧&#xff01; 题目描述 金明今天很开心&#xff0c;家里购置的新房就要领钥匙了&#xff0c;新房里有一间他自己专用的很宽敞的房间。更让他高兴的是&#xff0c;妈妈昨天对他说&#xff1a;“你的房间需要购买哪些物品&…

每日一练:LeeCode-235、二叉搜索树的最近公共祖先【二叉搜索树+DFS+从上往下】

本文是力扣每日一练&#xff1a;LeeCode-235、二叉搜索树的最近公共祖先【二叉搜索树DFS从上往下】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百…

idea2023新UI风格不见了怎么办?

用了一段时间idea2023,有一天不知道点了什么&#xff0c;整个UI又变成了2022的风格 如果想换成2023的UI风格怎么办&#xff1f; 点击file->setting->new UI->勾选Enable new UI&#xff0c;restart就可以回到最新版本的UI了 新风格

wu-framework-parent 项目明细

wu-framework-parent 介绍 springboot 版本3.2.1 wu-framework-parent 是一款由Java语言开发的框架&#xff0c;目标不写代码但是却能完成功能。 框架涵盖无赖ORM( wu-database-lazy-starter)、仿生组件 、easy框架系列【Easy-Excel、easy-listener、easy-upsert】 授权框架(…

【C++进阶】STL容器--list底层剖析(迭代器封装)

目录 前言 list的结构与框架 list迭代器 list的插入和删除 insert erase list析构函数和拷贝构造 析构函数 拷贝构造 赋值重载 迭代器拷贝构造、析构函数实现问题 const迭代器 思考 总结 前言 前边我们了解了list的一些使用及其注意事项&#xff0c;今天我们进一步深入…

对于大前端开发来说,转鸿蒙开发究竟是福还是祸?

从铺天盖地的市场消息来看&#xff0c;华为即将面世的鸿蒙NEXT系统已经势不可挡了 想必大家都已经迫不及待地想要进行尝试。 估计大家都有着同样的疑问&#xff1a; 会不会是下一个风口&#xff1f;转鸿蒙应用开发难吗&#xff1f; 会不会是下一个风口&#xff1f; 自从鸿蒙…

C++:类与对象(3)

创作不易&#xff0c;感谢三连 一、深入解析构造函数 如上图&#xff0c;在一般情况下&#xff0c;我们认为A类中的_a1和_a2只不过是声明&#xff0c;并没有开空间&#xff0c;而真正的空间开辟是在【定义】的时候&#xff0c;也就是我们根据这个类实例化出整个对象的时候。 …

高级RAG:从理论到 LlamaIndex 实现,解决原始 RAG 管道的局限性

原文地址&#xff1a;Advanced Retrieval-Augmented Generation: From Theory to LlamaIndex Implementation 如何通过在 Python 中实现有针对性的高级 RAG 技术来解决原始 RAG 管道的局限性 2024 年 2 月 19 日 如何通过在 Python 中实现有针对性的高级 RAG 技术来解决 naiv…

【LeetCode刷题】146. LRU 缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -…

【数据结构】B树,B+树,B*树

文章目录 一、B树1.B树的定义2.B树的插入3.B树的中序遍历 二、B树和B*树1.B树的定义2.B树的插入3.B*树的定义4.B树系列总结 三、B树与B树的应用 一、B树 1.B树的定义 1. 在内存中搜索效率高的数据结构有AVL树&#xff0c;红黑树&#xff0c;哈希表等&#xff0c;但这是在内存…

SpreadJS+vue3练手使用

SpreadJS的练手使用 // 首先在 package.json 这个文件里{"name": "app-admin","private": true,"version": "0.0.0","type": "module","scripts": {"dev": "vite",&quo…

前端——WEB-API那些有意思的api

1.URL和URLSearchParams 一个用于解析URL&#xff0c;一个用于查询URL的Parmas <script >let url http://zyfp-fof.ss.gofund.cn/list?type0&dst1let urlApinew URL(url)let dstnew URLSearchParams(urlApi.search).get(dst)console.log(dst);</script> 我…

猫头虎分享已解决Bug || 节点失联(Node Disconnection):NodeLost, ClusterNodeFailure

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …