您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

Nacos 并发小技巧之缓存实例信息

时间:2024-03-14 12:42:45  来源:今日头条  作者:程哥编程

在Nacos中,可以使用客户端自行缓存实例信息以提高可用性和性能。以下是一种常见的缓存实例信息的方法:

  1. 获取实例信息:在服务消费者启动时,可以通过Nacos的API或客户端提供的功能从Nacos注册中心获取服务的实例信息。这些信息通常包括服务名、IP地址、端口等。
  2. 缓存实例信息:将获取到的实例信息缓存在本地,可以使用内存数据结构(如Map、List等)或缓存框架(如redis、Ehcache等)来存储实例信息。
  3. 定期更新缓存:为了保持缓存的实时性,可以定期更新缓存中的实例信息。可以通过定时任务或订阅Nacos的实例信息变更事件,及时更新缓存中的数据。
  4. 实例信息的过期策略:可以根据实际需求定义实例信息的过期策略。例如,可以设置缓存的过期时间,当缓存中的实例信息过期后,需要重新从Nacos获取最新的实例信息。
  5. 错误处理和容错机制:在获取实例信息时,需要考虑错误处理和容错机制。如果Nacos不可用或请求失败,可以根据具体情况使用默认值、重试机制或从备用注册中心获取实例信息。

通过缓存实例信息,服务消费者可以在Nacos不可用时仍然能够进行服务调用,提高了可用性和性能。但需要注意的是,缓存实例信息可能会导致一定的数据延迟和一致性问题,因此需要在设计时权衡利弊,并根据实际场景进行合理的缓存策略和更新机制。

下面是一个使用JAVA代码示例来缓存Nacos实例信息的简单实现:

import com.alibaba.nacos.api.exception.NacosException;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.pojo.Instance;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class NacosInstanceCache {
    private static final String SERVER_ADDR = "localhost:8848"; // Nacos服务器地址
    private static final String SERVICE_NAME = "your-service-name"; // 服务名

    private NamingService namingService;
    private Map<String, List<Instance>> instanceCache;

    public NacosInstanceCache() throws NacosException {
        namingService = NamingFactory.createNamingService(SERVER_ADDR);
        instanceCache = new HashMap<>();

        // 初始化缓存
        refreshInstanceCache();

        // 定期更新缓存
        ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
        executorService.scheduleAtFixedRate(this::refreshInstanceCache, 0, 1, TimeUnit.MINUTES);
    }

    // 获取服务实例列表
    public List<Instance> getInstances() {
        return instanceCache.get(SERVICE_NAME);
    }

    // 刷新缓存
    private void refreshInstanceCache() {
        try {
            List<Instance> instances = namingService.getAllInstances(SERVICE_NAME);
            instanceCache.put(SERVICE_NAME, instances);
        } catch (NacosException e) {
            // 处理异常
            e.printStackTrace();
        }
    }
}

使用上述代码,你可以创建一个NacosInstanceCache对象来缓存Nacos的服务实例信息。在初始化时,它会从Nacos注册中心获取最新的实例信息,并定期刷新缓存。你可以通过调用getInstances()方法来获取缓存中的服务实例列表。

注意替换代码中的SERVER_ADDR和SERVICE_NAME为你实际的Nacos服务器地址和服务名。

这只是一个简单的示例,你可以根据实际需求进行扩展和优化。例如,可以添加错误处理、容错机制、缓存过期策略等。同时,你还可以考虑使用更高级的缓存框架(如Redis)来存储实例信息以提高性能和可靠性。

Nacos 如何缓存实例信息与Feign Ribbon 结合

要将Nacos实例信息的缓存与Feign和Ribbon结合使用,你可以通过自定义负载均衡规则和Feign的拦截器来实现。下面是一个简单的示例代码:

  1. 创建一个自定义的Ribbon负载均衡规则类,用于从缓存中选择服务实例:
import com.NETflix.loadbalancer.BaseLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import org.springframework.cloud.alibaba.nacos.ribbon.NacosServer;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerContext;
import org.springframework.cloud.netflix.ribbon.ServerIntrospector;
import org.springframework.cloud.netflix.ribbon.SpringClientFactory;
import org.springframework.util.CollectionUtils;

import java.util.List;

public class NacosInstanceLoadBalancer extends BaseLoadBalancer {

    private final SpringClientFactory clientFactory;

    public NacosInstanceLoadBalancer(SpringClientFactory clientFactory) {
        this.clientFactory = clientFactory;
    }

