2023-09-15  阅读(3)
原文作者:王伟王胖胖 原文地址: https://blog.csdn.net/wangwei19871103/article/details/105814924

nacos服务端

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

202309152317560451.png

获取配置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,这个可能会是代理的,这样就不好做风控了。

202309152317568062.png

ConfigServletInner的doGetConfig

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

202309152317574433.png

202309152317580374.png

首先获取读锁,有了缓存如果没有在修改的话就可以获取读锁了:

202309152317587205.png
如果获取不到说明配置文件不存在或者有线程正在写配置文件,那也不给读,为了保证数据的一致性:

202309152317594436.png
根据缓存获取Config-Type,比如yaml

202309152318001757.png
这里如果是单例且没有用mysql,就从持久化服务里获取,貌似有个叫Derby的,否则的话用了mysql的话在DumpService初始化的时候已经把文件保存到本地上了,可以直接用零拷贝技术。

202309152318008598.png
设置一些头信息后,进行响应输出,如果有本地文件就用零拷贝,否则就用字符流。

202309152318014369.png
最后成功:

2023091523180215310.png
这样我们知道了获取配置的大致原理,下次说长轮询刷新配置的原理。

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


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文