【想进大厂还不会阅读源码】ShenYu源码-接入注册中心发现服务

简介: ShenYu源码阅读。相信大家碰到源码时经常无从下手🙃,不知道从哪开始阅读😭。我们先思考下我们的阅读线索,贡献者是怎么添加发现服务的。这些发现服务是怎么和项目集成的,让ShenYu网关能从注册中心获取节点信息?

相信大家碰到源码时经常无从下手🙃,不知道从哪开始阅读,面对大量代码晕头转向,索性就读不下去了,又浪费了一次提升自己的机会😭。


我认为有一种方法,可以解决大家的困扰!那就是通过阅读某一次开源的【PR】、【ISSUE】,从这个入口出发去阅读源码!!


至此,我们发现自己开始从大量堆砌的源码中脱离开来😀。豁然开朗,柳暗花明又一村🍀。

ShenYu是一个异步的,高性能的,跨语言的,响应式的 API 网关。有关ShenYu的介绍可以戳这

一、前瞻

话不多说,奉上今天我们来阅读的PR提交

在这里插入图片描述

翻译过来就是,添加nacos、etcd、eureka发现服务。

我们先思考下我们的阅读线索

  1. 贡献者是怎么添加发现服务的
  2. 这些发现服务是怎么和项目集成的,让ShenYu网关能从注册中心获取节点信息

二、探索

3个注册中心的添加流程大致是一致的,我们以Nacos为例子来进行本次pr的探索。

先整体看下pr的所有提交,代码的核心在NacosDiscoveryService我们重点关注下。而ShenyuDiscoveryService作为底层接口来定义子类的行为动作,最后Admin模块就是来控制我们自定义的注册中心。

在这里插入图片描述

我们回顾上文我们整理的阅读线索2:这些发现服务是怎么和项目集成的,让ShenYu网关能从注册中心获取节点信息。

先看下NacosDiscoveryService是怎么获取节点信息的。可以看到,ShenYu网关通过配置和Nacos建立连接后,通过Nacos提供的NamingService.selectInstances来获取节点服务列表。

    @Override
    public List<String> getRegisterData(final String key) {
   
        try {
   
            List<Instance> instances = namingService.selectInstances(key, groupName, true);
            List<String> registerData = new ArrayList<>();
            for (Instance instance : instances) {
   
                String data = buildInstanceInfoJson(instance);
                registerData.add(data);
            }
            return registerData;
        } catch (NacosException e) {
   
            LOGGER.error("Error getting Nacos service instances: {}", e.getMessage(), e);
            throw new ShenyuException(e);
        }
    }

NacosDiscoveryService类的其他方法又是什么作用。

在这里插入图片描述

我们看下watch方法的入参DataChangedEventListener,而watch方法内部又看到了listenerMap.put(key, nacosListener)。可以清楚的知道watch方法的作用就是让ShenYu网关可以在Nacos注册中心,监听到某个服务节点的动态变化。

而unwatch方法,顾名思义作用是反过来的。

    @Override
    public void watch(final String key, final DataChangedEventListener listener) {
   
        try {
   
            if (!listenerMap.containsKey(key)) {
   
                List<Instance> initialInstances = namingService.selectInstances(key, groupName, true);
                instanceListMap.put(key, initialInstances);
                EventListener nacosListener = event -> {
   
                    if (event instanceof NamingEvent) {
   
                        try {
   
                            List<Instance> previousInstances = instanceListMap.get(key);
                            List<Instance> currentInstances = namingService.selectInstances(key, groupName, true);
                            compareInstances(previousInstances, currentInstances, listener);
                            instanceListMap.put(key, currentInstances);
                        } catch (NacosException e) {
   
                            throw new ShenyuException(e);
                        }
                    }
                };
                namingService.subscribe(key, groupName, nacosListener);
                listenerMap.put(key, nacosListener);
                LOGGER.info("Subscribed to Nacos updates for key: {}", key);
            }
        } catch (NacosException e) {
   
            LOGGER.error("nacosDiscoveryService error watching key: {}", key, e);
            throw new ShenyuException(e);
        }
    }

    @Override
    public void unwatch(final String key) {
   
        try {
   
            EventListener nacosListener = listenerMap.get(key);
            if (Objects.nonNull(nacosListener)) {
   
                namingService.unsubscribe(key, groupName, nacosListener);
                listenerMap.remove(key);
                LOGGER.info("Nacos Unwatch key: {}", key);
            }
        } catch (NacosException e) {
   
            LOGGER.error("Error removing Nacos service listener: {}", e.getMessage(), e);
            throw new ShenyuException(e);
        }
    }

我们看下register方法,ShenYu网关还提供通过该方法让我们可以注册某个节点到Nacos注册中心。同样是调用了Nacos提供的NamingService服务。

    @Override
    public void register(final String key, final String value) {
   
        try {
   
            Instance instance = GsonUtils.getInstance().fromJson(value, Instance.class);
            namingService.registerInstance(key, groupName, instance);
            LOGGER.info("Registering service with key: {} and value: {}", key, value);
        } catch (NacosException e) {
   
            LOGGER.error("Error registering Nacos service instance: {}", e.getMessage(), e);
            throw new ShenyuException(e);
        }
    }

