天天观天下!四个维度搞懂 Nacos 注册中心
清一色财经 2023-05-06 22:27:41

现如今市面上注册中心的轮子很多,我实际使用过的就有三款:Eureka、Gsched、Nacos,由于当前参与 Nacos 集群的维护和开发工作,期间也参与了 Nacos 社区的一些开发和 Bug Fix 工作,过程中对 Nacos 原理有了一定的积累,今天给大家分享一下 Nacos 动态服务发现的原理。

大家好呀,我是楼仔。


(资料图片仅供参考)

现如今市面上注册中心的轮子很多,我实际使用过的就有三款:Eureka、Gsched、Nacos,由于当前参与 Nacos 集群的维护和开发工作,期间也参与了 Nacos 社区的一些开发和 Bug Fix 工作,过程中对 Nacos 原理有了一定的积累,今天给大家分享一下 Nacos 动态服务发现的原理。

不 BB,上文章目录:

1、什么是动态服务发现?

服务发现是指使用一个注册中心来记录分布式系统中的全部服务的信息,以便其他服务能够快速的找到这些已注册的服务。

在单体应用中,DNS+Nginx 可以满足服务发现的要求,此时服务的IP列表配置在 nginx 上。在微服务架构中,由于服务粒度变的更细,服务的上下线更加频繁,我们需要一款注册中心来动态感知服务的上下线,并且推送IP列表变化给服务消费者,架构如下图。

2、Nacos 实现动态服务发现的原理

Nacos实现动态服务发现的核心原理如下图,我们接下来的内容将围绕这个图来进行。

2.1 通讯协议

整个服务注册与发现过程,都离不开通讯协议,在1.x的 Nacos 版本中服务端只支持 http 协议,后来为了提升性能在2.x版本引入了谷歌的 grpc,grpc 是一款长连接协议,极大的减少了 http 请求频繁的连接创建和销毁过程,能大幅度提升性能,节约资源。

据官方测试,Nacos服务端 grpc 版本,相比 http 版本的性能提升了9倍以上。

2.2 Nacos 服务注册

简单来讲,服务注册的目的就是客户端将自己的ip端口等信息上报给 Nacos 服务端,过程如下:

创建长连接:Nacos SDK 通过Nacos服务端域名解析出服务端ip列表,选择其中一个ip创建 grpc 连接,并定时检查连接状态,当连接断开,则自动选择服务端ip列表中的下一个ip进行重连。健康检查请求:在正式发起注册之前,Nacos SDK 向服务端发送一个空请求,服务端回应一个空请求,若Nacos SDK 未收到服务端回应,则认为服务端不健康,并进行一定次数重试,如果都未收到回应,则注册失败。发起注册:当你查看Nacos java SDK的注册方法时,你会发现没有返回值,这是因为Nacos SDK做了补偿机制,在真实给服务端上报数据之前,会先往缓存中插入一条记录表示开始注册,注册成功之后再从缓存中标记这条记录为注册成功,当注册失败时,缓存中这条记录是未注册成功的状态,Nacos SDK开启了一个定时任务,定时查询异常的缓存数据,重新发起注册。

Nacos SDK注册失败时的自动补偿机制时序图。

相关源码如下:

