Spring Cloud 2.2.2 源码之五十nacos服务端处理获取配置请求

本文深入剖析Nacos配置中心的工作原理,重点讲解如何处理配置请求,包括获取真实IP、读锁机制、缓存更新及零拷贝技术的应用,为理解Nacos服务端处理流程提供了清晰的视角。

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

nacos服务端

其实nacos大致功能就两个,一个是配置中心,一个是命名服务,我们先看配置中心是如何提供配置请求服务的,主要处理是在com.alibaba.nacos.config.server.controller.ConfigController中。其实很多处理请求看官方open-api就可以知道大概的原理了。
在这里插入图片描述

获取配置ConfigController的getConfig

官方API有的就不多说了,直接看源码大致原理。
先获取参数,检验,通过后调用ConfigServletInnerdoGetConfig方法。

    @GetMapping
    @Secured(action = ActionTypes.READ, parser = ConfigResourceParser.class)
    public void getConfig(HttpServletRequest request, HttpServletResponse response,
                          @RequestParam("dataId") String dataId, @RequestParam("group") String group,
                          @RequestParam(value = "tenant", required = false, defaultValue = StringUtils.EMPTY)
                              String tenant,
                          @RequestParam(value = "tag", required = false) String tag)
        throws IOException, ServletException, NacosException {
        tenant = processTenant(tenant);
        // check params
        ParamUtils.checkParam(dataId, group, "datumId", "content");
        ParamUtils.checkParam(tag);

        final String clientIp = RequestUtil.getRemoteIp(request);
        inner.doGetConfig(request, response, dataId, group, tenant, tag, clientIp);
    }

RequestUtil的getRemoteIp尽可能获取真实IP

这里获取IP是尽可能获取真实的,而不是代理的,如果有NGINX的话,可以进行X_REAL_IP自定义头透传,不过他这里优先使用X_FORWARDED_FOR也是可以的,取出第一个就是最开始的客户端真实地址。如果都没有的话,只能用RemoteAddr,这个可能会是代理的,这样就不好做风控了。
在这里插入图片描述

ConfigServletInner的doGetConfig

代码比较长,截取重点说吧,其实就是根据groupKey更新缓存的属性,然后根据单例运行是否用mysql,进行mysql查询或者直接用文件零拷贝传输,因为有个DumpService在初始化的时候回去mysql比对记录,把文件保存到本地/data\config-data文件夹中,所以可以直接用零拷贝了。
在这里插入图片描述
在这里插入图片描述

首先获取读锁,有了缓存如果没有在修改的话就可以获取读锁了:
在这里插入图片描述
如果获取不到说明配置文件不存在或者有线程正在写配置文件,那也不给读,为了保证数据的一致性:
在这里插入图片描述
根据缓存获取Config-Type,比如yaml
在这里插入图片描述
这里如果是单例且没有用mysql,就从持久化服务里获取,貌似有个叫Derby的,否则的话用了mysql的话在DumpService初始化的时候已经把文件保存到本地上了,可以直接用零拷贝技术。
在这里插入图片描述
设置一些头信息后,进行响应输出,如果有本地文件就用零拷贝,否则就用字符流。
在这里插入图片描述
最后成功:
在这里插入图片描述
这样我们知道了获取配置的大致原理,下次说长轮询刷新配置的原理。

好了,今天就到这里了,希望对学习理解有帮助,大神看见勿喷,仅为自己的学习理解,能力有限,请多包涵。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值