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

前言

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

这里写目录标题

    • 一. 问题概述
    • 二. 代码展示
      • 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;

    @Test
    public 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 True
    else:
        return False

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++学习专栏【基础知识2】C++数据类型

1、内置数据类型 基本内置类型 C为程序员提供了丰富的内置数据类型以及用户自定义数据类型。以下表格列出了七种基本的 C 数据类型 - 类型关键字布尔值bool字符char整数int浮点数float双精度浮点数double无值void宽字符wchar_t 基本类型中的几种可以使用一个或多个类型修饰符…

RabbitMQ登录控制台显示--你与此网站的连接不是私密连接

一、RabbitMQ默认账号 Note: The default administrator username and password are guest and guest. 注:默认管理员用户名和密码为guest和guest 二、自己修改过或者注册的情况 由于本人之前用过,注册过账号密码,在登录时,用户名账号有异常出现以下问题 解决方案: 因为我的rab…

使用easyExcel框架报错:服务器缺少字体

后台服务使用easyExcel框架生成表格&#xff0c;但是生成的时候报如下的错误&#xff1a; 这种报错其实就是部署服务的服务器缺少字体&#xff0c;正确的方法是安装字体。需要注意的是&#xff0c;测试环境服务器与生产环境服务器的在配置版本上可能存在差异&#xff0c;因此需…

Node.js+Express+Nodemon+Socket.IO构建Web实时通信

陈拓 2023/11/23-2023/11/27 1. 简介 Websocket WebSocket是一种在单个TCP连接上提供全双工通讯的协议。特别适合需要持续数据交换的服务&#xff0c;例如在线游戏、实时交易系统等。 Websocket与Ajax之间的区别 Ajax代表异步JavaScript和XML。它被用作一组Web开发技术&…

全汉电源SN生产日期解读

新买了一个全汉的电脑电源&#xff0c;SN&#xff1a;WZ3191900030&#xff0c;看了几次没想明白&#xff0c;最后估计SN是2023年19周这样来记录日期的。问了一下京东全汉客服&#xff0c;果然就是这样的。那大家如果在闲鱼上看到全汉电源&#xff0c;就知道它的生产日期了。

YOLOv8改进 | 2023 | 通过RFAConv重塑空间注意力(深度学习的前沿突破)

一、本文介绍 本文给大家带来的改进机制是RFAConv&#xff0c;全称为Receptive-Field Attention Convolution&#xff0c;是一种全新的空间注意力机制。与传统的空间注意力方法相比&#xff0c;RFAConv能够更有效地处理图像中的细节和复杂模式(适用于所有的检测对象都有一定的…

C语言——写一个简单函数,找两个数中最大者

#include <stdio.h>int max( int a, int b ) { return a>b ? a:b; }int main() { int a, b;printf("输入两个数:\n");scanf("%d %d", &a, &b);printf("max %d\n", max(a, b));return 0; }输出结果&#xff1a;

Python---文件

文件--- 内存中存放的数据在计算机关机后就会消失。要长久保存数据&#xff0c;就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索&#xff0c;引入了“文件”的概念。 一篇文章、一段视频、一个可执行程序&#xff0c;都可以被保存为一个文件&#xff0c;并赋予一个…

TiDB专题---1、TiDB简介和特性

什么是TiDB TiDB 是一个分布式 NewSQL 数据库&#xff0c;它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议&#xff0c;具有数据强一致的高可用特性&#xff0c;是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。 TiDB 是 PingCAP 公司自主设计、研发…

pycharm编译报错处理

1.c生成工具下载 https://visualstudio.microsoft.com/visual-cpp-build-tools/ 在这里插入图片描述 pip install pycocotools

Python解释器和环境变量配置(超详细)

