SpringCloudAlibaba服务注册与配置中心——Nacos

news2025/1/5 9:08:40

Nacos

本专栏学习内容来自尚硅谷周阳老师的视频

有兴趣的小伙伴可以点击视频地址观看

简介

Nacos是阿里巴巴推出的服务注册和配置中心。等价于Eureka+Config+Bus,可以替代Eureka做服务注册中心,替代Config做服务配置中心。官方文档

安装

关于Nacos的安装非常简单,git上拉取压缩包解压即可,下载链接

这里有一个需要注意的地方,我的nacos依赖版本为2.1.0,下载了2.2.x的压缩包,启动服务无法正常注册,2.1.x可以正常注册,估计是版本问题

启动

在bin目录下通过命令行允许单机版即可

startup.cmd -m standalone

image-20230423131452836

运行完成之后,访问localhost:8848/nacos即可

image-20230423131547114

服务注册中心

服务提供者

创建一个名为cloudalibaba-provider-payment9001的服务

导入相关依赖

通过官方文档可以得知,这里父工程需要引入依赖

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>

相应的子工程在引入Nacos依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

编写配置文件

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # 配置nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*' # 暴露所有端点

启动类

@SpringBootApplication
@EnableDiscoveryClient //让注册中心能够发现,扫描到该服务
public class PaymentMain9001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain9001.class,args);
    }
}

业务类

@RestController
public class PaymentController {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping(value = "/payment/nacos/{id}")
    public String getPayment(@PathVariable("id") Integer id) {
        return "nacos registry, serverPort: " + serverPort + "\t id" + id;
    }
}

测试

启动服务后,观察Nacos客户端,发现服务正常注册

如果无法注册,看一下Naco客户端版本和依赖版本是否一致

image-20230423140001728

为了演示负载均衡,我们复制一个cloudalibaba-provider-payment9002出来,此处代码就省略了。

启动9001,9002,可以看到实例数增加了

image-20230423140516972

服务消费者

创建一个新的服务cloudalibaba-consumer-nacos-order83

引入依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

编写配置文件

service-url.nacos-user-service是为了后续RestTemplate更方便的调用支付服务

server:
  port: 83

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

management:
  endpoints:
    web:
      exposure:
        include: '*'
        
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
  nacos-user-service: http://nacos-payment-provider

启动类

@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
    public static void main(String[] args) {
        SpringApplication.run(OrderNacosMain83.class, args);
    }
}

业务类

@RestController
public class OrderNacosController {
    @Resource
    private RestTemplate restTemplate;

    @Value("${service-url.nacos-user-service}")
    private String serverURL;

    @GetMapping("/consumer/payment/nacos/{id}")
    public String paymentInfo(@PathVariable("id") Long id) {
        return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
    }
}

RestTemplate配置

Nacos集成了Ribbon,所以具有负载均衡的功能,可以从依赖关系图看出来

image-20230423141504437