    @Override
    public Server chooseServer(Object key) {
        String serviceId = (String) key;
        List<Server> servers = getReachableServers();
        if (CollectionUtils.isEmpty(servers)) {
            return null;
        }
        // 从缓存中选择服务实例
        NacosInstanceCache instanceCache = NacosInstanceCache.getInstance();
        List<Instance> instances = instanceCache.getInstances(serviceId);
        if (CollectionUtils.isEmpty(instances)) {
            return null;
        }
        // 将Nacos实例转换为Ribbon的Server对象
        List<Server> nacosServers = NacosServerList.getServerList(instances);
        ILoadBalancer loadBalancer = new RibbonLoadBalancerContext(this.clientFactory, this.clientFactory.getClientConfig(clientFactory.getClientName()));
        return loadBalancer.chooseServer(serviceId, nacosServers);
    }

    // 省略其他方法
}

2.创建一个Feign的拦截器,用于在每次请求前刷新Nacos实例信息的缓存:

import feign.RequestInterceptor;
import feign.RequestTemplate;

public class NacosInstanceInterceptor implements RequestInterceptor {

    @Override
    public void Apply(RequestTemplate template) {
        // 在每次请求前刷新实例信息的缓存
        NacosInstanceCache instanceCache = NacosInstanceCache.getInstance();
        instanceCache.refreshInstanceCache();
    }
}

3.配置Feign和Ribbon使用自定义的负载均衡规则和拦截器:

import org.springframework.cloud.alibaba.nacos.ribbon.NacosServerList;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@RibbonClient(name = "your-service-name", configuration = NacosInstanceConfiguration.class)
public class FeignConfiguration {

    @Bean
    public NacosInstanceInterceptor nacosInstanceInterceptor() {
        return new NacosInstanceInterceptor();
    }
}
import com.netflix.loadbalancer.IRule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.cloud.alibaba.nacos.ribbon.NacosRibbonClientConfiguration;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConditionalOnClass({RibbonClients.class})
public class NacosInstanceConfiguration extends NacosRibbonClientConfiguration {

    @Autowired
    private SpringClientFactory clientFactory;

    @Bean
    public IRule ribbonRule() {
        return new NacosInstanceLoadBalancer(clientFactory);
    }
}

在上述代码中,NacosInstanceLoadBalancer继承了Ribbon负载均衡器,并在chooseServer方法中从缓存中选择服务实例。NacosInstanceInterceptor是一个Feign的拦截器,每次请求前会刷新Nacos实例信息的缓存。在FeignConfiguration中配置了Feign的拦截器,而在NacosInstanceConfiguration中配置了Ribbon的负载均衡规则。

请注意,上述代码只是一个简单示例,你需要根据实际需求进行适当的调整和扩展。此外,还需要将上述代码集成到你的Spring Boot应用程序中,并确保Nacos实例信息的缓存与Feign和Ribbon正确协同工作。