@Overridepublic void registerService(String serviceName, String groupName, Instance instance) throws NacosException {    NAMING_LOGGER.info("[REGISTER-SERVICE] {} registering service {} with instance {}", namespaceId, serviceName,            instance);        //添加redo日志    redoService.cacheInstanceForRedo(serviceName, groupName, instance);    doRegisterService(serviceName, groupName, instance);}public void doRegisterService(String serviceName, String groupName, Instance instance) throws NacosException {   //向服务端发起注册    InstanceRequest request = new InstanceRequest(namespaceId, serviceName, groupName,            NamingRemoteConstants.REGISTER_INSTANCE, instance);    requestToServer(request, Response.class);    //标记注册成功    redoService.instanceRegistered(serviceName, groupName);}

执行补偿定时任务RedoScheduledTask。

@Overridepublic void run() {    if (!redoService.isConnected()) {        LogUtils.NAMING_LOGGER.warn("Grpc Connection is disconnect, skip current redo task");        return;    }    try {        redoForInstances();        redoForSubscribes();    } catch (Exception e) {        LogUtils.NAMING_LOGGER.warn("Redo task run with unexpected exception: ", e);    }}  private void redoForInstances() {    for (InstanceRedoData each : redoService.findInstanceRedoData()) {        try {            redoForInstance(each);        } catch (NacosException e) {            LogUtils.NAMING_LOGGER.error("Redo instance operation {} for {}@@{} failed. ", each.getRedoType(),                    each.getGroupName(), each.getServiceName(), e);        }    }}
服务端数据同步(Distro协议):Nacos SDK只会与服务端某个节点建立长连接,当服务端接受到客户端注册的实例数据后,还需要将实例数据同步给其他节点。Nacos自己实现了一个一致性协议名为Distro,服务注册的时候会触发Distro一次同步,每个Nacos节点之间会定时互相发送Distro数据,以此保证数据最终一致。服务实例上线推送:Nacos服务端收到服务实例数据后会将服务的最新实例列表通过grpc推送给该服务的所有订阅者。服务注册过程源码时序图:整理了一下服务注册过程整体时序图,对源码实现感兴趣的可以按照根据这个时序图view一下源码。

2.3 Nacos 心跳机制

目前主流的注册中心,比如Consul、Eureka、Zk包括我们公司自研的Gsched,都是通过心跳机制来感知服务的下线。Nacos也是通过心跳机制来实现的。

Nacos目前SDK维护了两个分支的版本(1.x、2.x),这两个版本心跳机制的实现不一样。其中1.x版本的SDK通过http协议来定时向服务端发送心跳维持自己的健康状态,2.x版本的SDK则通过grpc自身的心跳机制来保活,当Nacos服务端接受不到服务实例的心跳,会认为实例下线。如下图:

grpc监测到连接断开事件,发送ClientDisconnectEvent。

public class ConnectionBasedClientManager extends ClientConnectionEventListener implements ClientManager {  //连接断开,发送连接断开事件public boolean clientDisconnected(String clientId) {    Loggers.SRV_LOG.info("Client connection {} disconnect, remove instances and subscribers", clientId);    ConnectionBasedClient client = clients.remove(clientId);    if (null == client) {        return true;    }    client.release();    NotifyCenter.publishEvent(new ClientEvent.ClientDisconnectEvent(client));    return true;}}

移除客户端注册的服务实例

public class ClientServiceIndexesManager extends SmartSubscriber {  @Override    public void onEvent(Event event) {    //接收失去连接事件        if (event instanceof ClientEvent.ClientDisconnectEvent) {            handleClientDisconnect((ClientEvent.ClientDisconnectEvent) event);        } else if (event instanceof ClientOperationEvent) {            handleClientOperation((ClientOperationEvent) event);        }    }    private void handleClientDisconnect(ClientEvent.ClientDisconnectEvent event) {        Client client = event.getClient();        for (Service each : client.getAllSubscribeService()) {            removeSubscriberIndexes(each, client.getClientId());        }        //移除客户端注册的服务实例        for (Service each : client.getAllPublishedService()) {            removePublisherIndexes(each, client.getClientId());        }    }        //移除客户端注册的服务实例    private void removePublisherIndexes(Service service, String clientId) {        if (!publisherIndexes.containsKey(service)) {            return;        }        publisherIndexes.get(service).remove(clientId);        NotifyCenter.publishEvent(new ServiceEvent.ServiceChangedEvent(service, true));    }}

2.4 Nacos 服务订阅

当一个服务发生上下线,Nacos如何知道要推送给哪些客户端?

Nacos SDK 提供了订阅和取消订阅方法,当客户端向服务端发起订阅请求,服务端会记录发起调用的客户端为该服务的订阅者,同时将服务的最新实例列表返回。当客户端发起了取消订阅,服务端就会从该服务的订阅者列表中把当前客户端移除。

当客户端发起订阅时,服务端除了会同步返回最新的服务实例列表,还会异步的通过grpc推送给该订阅者最新的服务实例列表,这样做的目的是为了异步更新客户端本地缓存的服务数据。

当客户端订阅的服务上下线,该服务所有的订阅者会立刻收到最新的服务列表并且将服务最新的实例数据更新到内存。

我们也看一下相关源码,服务端接收到订阅数据,首先保存到内存中。

@Overridepublic void subscribeService(Service service, Subscriber subscriber, String clientId) {    Service singleton = ServiceManager.getInstance().getSingletonIfExist(service).orElse(service);    Client client = clientManager.getClient(clientId);    //校验长连接是否正常    if (!clientIsLegal(client, clientId)) {        return;    }    //保存订阅数据    client.addServiceSubscriber(singleton, subscriber);    client.setLastUpdatedTime();    //发送订阅事件    NotifyCenter.publishEvent(new ClientOperationEvent.ClientSubscribeServiceEvent(singleton, clientId));}    private void handleClientOperation(ClientOperationEvent event) {    Service service = event.getService();    String clientId = event.getClientId();    if (event instanceof ClientOperationEvent.ClientRegisterServiceEvent) {        addPublisherIndexes(service, clientId);    } else if (event instanceof ClientOperationEvent.ClientDeregisterServiceEvent) {        removePublisherIndexes(service, clientId);    } else if (event instanceof ClientOperationEvent.ClientSubscribeServiceEvent) {    //处理订阅操作        addSubscriberIndexes(service, clientId);    } else if (event instanceof ClientOperationEvent.ClientUnsubscribeServiceEvent) {        removeSubscriberIndexes(service, clientId);    }}

然后发布订阅事件。

private void addSubscriberIndexes(Service service, String clientId) {    //保存订阅数据    subscriberIndexes.computeIfAbsent(service, (key) -> new ConcurrentHashSet<>());    // Fix #5404, Only first time add need notify event.    if (subscriberIndexes.get(service).add(clientId)) {    //发布订阅事件        NotifyCenter.publishEvent(new ServiceEvent.ServiceSubscribedEvent(service, clientId));    }}

服务端自己消费订阅事件,并且推送给订阅的客户端最新的服务实例数据。

@Overridepublic void onEvent(Event event) {    if (!upgradeJudgement.isUseGrpcFeatures()) {        return;    }    if (event instanceof ServiceEvent.ServiceChangedEvent) {        // If service changed, push to all subscribers.        ServiceEvent.ServiceChangedEvent serviceChangedEvent = (ServiceEvent.ServiceChangedEvent) event;        Service service = serviceChangedEvent.getService();        delayTaskEngine.addTask(service, new PushDelayTask(service, PushConfig.getInstance().getPushTaskDelay()));    } else if (event instanceof ServiceEvent.ServiceSubscribedEvent) {        // If service is subscribed by one client, only push this client.        ServiceEvent.ServiceSubscribedEvent subscribedEvent = (ServiceEvent.ServiceSubscribedEvent) event;        Service service = subscribedEvent.getService();        delayTaskEngine.addTask(service, new PushDelayTask(service, PushConfig.getInstance().getPushTaskDelay(),                subscribedEvent.getClientId()));    }}

2.5 Nacos 推送

推送方式

前面说了服务的注册和订阅都会发生推送(服务端->客户端),那推送到底是如何实现的呢?

在早期的Nacos版本,当服务实例变化,服务端会通过udp协议将最新的数据发送给客户端,后来发现udp推送有一定的丢包率,于是新版本的Nacos支持了grpc推送。Nacos服务端会自动判断客户端的版本来选择哪种方式来进行推送,如果你使用1.4.2以前的SDK进行注册,那Nacos服务端会使用udp协议来进行推送,反之则使用grpc。

推送失败重试

当发送推送时,客户端可能正在重启,或者连接不稳定导致推送失败,这个时候Nacos会进行重试。Nacos将每个推送都封装成一个任务对象,放入到队列中,再开启一个线程不停的从队列取出任务执行,执行之前会先删除该任务,如果执行失败则将任务重新添加到队列,该线程会记录任务执行的时间,如果超过1秒,则会记录到日志。

推送部分源码

添加推送任务到执行队列中。

private static class PushDelayTaskProcessor implements NacosTaskProcessor {    private final PushDelayTaskExecuteEngine executeEngine;    public PushDelayTaskProcessor(PushDelayTaskExecuteEngine executeEngine) {        this.executeEngine = executeEngine;    }    @Override    public boolean process(NacosTask task) {        PushDelayTask pushDelayTask = (PushDelayTask) task;        Service service = pushDelayTask.getService();        NamingExecuteTaskDispatcher.getInstance()                .dispatchAndExecuteTask(service, new PushExecuteTask(service, executeEngine, pushDelayTask));        return true;    }}

推送任务PushExecuteTask 的执行。

public class PushExecuteTask extends AbstractExecuteTask {//..省略@Overridepublic void run() {    try {        //封装要推送的服务实例数据        PushDataWrapper wrapper = generatePushData();        ClientManager clientManager = delayTaskEngine.getClientManager();        //如果是服务上下线导致的推送,获取所有订阅者        //如果是订阅导致的推送,获取订阅者        for (String each : getTargetClientIds()) {            Client client = clientManager.getClient(each);            if (null == client) {                // means this client has disconnect                continue;            }            Subscriber subscriber = clientManager.getClient(each).getSubscriber(service);            //推送给订阅者            delayTaskEngine.getPushExecutor().doPushWithCallback(each, subscriber, wrapper,                    new NamingPushCallback(each, subscriber, wrapper.getOriginalData(), delayTask.isPushToAll()));        }    } catch (Exception e) {        Loggers.PUSH.error("Push task for service" + service.getGroupedServiceName() + " execute failed ", e);        //当推送发生异常,重新将推送任务放入执行队列        delayTaskEngine.addTask(service, new PushDelayTask(service, 1000L));    }}  //如果是服务上下线导致的推送,获取所有订阅者        //如果是订阅导致的推送,获取订阅者    private Collection getTargetClientIds() {    return delayTask.isPushToAll() ? delayTaskEngine.getIndexesManager().getAllClientsSubscribeService(service)            : delayTask.getTargetClients();}

执行推送任务线程InnerWorker 的执行。

/** * Inner execute worker. */private class InnerWorker extends Thread {    InnerWorker(String name) {        setDaemon(false);        setName(name);    }    @Override    public void run() {        while (!closed.get()) {            try {            //从队列中取出任务PushExecuteTask                 Runnable task = queue.take();                long begin = System.currentTimeMillis();                //执行PushExecuteTask                 task.run();                long duration = System.currentTimeMillis() - begin;                if (duration > 1000L) {                    log.warn("task {} takes {}ms", task, duration);                }            } catch (Throwable e) {                log.error("[TASK-FAILED] " + e.toString(), e);            }        }    }}

2.6 Nacos SDK 查询服务实例

服务消费者首先需要调用Nacos SDK的接口来获取最新的服务实例,然后才能从获取到的实例列表中以加权轮询的方式选择出一个实例(包含ip,port等信息),最后再发起调用。

前面已经提到Nacos服务发生上下线、订阅的时候都会推送最新的服务实例列表到当客户端,客户端再更新本地内存中的缓冲数据,所以调用Nacos SDK提供的查询实例列表的接口时,不会直接请求服务端获取数据,而是会优先使用内存中的服务数据,只有内存中查不到的情况下才会发起订阅请求服务端数据。

Nacos SDK内存中的数据除了接受来自服务端的推送更新之外,自己本地也会有一个定时任务定时去获取服务端数据来进行兜底。Nacos SDK在查询的时候也了容灾机制,即从磁盘获取服务数据,而这个磁盘的数据其实也是来自于内存,有一个定时任务定时从内存缓存中获取然后加载到磁盘。Nacos SDK的容灾机制默认关闭,可通过设置环境变量failover-mode=true来开启。

架构图

用户查询流程

查询服务实例部分源码

private final ConcurrentMap serviceInfoMap; @Overridepublic List getAllInstances(String serviceName, String groupName, List clusters,        boolean subscribe) throws NacosException {    ServiceInfo serviceInfo;    String clusterString = StringUtils.join(clusters, ",");    //这里默认传过来是true    if (subscribe) {    //从本地内存获取服务数据,如果获取不到则从磁盘获取        serviceInfo = serviceInfoHolder.getServiceInfo(serviceName, groupName, clusterString);        if (null == serviceInfo || !clientProxy.isSubscribed(serviceName, groupName, clusterString)) {      //如果从本地获取不到数据,则调用订阅方法            serviceInfo = clientProxy.subscribe(serviceName, groupName, clusterString);        }    } else {     //适用于不走订阅,直接从服务端获取数据的情况        serviceInfo = clientProxy.queryInstancesOfService(serviceName, groupName, clusterString, 0, false);    }    List list;    if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {        return new ArrayList();    }    return list;}}  //从本地内存获取服务数据,如果开启了故障转移则直接从磁盘获取,因为当服务端挂了,本地启动时内存中也没有数据public ServiceInfo getServiceInfo(final String serviceName, final String groupName, final String clusters) {    NAMING_LOGGER.debug("failover-mode: {}", failoverReactor.isFailoverSwitch());    String groupedServiceName = NamingUtils.getGroupedName(serviceName, groupName);    String key = ServiceInfo.getKey(groupedServiceName, clusters);    //故障转移则直接从磁盘获取    if (failoverReactor.isFailoverSwitch()) {        return failoverReactor.getService(key);    }    //返回内存中数据    return serviceInfoMap.get(key);}

3. 结语

本篇文章向大家介绍 Nacos 服务发现的基本概念和核心能力以及实现的原理,旨在让大家对 Nacos 的服务注册与发现功能有更多的了解,做到心中有数。

天天观天下!四个维度搞懂 Nacos 注册中心

2023-05-06 22:27:41

佩恩:希望今天能多投进几个球 但赢球是最重要的事情

2023-05-06 21:38:16

今日快讯:真水无香 精

2023-05-06 20:48:15

韩国人用什么牌子手机

2023-05-06 19:47:46

《胡思乱想消除指南》:我为什么感到不快乐?

2023-05-06 19:02:41

工行盘州支行:助力光伏产业迈开节能减排新步伐 世界微速讯

2023-05-06 18:32:12

世界微速讯:第一人称第二人称第三人称游戏_第一人称 第二人称 第三人称

2023-05-06 17:50:18

天天即时:注意!赣州疾控发布最新防病提示

2023-05-06 17:24:57

NBA西部半决赛:勇士主场大胜湖人 总比分追至1:1

2023-05-06 17:08:34

每日消息!建工+城乡房屋联合体摇号摘得北京丰台区青塔地块,成交价27.485亿元

2023-05-06 16:39:43

“22吴中城投SCP004”将于5月13日兑付 利率2.05%-世界观点

2023-05-06 15:54:26

【热闻】兰州市卫健委机关2023年度印刷采购项目成交公告

2023-05-06 15:31:20

环球今日报丨青少年抑郁症状有哪些症状_青少年抑郁症的症状 青少年抑郁症有什么特点

2023-05-06 14:48:48

查尔斯加冕典礼前夕,澳媒主持人发文:“他连家庭都团结不了,更不用说他的国家了”

2023-05-06 14:18:51

15岁的女孩叛逆怎么办 大黄蜂老师给家长们支招

2023-05-06 13:51:55

世界热点!国产氢能源动力汽车_氢能源汽车工作原理

2023-05-06 13:07:12

火山引擎DataLeap:幸福里如何0-1建立数据权限体系?_环球新资讯

2023-05-06 12:38:49

全球快资讯:王纲球:焦煤2309合约坚持的意义!

2023-05-06 11:55:44

世界速讯:没签合同公司压工资怎么办?

2023-05-06 12:03:15

黑龙江鹤岗市萝北县发生3.1级地震,震源深度8千米|当前信息

2023-05-06 11:22:53

环球观速讯丨Q1业绩滑坡 仍“咬住”百亿营收目标 胜宏科技也计划投资东南亚|直击业绩会

2023-05-06 10:45:07

大成之作!三星11mm极致轻薄OLED电视发布 全球报道

2023-05-06 10:35:39

热点评!夏天模式开启是什么情况

2023-05-06 09:49:45

湖北保康:趣味民俗迎立夏 全球快资讯

2023-05-06 09:21:03

娇韵诗怎么样啊_娇韵诗怎么样 当前快看

2023-05-06 08:54:12

环球关注:凯莱英:公司在苏州建立了CGT 业务团队,快速推进业务能力建设

2023-05-06 08:40:42

第32届东南亚运动会在柬埔寨金边开幕|天天热点评

2023-05-06 07:55:00

2023年葡萄酒继续“跌跌不休”,酒商仅能将其当作“边缘产品”运营?|世界热讯

2023-05-06 07:01:29

今日快看!纳达尔继续退赛!无缘福地冲击第11冠,伤缺4个月法网前景成疑

2023-05-06 05:55:58

大豆异黄酮哪个牌子好用_大豆异黄酮哪个牌子好_世界看点

2023-05-06 05:01:42

“五一”假期,大连各交通枢纽客运量达122.3万人次-天天速讯

2023-05-06 03:01:36

张慧智语中评:韩失自主性与独立性

2023-05-06 01:02:37

万顺新材: 关于万顺转2暂停转股的提示性公告 焦点热议

2023-05-05 23:05:08

美联储6月维持利率不变的概率为96.1%

2023-05-05 21:58:45

碰撞创意“脑花” 两岸师生打造大运主题“天府驿站” 全球今日讯

2023-05-05 21:16:55

5月5日《山东省海洋预报》|观速讯

2023-05-05 20:43:52

环球热点评!联合国粮农组织:全球食品价格指数4月出现反弹

2023-05-05 19:58:07

央行:5月15日正式启动香港与内地利率互换市场互联互通合作

2023-05-05 19:33:15

太古地产一季度香港零售项目销售额全增长超20%-世界动态

2023-05-05 18:58:32

湘西世界地质公园入选长江主题国家级旅游线路

2023-05-05 18:19:58

头条:2023 钙钛矿材料与器件产业发展论坛 --探索 ·创新 · 光伏新势力

2023-05-05 17:45:30

个人指标更新业务怎么填_个人指标更新

2023-05-05 17:36:30

海外机构调研股名单 伟星新材最受关注

2023-05-05 17:01:26

全球最新:华阳国际: 关于部分股票期权注销完成的公告

2023-05-05 16:39:45

银保监会:2022年保险业原保险保费收入4.7万亿元_环球精选

2023-05-05 16:09:24

英雄联盟msi时间2023赛程 lol5月msi时间2023赛制大全[多图]|环球动态

2023-05-05 15:42:09

全球热头条丨“水果之王”跌下神坛,榴莲价格被“腰斩”的背后原因曝光

2023-05-05 15:17:35

【时快讯】茂名市创盟电子商务有限公司_关于茂名市创盟电子商务有限公司的简介

2023-05-05 15:04:20

天天最资讯丨广东车辆违章(广东车辆交通违章查询)

2023-05-05 14:04:11

2023贵州高考一本线预测 预计今年多少分能上一本-焦点观察

2023-05-05 13:55:43

每日动态!“户”联网“加”出幸福感 张家港龙潭村“海棠微家”听民声

2023-05-05 13:08:58

12岁男孩落水被卷入漩涡后失联,当地:降雨阻碍救援,多部门仍在全力搜救

2023-05-05 12:51:36

a1图纸尺寸加长(a1图纸尺寸)

2023-05-05 12:34:22

环球今亮点!铁路“五一”小长假共发送旅客1.33亿人次 较2019年同期增加2794万人次

2023-05-05 12:04:46

MONCLER 集团一季度收入增长23% 世界热议

2023-05-05 11:41:03

我国首个植物基因编辑安全证书下发

2023-05-05 11:18:51

天天热门:《铃芽之旅》制片人川村元气执导处女作将在中国上映

2023-05-05 10:53:30

榜样!东莞理工学院校长马宏伟获广东省五一劳动奖章

2023-05-05 10:20:25

43股获100家以上机构调研,源杰科技最受关注 每日快报

2023-05-05 09:56:34

快看点丨可字的笔顺图片(可字的笔顺)

2023-05-05 09:30:32

暴涨!创历史新高! 环球最资讯

2023-05-05 09:14:50

预装MIUI14,小米13 Ultra推出三款限量定制色,已开启预售

2023-05-05 08:54:46

环球百事通!市民建议伊通河引进游船,相关部门回应

2023-05-05 08:03:25

全球头条:蚯蚓的生活习性和饲养方法(钓鱼人最初的挚爱,蚯蚓家庭养殖方法分享)

2023-05-05 07:55:23

华夏中证5G通信主题ETF净值下跌2.23% 请保持关注

2023-05-05 06:52:48

【瑞普生物】2022年报及2023一季报点评:23Q1归母净利润环比-29%,看好禽苗景气回暖、宠物板块拓展

2023-05-05 06:22:22

Haynes Intl(HAYN.US):2023年Q2财报实现营收1.528亿美元

2023-05-05 05:38:44

泡菜炒五花肉的做法?_每日热文

2023-05-05 03:51:54

泸沽湖客栈民宿_泸沽湖客栈 世界看热讯

2023-05-05 01:47:45

每日动态!海大80后教授登上央视,分享南极科考经历!在科研探索的路上为青春注解

2023-05-04 23:08:29

世界观热点:庆余年2要开机了 什么情况?事情经过是什么样的?

2023-05-04 22:04:27

编译器大佬全新编程语言Mojo:兼容Python核心功能,提速35000倍

2023-05-04 21:58:04

郑重看股|复盘笔记:瑞玛精密短线利好 速看

2023-05-04 21:06:31

(清廉常德)柳叶湖:“廉旅”融合 让游客看风景触“清风” 全球观热点

2023-05-04 20:16:26

长三角多地加入“暴雨圈” 气温如搭“过山车”

2023-05-04 20:12:35

天天观焦点:“五一”小长假,12万人游循化

2023-05-04 19:08:38

一季度汕头制造业贷款余额首次突破500亿元

2023-05-04 18:49:59

同比大涨45%!福特汽车今年一季度利润达34亿美元 环球速看料

2023-05-04 18:29:29

环球今头条!小米平板6续航可达49.9天、小米官方详解“深度休眠模式”

2023-05-04 18:07:26

天天视讯!历史新高!“五一”假期,台江县接待游客56.6万人次、旅游总收入9.31亿元

2023-05-04 17:36:11

汇丰银行上调港元最优惠利率 由5.625%调高至5.75%_世界看点

2023-05-04 16:53:45

安徽淮北:唱响青春税月 为高校学子梦想护航

2023-05-04 16:38:30

每日观察!美国半导体行业协会总裁称美半导体公司不能缺席中国市场 外交部回应

2023-05-04 16:01:11

节日我在岗丨欢乐“嗨”不停,平安“警”相随 天天实时

2023-05-04 15:45:08

全球快讯:非法拘禁案判刑多久

2023-05-04 15:20:18

摄像头在哪里找的_摄像头在哪里打开_全球今亮点

2023-05-04 15:13:26

元代古诗有哪些 元代古诗有哪些_当前消息

2023-05-04 14:25:21

2千万美元的贝尔维尤山住宅进行交易-当前简讯

2023-05-04 13:59:57

烟台高新区生物医药领域再添三家省级专精特新中小企业|环球速读

2023-05-04 13:20:32

五一假期全国营业性演出票房收入15.19亿元,与去年同比增长962.2%_前沿热点

2023-05-04 12:48:20

外媒曝《方舟2》将再次跳票至2025年 此前已跳票过一次!|世界最新

2023-05-04 12:15:54

热点 | 4月政治局会议对于大类商品的影响分析

2023-05-04 11:41:52

【世界速看料】郑州市参加2023首届全国家政博览会

2023-05-04 11:14:40

永城市新桥镇:粮食生产势头强劲 每日快报

2023-05-04 10:56:52

航锦科技:4月28日获融资买入7105.45万元,占当日流入资金比例18.28%

2023-05-04 10:27:51

郑州市金水区工人第一新村小学:紧绷安全弦 平安迎假期 焦点资讯

2023-05-04 10:05:39

郴州华塘镇探索乡村增收新途径:莓稻轮作 一地多收-世界微动态

2023-05-04 09:41:50

树獭打架(树獭怎么读) 快播报

2023-05-04 09:33:29

5月4日生意社当归基准价为94.00元/公斤 天天新资讯

2023-05-04 09:00:52

数百巴黎球迷疯狂抗议!内马尔:他们刚离开我家门口

2023-05-04 08:20:30

焦点快播:王天发5.4黄金暴涨,原油暴跌,今日多空如何把握?黄金原油最新投资行情趋势指导分析

2023-05-04 07:10:35

刘备写过哪些古诗 三国的诗有哪些?

2023-05-04 06:27:13

快讯2023-05-04 05:20:06 每日信息

2023-05-04 05:06:05

每周讲坛 | 中国古代化学智慧与实践

2023-05-04 02:55:18

丝印油墨的分类_丝印油墨的分类今日更新

2023-05-04 00:49:10

巩卫进行时丨包点单位联合大同社区开展巩卫大行动!-头条

2023-05-03 22:11:45

LOLS12末日出装推荐(LOLS12打野末日出装顺序介绍)|快播

2023-05-03 22:03:36

春风得意马蹄疾一日看尽长安花dj_春风得意马蹄疾一日看尽长安花

2023-05-03 20:46:37

寄明月串词报幕词100字_寄明月串词报幕词-即时焦点

2023-05-03 19:47:17

红玫瑰花语是什么意思_红玫瑰花语介绍

2023-05-03 18:49:29

当日快讯:金禾实业:60万吨硫酸及配套余热回收利用项目已开工建设|焦点报道

2023-05-03 18:07:26

全球快讯:中国代表呼吁保护冲突地区文化遗产

2023-05-03 17:01:15

韩国“阵营外交”损人不利己-世界快讯

2023-05-03 16:10:07

前两天,一位很帅的邻国女外长,来到了北京|全球实时

2023-05-03 15:27:59

云南隆阳5.2级地震已造成10人受伤

2023-05-03 14:58:24

【环球速看料】大列巴面包做法大全_大列巴面包做法

2023-05-03 13:43:30

环球观察:国际人士:中国经济增长鼓舞全球许多人

2023-05-03 12:53:18

全球微动态丨中国驻以色列大使馆,紧急提醒!

2023-05-03 11:50:57

鬼灯的冷彻第二季粤语_鬼灯的冷彻第二季-天天即时看

2023-05-03 11:06:34

蕤怎么读拼音_蕤怎么读-全球热门

2023-05-03 10:05:11

全球关注:天津出台《科教兴市人才强市行动方案》

2023-05-03 09:04:19

揭秘!产业工人的“新”身份→

2023-05-03 08:16:28

板木家具生产工艺流程(板木家具)-全球热消息

2023-05-03 07:20:24

天天有喜穿帮镜头照片_天天有喜穿帮镜头

2023-05-03 07:11:16

【速看料】支付宝商家收款码怎么申请花呗收款_支付宝商家收款码怎么申请

2023-05-03 06:04:06

青藏高原歌词曲作者是谁_青藏高原歌词

2023-05-03 04:03:16

10的6次方怎么输入_10的6次方 速讯

2023-05-03 03:46:58

后跟帖怎么用_后跟帖怎么贴|天天热消息

2023-05-03 00:46:01

云南保山市隆阳区发生5.2级地震 大理等多地震感明显

2023-05-03 00:01:29

免费师范生如何报考录取_资讯推荐

2023-05-02 22:03:12

天天速递!汕头陈女士,被骗6万!

2023-05-02 20:53:33

五一假期人气火爆!京东线下自营JD Ehome多款iPhone及iPad新品热销

2023-05-02 19:56:22

全球关注:鼎丰集团汽车(06878):梁凤仪获委任为公司秘书

2023-05-02 19:00:55

变废为宝的项目_变废为宝的项目有什么

2023-05-02 17:55:18

直接选举和间接选举的区别表格_直接选举和间接选举的区别 天天速读

2023-05-02 16:45:17

cad建筑制图基础教程(建筑工程CAD绘图基础教程)|热闻

2023-05-02 16:47:23

“五一”火出圈 坐上动车去老挝 一日品两国美食

2023-05-02 15:49:29

狼牙五壮士发生在哪个省(狼牙五壮士发生在哪个省份)

2023-05-02 15:20:56

梦见辞职有什么征兆 梦见辞职有什么征兆吗|当前快播

2023-05-02 14:35:56

广西大化:激情赛陀螺 快乐过“五一”_世界快讯

2023-05-02 13:29:39

今日聚焦!JDG分享MSI垃圾话拍摄花絮:COOOOOOOOOL

2023-05-02 12:11:15

世界聚焦:山东日照:“五一”假期 游客享受“赶海”乐趣

2023-05-02 11:44:51

曲辰10号_对于曲辰10号简单介绍

2023-05-02 10:41:47

节日叠加广交会 白云机场口岸单日出入境人员超2.1万人次|世界要闻

2023-05-02 10:05:23

全球速讯:农安县气象局发布大风蓝色预警【IV级/一般】【2023-05-02】

2023-05-02 09:18:49

天天速看:王者KPL打野梯队,“三巨头”已确定,夏侯惇成野区霸主,刘备起飞

2023-05-02 08:40:23

全球今亮点!保山在列!交通运输部发布“国家公交都市建设示范城市”称号的公示

2023-05-02 07:19:57

全球新消息丨美国的大瓜,第一共和银行被接管,一场大风暴很快要来

2023-05-02 06:14:14

干部子弟学校_干部子弟-环球即时

2023-05-02 04:05:04

若塔谈绝杀:这种情况无需过多思考,拦截对手的传球是关键-全球速看

2023-05-02 01:17:09

美国最新数据分析:美国4月Markit制造业PMI终值改善50.2 每日播报

2023-05-01 22:55:00

辽浙G3赛前太暖!辽迷2举动获致敬,金金提前加练,艾伦致谢球迷-天天速看

2023-05-01 21:39:09

劳动之美 奋斗之光

2023-05-01 20:23:38

每日速递:唐山百名标兵唐山花海“hua”文明

2023-05-01 19:11:46

当前热点-lol凤凰是什么英雄_lol凤凰叫什么

2023-05-01 18:55:15

喜洋洋与灰太狼之奇趣外星客大结局_大结局解析 今头条

2023-05-01 17:49:51

水盆羊肉的做法及视频_水盆羊肉的做法 播报

2023-05-01 17:01:50

打鼾严重怎么治疗最好_打鼾很严重怎么治疗

2023-05-01 15:50:34

男子每天大便两三次,反复检查肠镜正常,直到换了检查项目:是癌王_世界新动态

2023-05-01 15:04:36

3.06亿!贵州晒出假期首日成绩单

2023-05-01 13:45:42

全球通讯!孕妇贫血的人吃什么好_孕妇贫血的人吃的食物推荐

2023-05-01 12:53:56

2023版1克熊猫金币现在是多少价钱(2023年05月01日) 天天观察

2023-05-01 11:55:00

全球热头条丨“现象级”城市营销掀起新热潮 文旅创新融合升级增“游量”

2023-05-01 11:10:08

英超裁判公司关于克洛普的声明:审查后蒂尔尼没有任何不当行为 今日讯

2023-05-01 10:06:38

2023年黑龙江退休金计算公式 黑龙江2022年调整企业退休人员养老金方案|全球今日报

2023-05-01 09:19:37

正宗陕西油泼辣子面的做法 陕西名吃油泼辣子面

2023-05-01 08:32:46

今日聚焦!死亡搁浅悬浮机怎么用 死亡搁浅悬浮机能接几个

2023-05-01 07:27:50

iOS 17会改进吗?Siri遭苹果员工集体“嘲笑”-世界微速讯

2023-05-01 07:10:22

全球热议:4月份中国制造业PMI为49.2%

2023-05-01 05:44:17

大兴区两岁子女抚养费明细

2023-05-01 03:57:50

每日看点!甲硝唑的功能主治与副作用_甲硝唑有什么副作用

2023-05-01 03:13:59

虞山吴派古琴演奏家是谁_虞山 即时

2023-05-01 02:44:26

暗里着迷歌词粤语谐音_暗里着迷歌词_快资讯

2023-04-30 23:56:52

2023“五一”假期第二天 渭南公安交警严查违法除隐患

2023-04-30 22:43:21

每日精选:广清轻轨清远站具体位置在哪里?

2023-04-30 21:05:11

【当前独家】蚂蚁庄园答题的正确答案是什么_蚂蚁庄园答答星球答案

2023-04-30 20:09:21

第133届广交会第三期5月1日开展 参展企业超过1万家

2023-04-30 19:04:39

索尼将推出更多 PC 游戏,因为真的很赚钱

2023-04-30 18:08:04

【天天快播报】今日白玫瑰不能随便送人是什么意思_白玫瑰不能随便送人

2023-04-30 16:43:19

穿越火线空白名字复制2020_穿越火线空白名字复制2019

2023-04-30 15:47:45

全球实时:致全市广大劳动者的倡议书

2023-04-30 15:16:51

王一博电影《长空之王》票房破 2 亿霸榜五一档:网友直呼歼 20 太帅_环球热讯

2023-04-30 14:07:52

晋情消费 全民乐享 山西第五届双品网购节来了 世界热点

2023-04-30 13:08:18

焦点播报:第四届“五五购物节”启动 拼多多联席CEO赵佳臻宣布投入40亿消费补贴

2023-04-30 12:15:20

公共 | 小修小补、15元剪发……一刻钟便民生活圈让济南这个社区“幸福感”满满

2023-04-30 11:17:35

五一假期第二天:路网流量总体高位运行 或小幅波动

2023-04-30 10:46:45

“一次办理”快速落户 经开区首批“新市民”成功落户

2023-04-30 09:57:29

你是我心里的一首歌歌词是什么意思_你是我心里的一首歌歌词

2023-04-30 09:03:27

“天宫”来信

2023-04-30 08:12:04

今日播报!旅游 | 内蒙古文化和旅游厅加入丝绸之路旅游推广联盟携手西北旅游协作区

2023-04-30 07:20:30

记者:皇马不放阿根廷18岁中场尼科-帕斯参加U20世界杯

2023-04-30 06:15:04

速递!电视剧《跨过鸭绿江》将在央视国防军事频道重播

2023-04-30 04:53:18

家装板材十大品牌_家装品牌排行榜_今日报

2023-04-30 01:43:31

斯坦利:我们对这一分满意,赢不了球有压力首胜可能就是下场

2023-04-29 23:10:23

宝马纯电i5旅行版将于2024年上市销售

2023-04-29 21:50:49

颜色铂钴色号_土黄色配什么颜色好看 全球视点

2023-04-29 21:02:14

方家翊_关于方家翊介绍

2023-04-29 19:49:14

“五一”假期乡村民宿预订升温 “民宿+新业态”受青睐-每日头条

2023-04-29 18:59:15

苹果地图_关于苹果地图的简介

2023-04-29 18:04:50

压哨签约湖人!承担领袖角色,激活拉塞尔,你绝对不是来混冠军的

2023-04-29 16:59:10