一、 python解释器下载 1.百度python官网并打开 官网网址&#xff1a;www.python.org/ 在这里插入图片描述 2.选择DownLoads&#xff0c;Windows并打开 3.在下图页面选择你需要的版本下载即可&#xff08;本文以python 3.10.4版本演示&#xff09; 在这里插入图片描述 二、安…

Redis集群模式

Redis集群主要有三种模式 主从复制模式&#xff08;Master-Slave&#xff09;、哨兵模式&#xff08;Sentinel&#xff09;和Cluster模式 主从复制模式&#xff1a;适用于数据备份和读写分离场景&#xff0c;配置简单&#xff0c;但在主节点故障时需要手动切换。哨兵模式&…

Python使用——发送Get请求,模拟http请求 进行SSH连接服务器

前言 本篇博客是python开发的使用案例博客&#xff0c;结合一些具体的案例进行阐述&#xff0c;本篇博客主要内容是使用Python发送Get请求&#xff0c;模拟http请求&#xff0c;后面可以搞个爬虫出来&#xff0c;另外就是如何使用Python进行SSH连接服务器。 其他相关的博客文…

数据结构(超详细讲解!!)第二十六节 图(上)

1.基本概念 图&#xff08;Graph&#xff09;是一种较线性表和树更为复杂的非线性结构。是对结点的前趋和后继个数不加限制的数据结构&#xff0c;用来描述元素之间“多对多”的关系(即结点之间的关系是任意的)。 一个图G &#xff08;V&#xff0c;E&#xff09;由顶点&…

思维跳动:抖店商品怎么设置拼团?

在抖店上销售商品时&#xff0c;设置拼团活动是一种促销策略&#xff0c;可以吸引更多用户参与购买&#xff0c;并增加销量。下面将介绍一些方法和步骤&#xff0c;帮助你在抖店中设置商品的拼团活动。 一、抖店商品怎么设置拼团&#xff1f; 首先&#xff0c;选择适合的商品进…

HP1010 | 业界首款图腾柱 PFC 专用数字控制器震撼来袭!

随着节能标准和客户需求的不断提高&#xff0c;电源解决方案的效率和尺寸也在不断优化&#xff0c;设计紧凑高效的 PFC 电源是一个复杂的开发挑战。随着第三代半导体器件氮化镓和碳化硅的大范围应用&#xff0c;图腾柱无桥 PFC&#xff08;TPPFC&#xff09;应用获得极大的拓展…

Kettle连接到GBase 8s数据库

1&#xff0c;将GBase 8s数据库驱动放到kettle的lib目录下 如下图&#xff0c;在data-integration\lib下添加连接GBase 8s数据库的驱动gbasedbtjdbc.jar(视Server版本&#xff0c;增加匹配的驱动) 2&#xff0c;在 文件 -> 新建 -> 数据库连接 或者是在 转换 -> D…

Python 利用aiohttp异步流式下载文件

背景 本篇文章为小编翻译文章&#xff0c;小编在查找资料时看到的一篇文章&#xff0c;看了后感觉不错&#xff0c;就翻译过来&#xff0c;供大家参考学习 文章原文地址&#xff1a;https://www.slingacademy.com/article/python-aiohttp-how-to-download-files-using-stream…

6、Qt延时的使用

一、sleep() 1、说明 QThread类中如下三个静态函数&#xff1a; QThread::sleep(n); //延迟n秒 QThread::msleep(n); //延迟n毫秒 QThread::usleep(n); //延迟n微妙 这种方式使用简单&#xff0c;但是会阻塞线程&#xff0c;有界面时界面会卡死&#xff0c;一般在非GUI线…

Linux常用命令——cd命令

文章目录 1. 简介2. 命令参数3. 常见用法与实例3.1 基本用法3.2 使用绝对路径或相对路径3.3 使用特殊字符3.4 使用参数 4. 总结 1. 简介 cd命令是Linux系统中最基础且频繁使用的命令之一&#xff0c;用于改变当前工作目录。它是“change directory”的缩写&#xff0c;对于任何…