开发中遇到的问题 -- 回调解决应用端和服务端通信问题

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱

这里写目录标题

    • 一. 问题概述
    • 二. 代码展示
      • 2.1 公共服务端
      • 2.2 应用端

一. 问题概述

项目介绍:今天做项目的时候遇到了点问题,首先说一下我的项目结构,我的项目由两个服务组成(如下图所示),公共服务是写一些基础服务的,比如登录认证,用户管理等等,只要是以后其他项目有用到的都会写进去,然后应用端是负责写当前应用相关模块的。两个服务分别用不同的模式存储自己的表(pgsql),应用端依赖于公共服务端,两个服务都会提供接口给前端。

image-20231124160315924

阐述问题:我再应用端需要使用用户的信息,所以存储了用户id,可是我需要前端调用公共服务删除用户接口时候,公共服务需要知道我是否存储了这个用户id,如果存储了就不能给他删除(如下图),可是公共服务并不依赖应用端,所以不能存储任何关于应用端的接口,那么我应该如何去问应用端呢,而且你要考虑如果有多个应用端的时候,你需要去请求多个应用端询问是否能删除。(以上就是问题的原因)

大概流程如下

image-20231124162414408

问题解决: 目前我想到最好的解决方案是通过回调的方式解决,具体思路如下图:

image-20231124163159361

二. 代码展示

2.1 公共服务端

服务端是java写的

  1. 编写一个实体类
@Data
public class ApplicationService {/*** 服务名*/private String serviceName;/*** 服务路径*/private String serviceUrl;
}
  1. 写一个注册对象