@Configuration
public class ApplicationContextBeanConfig {
    @Bean
    @LoadBalanced //让RestTemplate具备负载均衡的能力
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

测试

通过测试可以发现能调通9001、9002服务,并且具有负载均衡功能

image-20230423141602262

服务注册中心的对比

市面上还有很多服务注册中心,例如Eureka、ZooKeeper等,而Nacos有什么优点呢?

CAP是我们的关注点,C是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。

一般来说,如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring cloud 和 Dubbo 服务,都适用于AP模式,AP模式为了服务的可能性而减弱了一致性,因此AP模式下只支持注册临时实例。

如果需要在服务级别编辑或者存储配置信息,那么 CP 是必须,K8S服务和DNS服务则适用于CP模式。

CP模式下则支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。

默认情况下Nacos是AP,也可以通过命令切换成CP模式

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

服务配置中心

Nacos也可以用来做服务配置中心,Config有的功能他也有,Config没有的功能他还有,印证了一句经典台词东厂管不了的,我西厂管;东厂管得了的,我西厂更要管!

基本配置

项目代码

添加依赖

以后有关于Nacos的依赖,我们一般都引入两个,一个是服务注册中心,一个是服务配置中心

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

编写配置文件

这里我们需要有两个配置文件bootstrap.yml以及application.yml

Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,

拉取配置之后,才能保证项目的正常启动。

springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

# bootstrap.yml
server:
  port: 3377

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos作为注册中心地址
      config:
        server-addr: localhost:8848 # nacos作为配置中心地址
        file-extension: yml # 指定yml格式的配置

# application.yml
spring:
  profiles:
    active: test

业务类

注意添加@RefreshScope注解,可以实现动态刷新

@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class ConfigClientController {
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/config/info")
    public String getConfigInfo() {
        return configInfo;
    }
}

Nacos配置

在学习Config时,我们将配置文件存放在git上,而Nacos可以直接存储在服务端。

命名规则

在官方文档中,也可以查看他的命名规则

image-20230423154004404

整理一下,命名规则如下

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

可以根据命名规则创建两个配置文件

image-20230423154335419

image-20230423154348114

通过对spring.profiles.active属性值的修改,可以读取到不同配置文件的内容。

动态刷新

通过修改Nacos上的配置文件,可实现动态刷新功能

image-20230423154509558

分类配置

问题

问题1:实际开发中,通常一个系统会准备dev开发环境、test测试环境、prod生产环境。如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件呢?

问题2:一个大型分布式微服务系统会有很多微服务子项目,每个微服务项目又都会有相应的开发环境、测试环境、预发环境、正式环境…那怎么对这些微服务配置进行管理呢?

解决方案

Nacos为此设计了一套解决方案,通过Namespace+Group+DataID可以很好的解决

可以理解为Java的包,一层包着一层

image-20230423155025651

DataID方案

此方案就是基础配置中演示的,spring.profiles.active配置什么读取的就是什么,不在赘述。

Group方案

新建两个配置文件,如下图所示

image-20230423155339913

image-20230423155429311

在DataID相同的情况下,可以通过Group来区分两个配置文件

修改bootstrap.yml

添加如下配置

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 
      config:
        server-addr: localhost:8848 
        file-extension: yml 
        group: TEST_GROUP # 读取指定的组

Namespace方案

在Nacos服务端,新增两个命名空间

image-20230423155855321

在该命名空间下新增一个配置文件

image-20230423160029669

修改bootstrap.yml

spring:
  application:
    name: nacos-order-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 
      config:
        server-addr: localhost:8848
        file-extension: yml
        namespace: 2e44af2f-e009-4c21-a407-d21a149f22e6 # 读取指定的命名空间

Nacos集群与持久化!!!

前面只是学习如何使用Nacos,真正需要掌握的在于集群与持久化,官方文档里明确表示一个Nacos集群至少有3个服务存在才行,这也是工作中常用的。

在这里插入图片描述

官方文档的示意图有些难以理解,我们来看下面这张图,现在我们要做的事当一个请求访问Nacos配置中心的配置文件时,通过Nginx转发他的请求,去集群中选一个服务进行处理,并且我们需要持久化的操作,Nacos支持MySQL。

在这里插入图片描述

持久化

