Nacos源码学习系列服务端第13篇udp推送与ack机制

本文深入探讨Nacos服务端的UDP推送服务,包括UdpPushService和UdpConnector类的实现,讲解了同步和异步推送方式、回调处理、失败重试策略,以及客户端ACK数据格式。内容涵盖了从初始化接收者到数据发送的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

udp推送服务类(UdpPushService)

UDP推送渠道(UdpConnector )

初始化UDP接收者

 发送数据

 异步发送

 失败重试

 总结


学习目标:通过本章节的学习,要了解两种推送方式的区别、回调的内部实现和回调结果的处理时机以及失败重试的内部实现是怎么样的。

udp推送服务类(UdpPushService)

public class UdpPushService implements ApplicationContextAware, ApplicationListener<ServiceChangeEvent> {
    //提供同步和异步的udp发送功能
    //提供可回调和重试 也可提供不可靠的发送功能    
    private final UdpConnector udpConnector;


    /**
     * Push Data without callback.
     *
     * @param subscriber  subscriber
     * @param serviceInfo service info
     */
    public void pushDataWithoutCallback(Subscriber subscriber, ServiceInfo serviceInfo) {
        String serviceName = subscriber.getServiceName();
        try {
            //组装数据体
            AckEntry ackEntry = prepareAckEntry(subscriber, serviceInfo);
               ....
            udpConnector.sendData(ackEntry);
        } catch (Exception e) {
        }
    }
    
    /**
     * Push Data with callback.
     *
     * @param subscriber   subscriber
     * @param serviceInfo  service info
     * @param pushCallBack callback
     */
    public void pushDataWithCallback(Subscriber subscriber, ServiceInfo serviceInfo, 
         PushCallBack pushCallBack) {
        String serviceName = subscriber.getServiceName();
        try {
            AckEntry ackEntry = prepareAckEntry(subscriber, serviceInfo);
            udpConnector.sendDataWithCallback(ackEntry, pushCallBack);
        } catch (Exception e) {
           ....
        }
    }

 
    private AckEntry prepareAckEntry(Subscriber subscriber, ServiceInfo serviceInfo) {
        InetSocketAddress socketAddress = new InetSocketAddress(subscriber.getIp(), 
             subscriber.getPort());
        long lastRefTime = System.nanoTime();
        return prepareAckEntry(socketAddress, 
                 prepareHostsData(JacksonUtils.toJson(serviceInfo)), lastRefTime);
    }
    
    private static AckEntry prepareAckEntry(PushClient client, Map<String, Object> data, 
             long lastRefTime) {
        return prepareAckEntry(client.getSocketAddr(), data, lastRefTime);
    }
    
    //设置lastRefTime属性根据ip port 构成AckEntry 的key
    //
    private static AckEntry prepareAckEntry(InetSocketAddress socketAddress, Map<String, 
           Object> data, long lastRefTime) {
        data.put("lastRefTime", lastRefTime);
        String dataStr = JacksonUtils.toJson(data);
       ....
       // 把map转成bytes
            byte[] dataBytes = dataStr.getBytes(StandardCharsets.UTF_8);
            dataBytes = compressIfNecessary(dataBytes);
            return prepareAckEntry(socketAddress, dataBytes, data, lastRefTime);
        ....
    }
    
    private static AckEntry prepareAckEntry(PushClient client, byte[] dataBytes, 
                 Map<String, Object> data,
            long lastRefTime) {
        return prepareAckEntry(client.getSocketAddr(), da
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值