Spring Cloud Alibaba 之 Nacos精讲

2023年 7月 12日 36.8k 0

🍓 简介:java系列技术分享(👉持续更新中...🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

在这里插入图片描述

一、Nacos简介

官网 : nacos.io/

官方文档:nacos.io/zh-cn/docs/…
在这里插入图片描述

Nacos是Alibaba微服务生态组件中的重要组件之一,主要用它实现应用的动态服务发现配置管理服务管理

Nacos 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

二、版本选择

使用spring cloud alibaba时特别需要注意版本间的兼容关系
请查看github官网wiki首页的: 版本说明文档

在这里插入图片描述

三、下载安装 nacos

下载 nacos-server :地址 github.com/alibaba/nac…

  • Windows直接下载zip包

  • Linux下载tar.gz包

  • docker在线安装查看文档: Docker如何安装Nacos

  • 在这里插入图片描述Windows目录如下:

    在这里插入图片描述bin : 存储的就是可执行文件
    conf:存储的是nacos的配置文件

    启动

    进入nacos/bin目录中,执行如下命令启动

    .startup.cmd -m standalone  #以单机模式启动
    

    输出nacos is starting with standalone 即为成功。
    在这里插入图片描述

    • 进入可视化页面http://localhost:8848/nacos/ ,账号密码都是nacos,进行登录即可

    在这里插入图片描述在这里插入图片描述
    搭建成功,Linux 安装逻辑一致

    四、注册中心

    Nacos Discovery文档

    自己项目根据 版本选择进行确定

    首先声明:该文章的版本为:

  • Spring Boot ------------>2.6.3
  • Spring Cloud ------------>2021.0.1
  • Spring Cloud-Alibaba--------->2021.0.1.0
  • 4.1 服务注册

    4.1.1 父工程引入Spirng-Cloud-Alibaba的管理依赖`

        
            org.springframework.boot
            spring-boot-starter-parent
            2.6.3
            
        
        
        
            1.8
            2021.0.1
            2021.0.1.0
        
    
        
            
            
                
                    org.springframework.cloud
                    spring-cloud-dependencies
                    ${spring-cloud.version}
                    pom
                    import
                
                
                
                    com.alibaba.cloud
                    spring-cloud-alibaba-dependencies
                    ${spring-cloud-alibaba.version}
                    pom
                    import
                
            
        
    
        
            
            
                org.springframework.boot
                spring-boot-starter-web
            
            
                org.projectlombok
                lombok
            
        
    
    
        
            
                
                    org.springframework.boot
                    spring-boot-maven-plugin
                    2.4.2
                        
                            
                                
                                    repackage
                                
                            
                        
                
            
        
    
    
    
    

    4.1.2 添加Nacos的客户端依赖

            
            
                com.alibaba.cloud
                spring-cloud-starter-alibaba-nacos-discovery
            
    

    application.yml:添加配置

    spring:
      application:
        name: consumer-server
      cloud:
        nacos:
          discovery:
            server-addr: localhost:8848  #nacos注册中心的IP地址和端口号
    

    服务调用可能会报如下错误:

    ERROR 7776 --- [io-20087-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://provider-server/provider/1": provider-server; nested exception is java.net.UnknownHostException: provider-server] with root cause
    

    所以添加以下依赖:

            
                org.springframework.cloud
                spring-cloud-starter-loadbalancer
            
    

    4.1.3 注册成功

    在这里插入图片描述在这里插入图片描述

    4.1.4 测试接口远程调用

    这里主要介绍Nacos所以使用RestTemplate进行远程调用,后续会讲解其他远程调用方式

            //2远程查询用户信息
            String url="http://provider-server/provider/"+order.getUserId();
    
            //2. 发起调用
            User user = restTemplate.getForObject(url, User.class);
    

    消费者这里使用服务名provider-server进行调用

    • 测试服务提供者:

      在这里插入图片描述

    • 测试消费者

      在这里插入图片描述

    4.2 集群配置

    大型应用,可能存在多机房部署,例如:上海 深圳 杭州,那么服务调用的规则是什么呢?

    • 跨集群延迟高,同集群不可访问,再访问其他集群

    默认情况下是 DEFAULT
    在这里插入图片描述配置集群属性

    spring:
      cloud:
        nacos:
          discovery:
            cluster-name: HZ
    

    启动后查看如下;
    在这里插入图片描述

    • 服务调用还是采用:轮训策略,
    • 要想实现同集群的负载均衡规则则需修改负载均衡策略,如下

    4.3 负载均衡

    该负载均衡策略:优先选择与自己相同集群的服务,若该集群存在多个服务,则采用随机方式进行负载均衡

    provider-server:       #给某个微服务配置负载均衡规则,这里是 provider-server 服务
      ribbon:
        NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
    

    4.4 权重

    **权重配置来控制访问频率,权重越大则访问频率越高,范围:0-1之间 **

    设置为0,则不访问
    在这里插入图片描述![在这里插入图片描述](img-blog.csdnimg.cn/d71e01530ae… =400x400)
    在这里插入图片描述

    4.5 名称空间/环境隔离

  • namespace 用来做环境隔离
  • 每个名称空间有自己的唯一ID
  • 不同空间下的服务不可见
  • 在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    spring:
      cloud:
        nacos:
          discovery:
            namespace: 646ec6d4-03e4-40d1-a387-452ba9bae995 #名称空间 ID
    

    4.6 Nacos注册中心原理(临时实例和非临时实例)

    在这里插入图片描述

    临时实例和非临时实例:

    spring:
      cloud:
        nacos:
          discovery:
            ephemeral: false                               #设置为非临时实例
    

    临时实例宕机,会从Nacos的服务列剔除,二非临时实例不会剔除

    4.7 Nacos与Eureka对比

    相同点:

  • 都支持服务住的和服务拉取
  • 都支持服务提供者心跳方式做健康检测
  • 不同点:

  • Nacos的状态检测:
    • 临时实例采用心跳
    • 非临时实例采用主动检测模式
  • 临时实例心跳不正常会被剔除,非临时实例不会剔除
  • Nacos支持服务列表变更的消息推送模式,服务列表更新更即时
  • Nacos集群默认采用AP方式当集群中存在非临时实例时,采用CP模式 Eureka采用AP模式
  • 五、配置中心

    Nacos Config文档

    5.1 Nacos添加配置信息

    不是所有配置文件都添加到nacos,只需添加经常需要改变的配置信息即可

    在这里插入图片描述ID设置规则通常为:[服务名称]-[profile].yaml
    在这里插入图片描述

    在这里插入图片描述

    5.2 读取配置信息步骤

    5.2.1 引入Nacos的配置管理客户端依赖

        
        
            com.alibaba.cloud
            spring-cloud-starter-alibaba-nacos-config
        
    

    5.2.2 bootstrap.yml添加配置

    bootstrap.yml文件配置,优先级高于application.yml

    spring:
      application:
        name: provider-server #服务名称
      profiles:
        active: test #测试环境
      cloud:
        nacos:
          server-addr: localhost:8848  #Nacos地址
          config:
            file-extension: yaml  #文件后缀名
    

    启动发现nacos做配置中心读取不到配置,且启动类一直加载不出来,一直报错:
    在这里插入图片描述添加以下依赖即可

            
                org.springframework.cloud
                spring-cloud-starter-bootstrap
            
    

    启动成功
    在这里插入图片描述

    5.2.3 调用测试

    @RestController
    @RequestMapping("/provider")
    public class ProviderController {
    
        @Autowired
        private ProviderService providerService;
    
        @Value("${pattern.dateformat}")
        private String dateformat;
        
        @GetMapping("/now")
        public String now() {
            return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
        }
    
    }
    

    在这里插入图片描述

    5.3 自动刷新-热更新

    Nacos中配置文件更新后,微服务无需重启就可以感知

    5.3.1 方式一

    • 通过@Value注解方式注入结合@RefreshScope进行刷新
      @RestController
      @RequestMapping("/provider")
      @RefreshScope
      public class ProviderController {
          @Value("${pattern.dateformat}")
          private String dateformat;
          
          @GetMapping("/now")
          public String now() {
              return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
          }
      }
      

    5.3.2 方式二

    通过@ConfigurationProperties注入,自动刷新

    • 自定义读取配置文件对象
      @Data
      @ConfigurationProperties(prefix = "pattern")
      public class PatternProperties {
      
          private String dateformat;
      }
      
    • 配置类或者启动类增加@EnableConfigurationProperties(PatternProperties.class)
    • 对象注入
      @RestController
      @RequestMapping("/provider")
      public class ProviderController {
      		@Autowired
         		private PatternProperties patternProperties;
         	
      	    @GetMapping("/now")
      	    public String now() {
      	        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
      	    }
      }
      

    5.4 多环境配置共享

    微服务启动时会从nacos读取多个文件
    无论profile如何变化,[spring.application.name].yaml文件一定会加载,因此多环境共享可以写入这个文件

    优先级:

    图片.png

    ds

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论