Spring Cloud Alibaba 之 Nacos精讲

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

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 一、Nacos简介
  • 二、版本选择
  • 三、下载安装 nacos
  • 四、注册中心
    • 4.1 服务注册
      • 4.1.1 父工程引入Spirng-Cloud-Alibaba的管理依赖`
      • 4.1.2 添加Nacos的客户端依赖
      • 4.1.3 注册成功
      • 4.1.4 测试接口远程调用
    • 4.2 集群配置
    • 4.3 负载均衡
    • 4.4 权重
    • 4.5 名称空间/环境隔离
    • 4.6 Nacos注册中心原理(临时实例和非临时实例)
    • 4.7 Nacos与Eureka对比
  • 五、配置中心
    • 5.1 Nacos添加配置信息
    • 5.2 读取配置信息步骤
      • 5.2.1 引入Nacos的配置管理客户端依赖
      • 5.2.2 bootstrap.yml添加配置
      • 5.2.3 调用测试
    • 5.3 自动刷新-热更新
      • 5.3.1 方式一
      • 5.3.2 方式二
    • 5.4 多环境配置共享

在这里插入图片描述

一、Nacos简介

官网 : http://nacos.io/

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

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

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

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

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

二、版本选择

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

在这里插入图片描述

三、下载安装 nacos

下载 nacos-server :地址 https://github.com/alibaba/nacos/releases

  1. Windows直接下载zip包

  2. Linux下载tar.gz包

  3. 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文档

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

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

  1. Spring Boot ------------>2.6.3
  2. Spring Cloud ------------>2021.0.1
  3. Spring Cloud-Alibaba--------->2021.0.1.0

4.1 服务注册

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

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.3</version>
        <relativePath/>
    </parent>
    
    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2021.0.1</spring-cloud.version>
        <spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
    </properties>

    <dependencyManagement>
        <!-- springCloud -->
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring cloud alibaba是阿里巴巴集团针对服务开发所提供的一套解决方案 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.4.2</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
            </plugin>
        </plugins>
    </build>

</project>

4.1.2 添加Nacos的客户端依赖

        <!-- nacos作为注册中心的依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

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

所以添加以下依赖:

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

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,则不访问
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

4.5 名称空间/环境隔离

  1. namespace 用来做环境隔离
  2. 每个名称空间有自己的唯一ID
  3. 不同空间下的服务不可见

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

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对比

相同点:

  1. 都支持服务住的和服务拉取
  2. 都支持服务提供者心跳方式做健康检测

不同点:

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

五、配置中心

Nacos Config文档

5.1 Nacos添加配置信息

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

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

在这里插入图片描述

5.2 读取配置信息步骤

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

    <!-- nacos作为配置中心的依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>

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做配置中心读取不到配置,且启动类一直加载不出来,一直报错:
在这里插入图片描述添加以下依赖即可

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

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

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文件一定会加载,因此多环境共享可以写入这个文件

优先级:在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/35732.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二次-InsCode Stable Diffusion 美图活动一期

模型&#xff1a; AbyssOrangeMix2 - SFW_Soft NSFW_AbyssOrangeMix2_sfw.safetensors 参数配置&#xff1a; 正&#xff1a;Mountains and seas, people 负&#xff1a;NSFW, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochr…

手把手教大家实现 npm 包,并发布 npm 仓库,搭建文档(二)

昨天写了第一篇文章,反响平平 一个 NPM 包,帮助数十万程序员提高数十倍效率,难道不开源出来?(一) 首先贴下我们的官网 【预览页】 https://kennana.github.io/toolkit-use/ 我们的推特 【toolkituse】 https://twitter.com/Toolkituse 我们的github 【toolkit-u…

【人工智能与机器学习】基于卷积神经网络CNN的猫狗识别

文章目录 1 引言2 卷积神经网络概述2.1 卷积神经网络的背景介绍2.2 CNN的网络结构2.2.1 卷积层2.2.2 激活函数2.2.3 池化层2.2.4 全连接层 2.3 CNN的训练过程图解2.4 CNN的基本特征2.4.1 局部感知&#xff08;Local Connectivity&#xff09;2.4.2 参数共享(Parameter Sharing)…

Django_类视图(五)

目录 类视图优点 使用方法 定义类视图 添加类视图路由 类视图原理 类视图的二次封装 类视图二次封装代码如下 编写视图 配置路由 访问url结果 源码等资料获取方法 类视图优点 使用django的函数视图&#xff0c;如果要让同一个视图实现不同的请求方式实现不同的逻辑…

unity3d 入门1

新建一个3D core项目&#xff1b; 自动新建一个示例场景&#xff0c;仅包含2个对象&#xff0c;一个主摄像机&#xff0c;一个方向光&#xff1b;在Hierarchy层次视图中看到如下&#xff1b;场景使用一个小立方体来表示&#xff0c;下面的对象也使用一个小立方体 表示&#xf…

dedecms后台数据库备份迁移流程

dedecms网站正常使用需要两部分,网站文件和数据库.两者缺一不可. dedecms上传网站文件后,还要导入数据库,如果您只有网站后台备份,没有其他格式sql备份文件,请按照下面流程重装dedecms,并操作恢复数据库 . 需要选确定/wwwroot/data/backupdata/下是否有对应备份 如不存在备份…

使用TypeScript实现贪吃蛇小游戏(网页版)

本项目使用webpackts所编写 下边是项目的文件目录 /src下边的index.html页面是入口文件 index.ts是引入所有的ts文件 /modules文件夹是用来存放所有类的 index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"…

FreeRTOS 低功耗模式设计 STM32平台

1. STM32F105RBT6 的三种低功耗模式 1.1 sleep睡眠模式、stop停机模式、standby 待机模式 1.2 STM32中文参考手册有介绍STM32 低功耗模式的介绍 2. FreeRTOS 采用的是时间片轮转的抢占式任务调度机制&#xff0c;其低功耗设计思路一般是&#xff1a; ① 当运行空闲任务&#…

第三章 SSD存储介质:闪存 3.1

3.1 闪存物理结构 闪存芯片从小到大依此是由&#xff1a;cell&#xff08;单元&#xff09;、page&#xff08;页&#xff09;、block&#xff08;块&#xff09;、plane&#xff08;平面&#xff09;、die&#xff08;核心&#xff09;、NAND flash&#xff08;闪存芯片&#…

C/C++指针从0到99(详解)

目录 一&#xff0c;指针的基础理解 二&#xff0c;指针的基本使用 三&#xff0c;为什么要用指针 四&#xff0c;指针与数组的联系 五&#xff0c;指针的拓展使用 1&#xff09;指针数组 2)数组指针 3&#xff09;函数指针 结构&#xff1a;返回类型 &#xff08;*p)…

算法的时间复杂度

算法的时间复杂度 什么是时间复杂度 时间复杂度是衡量算法执行时间随输入规模增长而增长的度量标准。它描述了算法运行时间与问题规模之间的关系&#xff0c;用于评估算法的效率和性能。 通常情况下&#xff0c;时间复杂度表示为大O符号&#xff08;O&#xff09;&#xff0…

K8S调度管理

调度管理 1.1 调度框架1.1.1 调度体系1.1.2 资源调度 1.2 资源调度1.2.1 节点调度1.2.2 节点亲和1.2.3 Pod亲和1.2.4 Pod反亲和1.2.5 污点&容忍度1.2.6 污点实践 1.3 流量调度1.3.1 Ingress基础1.3.2 Ingress实践1.3.3 Ingress进阶1.3.4 Ingress认证1.3.5 Ingress扩展 1.1 …

mac与pd虚拟机之间不能粘贴文字或粘贴文件

首先确保共享打开&#xff1a; 然后检查虚拟机的Parallels Tools是否正常 一个简单的判断方式就是&#xff0c;退出虚拟机全屏之后&#xff0c;如果能够正常进入融合模式&#xff0c;那么Parallels Tools可用&#xff0c;否则就要排查问题 检查Parallels Tools是否随系统正常启…

SELF-ATTENTION DOES NOT NEED O(n2) MEMORY

背景 主要是要解决self-attention空间复杂度的问题&#xff0c;因为对于gpu计算来说&#xff0c;内存空间非常宝贵&#xff0c;序列长度较长的时候会出现oom问题。 用线性时间解决self-attention问题 解决数据稳定问题 因为由于进行求和计算&#xff0c;容易导致浮点数超过最…

Redis【实战篇】---- 分布式锁

Redis【实战篇】---- 分布式锁 1. 基本原理和实现方式对比2. Redis分布式锁的实现核心思路3. 实现分布式锁版本一4. Redis分布式锁误删情况说明5. 解决Redis分布式锁误删问题6. 分布式锁的原子性问题7. Lua脚本解决多条命令原子性问题8. 利用Java代码调试Lua脚本改造分布式锁 1…

AIGC - Stable Diffusion WebUI 图像生成工具的环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131528224 Stable Diffusion WebUI 是一款基于深度学习的图像生成工具&#xff0c;根据用户的输入文本或图像&#xff0c;生成高质量的新图像&…

【Docker 部署Minio】

Docker 部署Minio 一、拉取Minio镜像二、配置1、创建如下目录2、创建容器并运行 三、访问 一、拉取Minio镜像 访问Docker Hub镜像站找到自己需要的Minio镜像 运行以下命令 sudo docker pull minio/minio二、配置 1、创建如下目录 mkdir -p /home/zx/minio/config mkdir -p…

k8s概念介绍

目录 一 整体架构和组件基本概念 1.1 组件 1.1.1 master节点 1.1.2 node节点 1.1.3 附加组件 二 资源和对象 2.1 资源分类 2.2 元数据资源 Horizontal Pod Autoscaler&#xff08;HPA&#xff09; PodTemplate LimitRange 2.3 集群资源 namespace Node ClusterRo…

Linux下GO IDE安装和配置(附快捷键)

目前&#xff0c;GoLand、VSCode 这些 IDE 都很优秀&#xff0c;但它们都是 Windows 系统下的 IDE。在 Linux 系统下我们可以选择将 Vim 配置成 Go IDE。熟练 Vim IDE 操作之后&#xff0c;开发效率不输 GoLand 和 VSCode。有多种方法可以配置一个 Vim IDE&#xff0c;这里我选…

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(二)

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python面试专栏&#xff1a;《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; …