大家还没有忘记线索1吧(贡献者是怎么添加发现服务的),连我都差点忘记了🤣

我们看下上文图2提到的ShenyuDiscoveryService接口,其实贡献者就是按这个底层接口为方向,底层接口定义了新接入的注册中心,需要实现哪些行为、方法的入参是什么、规范是什么。

以底层接口为方向,添加新的注册中心发现服务其实就类似于SPI的接入

SPI与API区别

  • API是调用并用于实现目标的类、接口、方法等的描述;
  • SPI是扩展和实现以实现目标的类、接口、方法等的描述;

好了,今天的分享就到这了。大家能否感受通过PR、ISSUE这种方式来阅读源码的乐趣呢!

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关文章
|
8月前
|
安全 AndFix 网络安全
海外版交易所系统开发指南教程/需求步骤/案例详细/源码逻辑
Determine the functional requirements of the overseas version of the exchange system, including user registration, identity verification, trading, deposit and withdrawal, data statistics, etc
|
Web App开发 存储 人工智能
从入门到进阶-如何基于FreeSWITCH搭建呼叫中心平台
FreeSWITCH 是一个开源的电话交换平台。博主从事多年AI技术,外呼中心搭建,需要演示站或技术支持联系博主。官方给它的定义是–世界上第一个跨平台的、伸缩性极好的、免费的、多协议的电话软交换平台
1604 0
|
5月前
|
Kubernetes Nacos 数据安全/隐私保护
疯了!Nacos 用 Helm 部署开启授权认证频频出错?别急,秘籍在此!
【8月更文挑战第15天】本文指导您通过Helm部署Nacos并开启授权认证,解决途中遇到的问题。首先确认已安装Helm并了解Kubernetes基础。示例`values.yaml`文件启用认证并设置凭据。运行Helm命令完成部署。若认证失败,请复查用户名及密码准确性。面对权限不足错误,可配置权限策略,示例代码展示基于请求头的简单验证逻辑。Nacos启动异常时,利用`kubectl logs`命令分析Pod日志定位问题。遵循本文步骤与示例,助您成功部署并配置Nacos。
129 0
|
8月前
|
Dubbo 中间件 应用服务中间件
【想进大厂还不会阅读源码】ShenYu源码-支持motan协议
ShenYu源码阅读📚。原来的插件只支持 motan2 协议,并且是硬编码的,本次修改使MotanRpcExt 得到增强。我们可以通过以上的线索来思考我们本次的阅读线索,贡献者是做了什么实现了增强motan插件、这个motan的插件的功能是什么。
|
8月前
|
API Nacos
【想进大厂还不会阅读源码】ShenYu源码-重构同步数据服务
ShenYu源码阅读📚。我们看下PR的标题和Concersation的头一句,大概意思就是重构注册中心数据同步到ShenYu网关的方式。大家看看重构了有没好处呢?不仅获得了知识,还获得了一次开源贡献,何乐而不为呢
|
8月前
|
SpringCloudAlibaba Java Nacos
前阿里P8甩我一份内部SpringCloud笔记手册,真香
SpringCloud Alibaba 因配置灵活、迭代高速、兼容性强,近几年在受到国内不少开发者的广泛关注。其中,Sentinel 作为服务治理开源组件相当出彩,可以帮助解决很多难题,比如:秒杀限流,消息削峰填谷,集群流量控制,实时熔断等。而作为国内的Spring爱好者,最最苦恼的莫过于操作性强的进阶干货太少了!
|
存储 Java 文件存储
撸了一个简易的配置中心,顺带整合到了SpringCloud
大家好,我是三友~~ 最近突然心血来潮(就是闲的)就想着撸一个简单的配置中心,顺便也照葫芦画瓢给整合到SpringCloud。
|
Java 微服务 Spring
GitHub上线一天星标99.9K:阿里内部高逼格SpringCloud实战手册
阿里P8分享GitHub上星标99.9K的内部SpringCloud实战演练文档:7大核心组件,详解实战案例贯穿全书,带你领略Jenkins+K8S的风采。本分文档在对Spring Boot及Spring Cloud全家桶进行详解,同时以实战的形式为读者精彩呈现微服务的开发、部署、容器管理等一站式解决方案
|
安全 NoSQL Java
阿里内部技术专家撰写434页SpringBoot笔记,被恶意流传,已开源
什么是Spring Boot?有什么作用? Spring Boot是由Pivotal团队提供的全新框架,设计目的是用来简化新Spring应用的初始搭建以及开发过程。目前SpringBoot已然成为中小企业构建web应用系统的标准工具,堪称快速开发神器。尤其是随着微服务的全面普及,SpringBoot更加成了服务化开发事实上的行业标准。
|
Kubernetes 监控 Cloud Native
Go微服务架构实战 中篇:2. 基于k8s部署服务和注册中心,验证服务注册和发现
Go微服务架构实战 中篇:2. 基于k8s部署服务和注册中心,验证服务注册和发现
Go微服务架构实战 中篇:2. 基于k8s部署服务和注册中心,验证服务注册和发现

热门文章

最新文章