  • 1.安装数据库,版本要求:5.6.5+
  • 2.初始化mysql数据库,数据库初始化文件:mysql-schema.sql
  • 3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=xxx
db.password=xxx

通过修改以上配置,可以将Nacos的数据存储在MySQL中。

Linux版本下的集群

现在是动手实操环节,我们需要实现如下图所示的效果

在这里插入图片描述

Linux安装Nacos

可以参考该博主的文章。Linux安装Nacos

配置持久化

找到/nacos/conf/nacos-mysql.sql文件,这个文件的作用是创建数据表,执行结果如下

在这里插入图片描述

接下来需要修改application.properties文件

spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

集群搭建

我们将要梳理出3台nacos集群的不同服务端口号3333,4444,5555

复制cluster.conf文件

在这里插入图片描述

编辑cluster.conf文件,表示这几个服务构成一个集群

在这里插入图片描述

启动脚本

因为在同一台机器上,我们不能每次启动都是同一个端口,所以需要修改start.sh文件,我们希望可以通过./start.sh -port 3333来指定Nacos启动的端口。标红地方需要添加。

在这里插入图片描述

在这里插入图片描述

通过命令行启动Nacos

./startup.sh -port 3333
./startup.sh -port 4444
./startup.sh -port 5555

Nginx负载均衡

最后我们希望外部访问1111端口,由Nginx来帮忙转发到指定的服务去

修改nginx.conf

upstream cluster{
        server 127.0.0.1:3333;
        server 127.0.0.1:4444;
        server 127.0.0.1:5555;
    }

server {
        listen       1111;
        server_name  localhost;
        location / {
         proxy_pass http://cluster;
        }
}

最后重启一下Nginx就可以使用ip:1111/nacos访问啦

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HBase进阶——文件的合并、 MemStore Flush、StoreFile Compaction、 Region Split、高可用与预分区介绍

系列文章目录 centos7虚拟机下hbase的使用案例讲解 hbase进阶操作——读流程与写流程介绍 centos7虚拟机在集群zookeeper上面配置hbase的具体操作步骤 文章目录 系列文章目录 一、HBase的架构原理 1、StoreFile 2、MemStore 3、WAL 二、HBase的shell操作 2.1、创建表…

pytest使用 一(安装、简单的测试用例、运行)

Pytest框架 — 1.Pytest测试框架介绍 - 知乎 2023最新pytest接口自动化测试框架&#xff0c;三天带你精通pytest&#xff0c;带你写出最好的代码&#xff01;&#xff08;已更新2023新版&#xff09;_哔哩哔哩_bilibili 一、pytest安装 pip3 install pytest # 查看pytest版本…

前端学习--Ajax(1) get/post

一、客户端和服务器 上网的目的&#xff1a;借助互联网获取和消费资源 1.1 服务器 负责存放和对外提供资源的计算机 1.2 客户端 负责获取和消费资源的计算机 二、URL地址 2.1 概念 Uniform Resource Locator 中文叫统一资源定位符&#xff0c;标识互联网上每一个资源的存…

(3)相关概念和索引的CURD

核心概念 https://www.elastic.co/guide/en/elasticsearch/reference/7.10/index.html 什么是搜索引擎&#xff1f; 全文搜索引擎 自然语言处理&#xff08;NLP&#xff09;、爬虫、网页处理、大数据处理。如谷歌、百度、搜狗、必应等等。 垂直搜索引擎 有明确搜索目的的…

脉诊在现代医学中的应用与局限性

目录 一、脉诊在疾病诊断中的作用及局限性 二、现代脉诊仪的可靠性 三、中医在现代医学中的地位 四、中西医结合的发展趋势 结论 一、脉诊在疾病诊断中的作用及局限性 脉诊作为中医诊断的重要方法之一&#xff0c;通过检测脉搏波的特征来了解患者的身体状况&#xff0c;进…

学习笔记:《Foundation models for generalist medical artificial intelligence》

目录 一、GMAI模型的概念与优势 二、GMAI模型面临的挑战 1.验证 2.社会偏见 3.隐私 4.规模 5.技术挑战 三、结论&#xff1a; 参考文献 最近在《Nature》杂志上发表的一篇名为《Foundation models for generalist medical artificial intelligence》的文章&#xff0c…

品牌如何借助江湖老大“音乐记忆”做宣传?

去年有个卖咖啡的小姐姐火了&#xff0c;“咖啡你冲不冲&#xff0c;冲冲冲冲冲”节奏分明、及其洗脑&#xff0c;引发众多网友模仿和音频采用。 其实这种借用音乐记忆扩大品牌知名度和传播范围的品宣手段十分常见&#xff0c;仔细回想一下&#xff0c;我们平时听到较为魔性的…

05-Node.js—http模块

目录 1、HTTP 协议1.1 概念1.2 请求报文的组成1.3 HTTP 的请求行1.4 HTTP 请求头1.5 HTTP 的请求体1.6 响应报文的组成 2、创建 HTTP 服务2.1 操作步骤2.2 测试2.3 注意事项 3、获取 HTTP 请求报文3.1 请求方法 request.method3.2 请求版本 request.httpVersion3.3 请求路径 re…

基本绘图函数

基本绘图函数 cv2.line()函数------用于绘制直线. 算子解释&#xff1a; cv2.line(img1, (20, 80), (120, 80), (0, 255, 255))cv2.line(img, pt1, pt2, color, thicknessNone, lineTypeNone, shiftNone) img&#xff1a;背景图。 pt1&#xff1a;直线起点坐标。 pt2&#x…

实战详解docker安装步骤——Linux操作系统(CentOS7.9)下安装容器技术docker引擎

一、安装docker依赖环境 yum install -y yum-utils device-mapper-persistent-data lvm2二、配置国内docker-ce的yum源 &#xff08;这里采用的是阿里云镜像配置文件&#xff09; yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-c…

基于java Springboot+Vue+shiro前后端分离疫情防疫管理系统设计和实现2.0

基于java SpringbootVueshiro前后端分离疫情防疫管理系统设计和实现2.0 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获…

老板们搞怪营业,品牌好感度upup真有梗

老板下场营业最经典的莫过于“老乡鸡”了。在手撕联名信事件出圈后&#xff0c;老乡鸡围绕束从轩创始人IP&#xff0c;开展了一系列社交传播宣传&#xff0c;比如“咯咯哒糊弄学”等。 50多岁的老乡鸡董事长束从轩&#xff0c;一改传统企业家严肃正经的形象&#xff0c;跟着老乡…

Pytorch深度学习笔记(九)加载数据集

目录 1.名词解释 2. 数据集加载器Dataloader 3.完整代码 推荐课程&#xff1a;08.加载数据集_哔哩哔哩_bilibili 1.名词解释 名词解释&#xff1a;Epoch&#xff0c;Batch&#xff0c;Batch-Size&#xff0c;Iterations Epoch&#xff08;周期&#xff09;&#xff1a;指所…

职工管理系统(C++)

职工管理系统有以下8个功能&#xff1a; - 增加职工信息&#xff1a;实现批量添加职工功能&#xff0c;将信息录入到文件中&#xff0c;职工信息为&#xff1a;职工编号、姓名、部门编号 - 显示职工信息&#xff1a;显示公司内部所有职工的信息 - 删除离职职工&#xff1a;按照…

java防止重复提交的方法

为了防止重复提交&#xff0c;可以采用以下几种方法&#xff1a; 1. 令牌机制&#xff08;Token&#xff09; 在表单中添加一个隐藏字段&#xff0c;用于存放一个随机生成的令牌&#xff08;Token&#xff09;。当用户提交表单时&#xff0c;将令牌一起提交到服务器。服务器接收…

Win10系统重装过程(一键装机)

相信不少小伙伴都有刷机重装系统的过程&#xff0c;那种镜像&#xff0c;up盘&#xff0c;压缩包等多个复杂过程也折磨的大伙不堪重负&#xff0c;因此本期带来简易版一键装机相应操作。 下载地址&#xff1a; 小心点击下方链接&#xff0c;点击即下载&#xff08;3.66GB&…

SAM:图像分割的里程碑

Facebook的新模型称为SAM或Segment Anything Model&#xff0c;具有在计算机视觉行业中引起积极变革的潜力。这个突破性模型不同于以前使用的任何其他图像分割模型。 传统上&#xff0c;会为不同类型的图像&#xff0c;如人或汽车&#xff0c;分别训练不同的模型&#xff0c;但…

成功上岸国防科大!

Datawhale干货 作者&#xff1a;王洲烽&#xff0c;太原理工大学&#xff0c;Datawhale成员 写在前面 相比较于一般的经验贴&#xff0c;我更想在这里讲述一下自己的故事。我一开始报考的是北理工&#xff0c;但很遗憾9月份北理改考408了&#xff0c;无缘京爷&#xff0c;所以…

路径规划 | 图解概率路图PRM原理及其参数分析

目录 0 专栏介绍1 基于采样的规划算法2 概率路图基本原理3 PRM算法流程4 PRM参数分析4.1 采样点数4.2 阈值 d max ⁡ \mathrm{d}_{\max} dmax​ 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划…

nginx简单介绍

文章目录 1. 下载并解压2. 80端口被占用&#xff0c;更改nginx默认的监听端口3. 访问nginx4. 在linux上安装nginx5. nginx常用命令6. nginx.conf 1. 下载并解压 官网下载 2. 80端口被占用&#xff0c;更改nginx默认的监听端口 更改conf/nginx.conf文件 3. 访问nginx ht…