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

举报
神的孩子在歌唱 发表于 2024/04/30 13:43:25 2024/04/30
【摘要】 前言这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱@TOC 一. 问题概述项目介绍:今天做项目的时候遇到了点问题,首先说一下我的项目结构,我的项目由两个服务组成(如下图所示),公共服务是写一些基础服务的,比如登录认证,用户管理等等,只要是以后其他项目有用到的都会写进去,然后应用端是负责写当前应用相关模块的。两个服务分别用不同的模式存储自己...

前言

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

@TOC

一. 问题概述

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

image-20231124160315924.png

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

大概流程如下

image-20231124162414408.png

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

image-20231124163159361.png

二. 代码展示

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
转载说明:务必注明来源,附带本人博客连接。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。