码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【mq】从零开始实现 mq-13-注册鉴权 auth


    前景回顾

    【mq】从零开始实现 mq-01-生产者、消费者启动

    【mq】从零开始实现 mq-02-如何实现生产者调用消费者?

    【mq】从零开始实现 mq-03-引入 broker 中间人

    【mq】从零开始实现 mq-04-启动检测与实现优化

    【mq】从零开始实现 mq-05-实现优雅停机

    【mq】从零开始实现 mq-06-消费者心跳检测 heartbeat

    【mq】从零开始实现 mq-07-负载均衡 load balance

    【mq】从零开始实现 mq-08-配置优化 fluent

    【mq】从零开始实现 mq-09-消费者拉取消息 pull message

    【mq】从零开始实现 mq-10-消费者拉取消息回执 pull message ack

    【mq】从零开始实现 mq-11-消费者消息回执添加分组信息 pull message ack groupName

    【mq】从零开始实现 mq-12-消息的批量发送与回执

    【mq】从零开始实现 mq-13-注册鉴权 auth

    注册鉴权

    我们前面实现了 mq 的基本功能,不过还是存在一个问题,那就是 mq 没有进行鉴权。

    这就会导致如果部署在公网,任何一个机器都可以连接我们的服务,这显然是不够安全的。

    13

    生产者实现

    属性

    生产者启动时新增 2 个属性:

    /**
     * 账户标识
     * @since 0.1.4
     */
    private String appKey;
    
    /**
     * 账户密码
     * @since 0.1.4
     */
    private String appSecret;
    

    注册逻辑调整

    注册时,添加这两个属性到服务端。

    public void registerToBroker() {
        int successCount = 0;
        for(RpcChannelFuture channelFuture : this.channelFutureList) {
            ServiceEntry serviceEntry = new ServiceEntry();
            serviceEntry.setGroupName(groupName);
            serviceEntry.setAddress(channelFuture.getAddress());
            serviceEntry.setPort(channelFuture.getPort());
            serviceEntry.setWeight(channelFuture.getWeight());
    
            BrokerRegisterReq brokerRegisterReq = new BrokerRegisterReq();
            brokerRegisterReq.setServiceEntry(serviceEntry);
            brokerRegisterReq.setMethodType(MethodType.P_REGISTER);
            brokerRegisterReq.setTraceId(IdHelper.uuid32());
            brokerRegisterReq.setAppKey(appKey);
            brokerRegisterReq.setAppSecret(appSecret);
            log.info("[Register] 开始注册到 broker:{}", JSON.toJSON(brokerRegisterReq));
            final Channel channel = channelFuture.getChannelFuture().channel();
            MqCommonResp resp = callServer(channel, brokerRegisterReq, MqCommonResp.class);
            log.info("[Register] 完成注册到 broker:{}", JSON.toJSON(resp));
            if(MqCommonRespCode.SUCCESS.getCode().equals(resp.getRespCode())) {
                successCount++;
            }
        }
        if(successCount <= 0 && check) {
            log.error("校验 broker 可用性,可连接成功数为 0");
            throw new MqException(MqCommonRespCode.P_REGISTER_TO_BROKER_FAILED);
        }
    }
    

    消费者

    消费者连接到 broker 也是类似的,此处不做赘述。

    Broker 的处理

    注册逻辑

    以前注册是直接成功,此处加一个业务判断。

    // 生产者注册
    if(MethodType.P_REGISTER.equals(methodType)) {
        BrokerRegisterReq registerReq = JSON.parseObject(json, BrokerRegisterReq.class);
        if(!brokerRegisterValidService.producerValid(registerReq)) {
            log.error("{} 生产者注册验证失败", JSON.toJSON(registerReq));
            throw new MqException(MqBrokerRespCode.P_REGISTER_VALID_FAILED);
        }
    
        return registerProducerService.register(registerReq.getServiceEntry(), channel);
    }
    

    首先会校验有效性,这个是一个接口,可自行灵活替换。

    其他业务逻辑

    其他业务处理时,都需要 registerProducerService.checkValid(channelId); 进行有效性判断。

    // 生产者注销
    if(MethodType.P_UN_REGISTER.equals(methodType)) {
        registerProducerService.checkValid(channelId);
    
        BrokerRegisterReq registerReq = JSON.parseObject(json, BrokerRegisterReq.class);
        return registerProducerService.unRegister(registerReq.getServiceEntry(), channel);
    }
    

    小结

    注册鉴权实现的原理非常简单,不过可以为安全性提供最基础的保障。

    希望本文对你有所帮助,如果喜欢,欢迎点赞收藏转发一波。

    我是老马,期待与你的下次重逢。

    开源地址

    The message queue in java.(java 简易版本 mq 实现) https://github.com/houbb/mq

    拓展阅读

    rpc-从零开始实现 rpc https://github.com/houbb/rpc

  • 相关阅读:
    手把手教你搭建K8S集群
    基础-MVP图像处理-图像运算算子
    FFmpeg代码编程获取视频信息
    uniapp实现瀑布流
    vue学习之内容渲染
    11. 盛最多水的容器
    List集合详解
    基于RT-Thread的智能家居助手
    python 网络爬虫全流程教学,从入门到实战(requests+bs4+存储文件)
    【项目经验】Redis Sentinel从工程中下线并对业务迁移-进行中
  • 原文地址:https://www.cnblogs.com/houbbBlogs/p/16288416.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号