Tags:Nacos   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Nacos 并发小技巧之缓存实例信息
在Nacos中,可以使用客户端自行缓存实例信息以提高可用性和性能。以下是一种常见的缓存实例信息的方法: 获取实例信息:在服务消费者启动时,可以通过Nacos的API或客户端提供的功能...【详细内容】
2024-03-14  Search: Nacos  点击:(0)  评论:(0)  加入收藏
低代码开发:Nacos配置详解,如何确保平台跳转正常运作
在当今低代码开发的时代,平台的易用性和灵活性非常重要。右上角平台跳转作为用户界面中常见的交互元素,对于提高用户体验具有举足轻重的地位。然而,有时候我们会遇到跳转失效的...【详细内容】
2024-01-25  Search: Nacos  点击:(63)  评论:(0)  加入收藏
如何基于Kubernetes运行Nacos高可用集群
Nacos(Namings and Configuration Management)是阿里巴巴开源的一个易于构建云原生应用的动态服务发现、配置管理和服务管理平台。以下是Nacos的一些主要功能和特点: 服务发现...【详细内容】
2023-12-18  Search: Nacos  点击:(75)  评论:(0)  加入收藏
Nacos配置中心的Pull原理,附源码
在单体服务时代,关于配置信息,管理一套配置文件即可。而拆分成微服务之后,每一个系统都会有自己的配置,并且都各不相同,有些配置还需要动态改变,以达到动态降级、切流量、扩缩容等...【详细内容】
2023-11-17  Search: Nacos  点击:(271)  评论:(0)  加入收藏
Nacos有几种负载均衡策略?
Nacos 作为目前主流的微服务中间件,包含了两个顶级的微服务功能:配置中心和注册中心。1、配置中心扫盲配置中心是一种集中化管理配置的服务,通俗易懂的说就是将本地配置文件“...【详细内容】
2023-11-01  Search: Nacos  点击:(226)  评论:(0)  加入收藏
分布式配置中心Nacos和Apollo如何选择?
为什么需要配置中心?随着分布式业务的发展,分布式节点会越来越多,就会出现各种各样的问题。 业务功能随着需求逐渐变复杂了,就导致应用程序所需要的配置内容越来越多,例如业务开...【详细内容】
2023-09-11  Search: Nacos  点击:(123)  评论:(0)  加入收藏
Dubbo + Nacos这么玩就失去高可用的能力了
我们常用的微服务框架是SpringCloud那一套,在服务远程调用和注册中心的选型上也有不少方案。在服务远程调用上常用的有:Feign、Dubbo等,在注册中心上常用的有:Nacos、Zookeeper...【详细内容】
2023-09-08  Search: Nacos  点击:(272)  评论:(0)  加入收藏
教你用 Python 驾驭 Nacos 配置中心
大家好,我是安果!Nacos 是阿里巴巴开源的项目,用于构建云原生应用的动态服务发现、配置管理和服务管理平台核心特征包含:服务发现、服务健康监测、动态配置服务、动态 DNS 服务...【详细内容】
2023-08-03  Search: Nacos  点击:(323)  评论:(0)  加入收藏
Nacos 核心原理解读+高性能微服务系统实战无密径须沽取对君酌
Nacos 核心原理解读+高性能微服务系统download:https://www.sisuoit.com/itkecheng随着云计算和微服务架构的普及,注册中心作为微服务架构的重要组成部分,也变得越来越重要。Na...【详细内容】
2023-04-27  Search: Nacos  点击:(486)  评论:(0)  加入收藏
Spring Boot+Nacos+gRPC,一个区别于 OpenFeign 的微服务通信方案!
gRPC 的基础知识前面跟小伙伴们分享了很多了,今天再写一篇给这个小小的系列收个尾。我们前面介绍的都是 gRPC 的基本用法,最终目的当然是希望能够在 Spring Boot 中用上这个...【详细内容】
2023-04-04  Search: Nacos  点击:(235)  评论:(0)  加入收藏
▌简易百科推荐
监控 Kafka,这十个指标请考虑!
使用消息队列可以帮助我们实现系统解耦、流量管控等功能。但使用过程中可能会遇到各种各样的问题,比如系统资源使用率高、集群节点宕机等,进而影响我们生产业务正常开展。为了...【详细内容】
2024-04-29  君哥聊技术  微信公众号  Tags:Kafka   点击:(0)  评论:(0)  加入收藏
引入缓存竟然会带来这么多问题?
哈喽,大家好呀,我是呼噜噜,最近很忙好久没更新了,今天我们通过缓存与数据库之间的一致性这个老生常谈的问题来切入,聊聊如何合理的设计一个缓存系统?如今互联网应用,无论是web还是...【详细内容】
2024-04-29  小牛呼噜噜  微信公众号  Tags:缓存   点击:(2)  评论:(0)  加入收藏
五种搭建LLM服务的方法和代码示例
在不断发展的大型语言模型(LLMs)领域中,用于支持这些模型的工具和技术正以与模型本身一样快的速度进步。在这篇文章中,我们将总结5种搭建开源大语言模型服务的方法,每种都附带详...【详细内容】
2024-04-23  DeepHub IMBA    Tags:LLM   点击:(9)  评论:(0)  加入收藏
Meta如何将缓存一致性提高到99.99999999%
介绍缓存是一种强大的技术,广泛应用于计算机系统的各个方面,从硬件缓存到操作系统、网络浏览器,尤其是后端开发。对于Meta这样的公司来说,缓存尤为重要,因为它有助于减少延迟、扩...【详细内容】
2024-04-15    dbaplus社群  Tags:Meta   点击:(7)  评论:(0)  加入收藏
SELECT COUNT(*) 会造成全表扫描?回去等通知吧
前言SELECT COUNT(*)会不会导致全表扫描引起慢查询呢?SELECT COUNT(*) FROM SomeTable网上有一种说法,针对无 where_clause 的 COUNT(*),MySQL 是有优化的,优化器会选择成本最小...【详细内容】
2024-04-11  dbaplus社群    Tags:SELECT   点击:(6)  评论:(0)  加入收藏
10年架构师感悟:从问题出发,而非技术
这些感悟并非来自于具体的技术实现,而是关于我在架构设计和实施过程中所体会到的一些软性经验和领悟。我希望通过这些分享,能够激发大家对于架构设计和技术实践的思考,帮助大家...【详细内容】
2024-04-11  dbaplus社群    Tags:架构师   点击:(5)  评论:(0)  加入收藏
Netflix 是如何管理 2.38 亿会员的
作者 | Surabhi Diwan译者 | 明知山策划 | TinaNetflix 高级软件工程师 Surabhi Diwan 在 2023 年旧金山 QCon 大会上发表了题为管理 Netflix 的 2.38 亿会员 的演讲。她在...【详细内容】
2024-04-08    InfoQ  Tags:Netflix   点击:(10)  评论:(0)  加入收藏
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(16)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(22)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(21)  评论:(0)  加入收藏
站内最新
站内热门
站内头条