@Slf4j
@Component
public class ApplicationServiceRegistry {private final List<ApplicationService> registeredServices = new ArrayList<>();public void registerService(ApplicationService service) {String serviceUrl = service.getServiceUrl();// 检查是否已经存在具有相同URL的服务for (ApplicationService registeredService : registeredServices) {if (registeredService.getServiceUrl().equals(serviceUrl)) {log.info("URL已经被注册" + serviceUrl);return;}}registeredServices.add(service);}public List<ApplicationService> getRegisteredServices() {return registeredServices;}
}
  1. 注册接口
@Slf4j
@RestController
@RequiredArgsConstructor
public class RegisterController {private final ApplicationServiceRegistry serviceRegistry;@IgnorePermission@PostMapping("/register")public ResultData<String> registerService(@RequestBody ApplicationService request) {serviceRegistry.registerService(request);log.info("注册成功:" + FastJsonUtils.toJson(request));return ResultData.success("注册成功");}
}
  1. 使用
@Component
@RequiredArgsConstructor
public class ServiceRegisterUtils {private final ApplicationServiceRegistry serviceRegistry;@Testpublic void validRegisteredService() {List<ApplicationService> registeredServices = serviceRegistry.getRegisteredServices();for (ApplicationService registeredService : registeredServices) {System.out.println("执行代码逻辑");}}
}

2.2 应用端

应用端是用python写的,如下,注册了 /isDeleteUser 接口

def register():com_url = "http://127.0.0.1:8080/register"data = {"serviceName": "userGroupUser","serviceUrl": "http://127.0.0.1:8000/isDeleteUser"}response = requests.post(com_url, json=data)if response.status_code == 200:# 处理返回的结果return Trueelse:return False

通过以上方法,应用端就能够将接口注册到公共服务,并且接口还是公共服务定义,完全不依赖应用端,应用端只需要请求 /register 接口注册就可以了

如果你还有什么好办法,欢迎留言指教,感谢观看

作者:神的孩子都在歌唱
本人博客:https://blog.csdn.net/weixin_46654114
转载说明:务必注明来源,附带本人博客连接。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32---时钟树

写在前面&#xff1a;一个 MCU 越复杂&#xff0c;时钟系统也会相应地变得复杂&#xff0c;如 STM32F1 的时钟系统比较复杂&#xff0c;不像简单的 51 单片机一个系统时钟就 可以解决一切。对于 STM32F1 系列的芯片&#xff0c;其有多个时钟源&#xff0c;构成了一个庞大的是时…

go学习之json和单元测试知识

文章目录 一、json以及序列化1.概述2.json应用场景图3.json数据格式说明4.json的序列化1&#xff09;介绍2&#xff09;应用案例 5.json的反序列化1&#xff09;介绍2&#xff09;应用案例 二、单元测试1.引子2.单元测试-基本介绍3.代码实现4.单元测试的细节说明5.单元测试的综…

05、基于梯度下降的协同过滤算法

05、基于梯度下降的协同过滤算法理论与实践Python 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。对这个手写数字实部比较感兴趣&#xff0c;作为入门的素材非常合适。 协同过滤算法是一种常用的推荐算法&#xff0c;基于…

通过C#获取Windows设置的夏令时开关

C#获取Windows夏令时开关 // 获取所有的时区信息 var allTimeZones TimeZoneInfo.GetSystemTimeZones().ToList();通过接口可以看到, 字段SupportsDaylightSavingTime代表是否支持配置夏令时 // 获取当前Window设置的时区 var tmpLocal TimeZoneInfo.Local;但是取Local 信息…

leetCode 78.子集 + 回溯算法 + 图解

给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1,2],[3],[1…

Python之学生信息管理系统

目录 一、基础界面实现 1、主函数 2、保持循环&#xff0c;获取用户需求 二、函数实现模块功能 1、添加学生信息 2、删除学生信息 3、修改学生信息 4、查找全部学生信息 5、退出系统 三、整合代码 1、 完整代码 2、完整实现过程 实现 打印功能菜单、添加学生信息、删…

注解方式优雅的实现Redisson分布式锁

1.前言 随着微服务的快速推进&#xff0c;分布式架构也得到蓬勃的发展&#xff0c;那么如何保证多进程之间的并发则成为需要考虑的问题。因为服务是分布式部署模式&#xff0c;本地锁Reentrantlock和Synchnorized就无法使用了&#xff0c;当然很多同学脱口而出的基于Redis的se…

使用canvas实现代码雨高级升阶版【附带源码和使用方法】

文章目录 前言基本绿色的彩色版本飘散雪花状后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;前端面试 &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术需要掌握&#xff0c;正在不断努力填补技术短板。(如果出现错误&…

C++ -- 每日选择题 -- Day2

第一题 1. 下面代码中sizeof(A)结果为&#xff08;&#xff09; #pragma pack(2) class A {int i;union U{char str[13];int i;}u;void func() {};typedef char* cp;enum{red,green,blue}color; }; A&#xff1a;20 B&#xff1a;21 C&#xff1a;22 D&#xff1a;24 答案及解析…

windows文件删除权限

一、普通文件 这里指的是所有可以被随意删除的文件。 二、可更改权限的文件 如果想要删除的文件无法被删除&#xff0c;那大概是权限不够&#xff0c;这时候&#xff1a;鼠标右键、属性、安全、编辑、选择相应的组或用户&#xff08;如果不知道哪个可以全选&#xff0c;反正…

MySQL C代码连接

环境&#xff1a;5.7.42-0ubuntu0.18.04.1 (Ubuntu) mysql接口介绍 初始化mysql指针 用来生成MySQL对象&#xff0c;返回值为MySQL*&#xff0c;MySQL*是MySQL对象的指针。 MySQL在mysql.h中是一个结构体 链接数据库 初始化完毕之后&#xff0c;必须先链接数据库&#xff…

App测试、H5测试及小程序测试

文章目录 前言一、App常见测试要点1.App功能测试1.1.App安装与卸载1.2.App升级测试1.3.App登陆测试1.4.离线测试1.5.触屏及操作测试1.6.App消息推送测试 2.AppUI界面测试3.App兼容性测试-适配/手机适配4.App中断测试5.App网络测试6.App安全测试7.App性能测试8.App测试与web测试…