微服务日志从0到1-----第三章Nacos的从入门到集群的搭建与使用(有项目代码,文档详细无坑)

Alibaba Nacos

在上面,已经学习了Eureka 用于服务注册和服务发现了,为什么还要学习Nacos呢?下面是在SpringCloud官网中的SpringAlibaba里面的一段对于Nacos的说明,从功能上可以看出来,Nacos支持的功能要比Eureka多。

  • 流量控制和服务降级: Alibaba Sentinel的流量控制、断路和系统自适应保护
  • 服务注册与发现:实例可以注册到Nacos,客户端可以通过 Spring 管理的 bean 发现实例。通过 Spring Cloud Netflix 支持 Ribbon,客户端负载均衡器
  • 分布式配置:使用Nacos作为数据存储
  • 事件驱动:构建与Spring Cloud Stream RocketMQ Binder连接的高度可扩展的事件驱动微服务
  • Message Bus : 用 Spring Cloud Bus RocketMQ 链接分布式系统的节点
  • Distributed Transaction :支持Seata高性能、易用的分布式事务解决方案
  • Dubbo RPC :通过Apache Dubbo RPC 扩展Spring Cloud service-to-service调用的通信协议

01.安装Nacos

01.下载

https://nacos.io/zh-cn/index.html //这是nacos的官网
https://github.com/alibaba/nacos/releases //nacos的下载地址

02.安装

​ 01.将下载好的Nacos解压在一个中文路径上

​ 02.解压完成后

image-20220630080353787

​ 03.启动nacos

​ 方式一:双击bin/startup.cmd

​ 方式二:

.\startup.cmd -m standalone  //单机启动模式

如果出现找不到JAVA_HOME问题可以在启动脚本中将JAVA_HOME修改为所在路径

image-20220630081522497

02.Nacos快速入门

01.创建父工程

https://github.com/codeXYW/Microservices/tree/main/nacos

02.导入nacos依赖

https://github.com/codeXYW/Microservices/blob/main/nacos/pom.xml

03.创建服务

订单模块: https://github.com/codeXYW/Microservices/tree/main/nacos/order-service
	导入依赖:https://github.com/codeXYW/Microservices/blob/main/nacos/order-service/pom.xml
用户模块: https://github.com/codeXYW/Microservices/tree/main/nacos/user-service
	导入依赖:https://github.com/codeXYW/Microservices/blob/main/nacos/user-service/pom.xml

04.编辑配置文件件

spring:
  application:
  	#必须配置服务名称
    name: user-service
  cloud:
    nacos:
      server-addr: localhost:8848 #nacos 服务地址

05.因为eureka和nacos都是支持rest访问的所以可以在只改变配置文件和依赖即可实现无缝切换,这个时候也可以去nacos控制台查看

03.nacos服务分级模型

一个服务可以有多个实例,可以将这多个实例称之为集群,但是在nacos引入了一个地区的概念(将同一个地区的实例同功能的实例称为一个集群),这就使得会优先访问相同地区的实例,可以降低延时效果,尽可能的避免跨集群的访问

image-20220630092635903

img

04.配置集群

配置集群只需要在配置文件中新增一个配置项

cloud:
  nacos:
    discovery:
      server-addr: 127.0.0.1:8850
      #设置名称
      cluster-name: SH 

实现效果

image-20220630131329068

image-20220630131359040

05.集群属性NacosRule负载均衡

01.根据地区设置负载均衡

上面已经实现了,通过地区配置集群效果,但是没有实现通过地区选择负载均衡效果,要想实现这种负载均衡的效果就得先去修改负载均衡配置规则

user-service: #需要使用地区负载均衡的服务
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

使用了NacosRule后,会优先选择本地服务,如果本地服务中有多个会采用随机选择的方式来进行均衡

02.根据权重设置负载均衡

上面虽然实现了根据地区进行负载均衡,但是并没有考虑过不同的性能好坏而进行服务分发,所以可能会造成性能差的机器会崩掉,所以就需要用到根据管理员设置好的权重来进行配置,让性能好机器来处理更多的用户请求

1.在Nacos控制台设置实例权重

image-20220630140142147

数字越低,访问到的概率就越低,设置为0后则不会被访问到

06.环境隔离

在nacos中可以给实例设置不同的环境,而每个环境的服务又不相同,默认的环境名称为public,也可以自己设置新的环境

image-20220630175901982

设置好命名空间后,就可以在服务中进行配置

  cloud:
    nacos:
      server-addr: 81.69.253.228:8848
      discovery:
        cluster-name: HN
        namespace: 73972537-f019-4e75-8a40-64e2150b5fd6

配置好后就可以在控制台查看,并且不在同一个命名空间(环境)的服务是无法相互访问的。

07.nacos与eureka的不同

在eureka和nacos中服务拉取不会一直拉取而是间歇性的每隔30秒拉取一次,然后缓存在一个列表内,然后从列表里面挑选服务,发送请求,而至于服务的注册eureka和nacos就有所不同,在nacos中会把实例分为临时实例和非临时实例,对于两种不同的实例采取不同的机制:

​ 01.临时实例需要自主去发送心跳包来告诉注册中心存活,而非临时实例则是注册中心会主动去确认实例是否存活

​ 02.临时实例一旦属于不健康状态时就会被注册中心从服务列表中剔除,而非临时实例则会一直存在服务列表等待其成为健康状态

而在eureka中已经挂掉的实例是会从服务列表中剔除,并且不会主动通知服务消费者这个实例已经挂掉了,nacos则会主动的推送给服务消费者

image-20220630195548323

image-20220630200111057

如何设置临时实例和非临时实例

cloud:
    nacos:
      discovery:
      	#注册中心地址
        server-addr: 81.69.253.228:8848
        #服务地区
        cluster-name: SH
        #命名空间
        namespace: 73972537-f019-4e75-8a40-64e2150b5fd6
        #是否为临时实例
        ephemeral: false

08.Nacos配置管理

01.统一配置管理

首先需要创建一个配置

image-20220701113538779

在新建配置时需要注意,配置的内容不是整个配置文件内的所有配置,而是说仅仅是需要热更新的配置可以放入里面,如果不需要热更新的配置是不建议放入nacos中增加服务器压力

image-20220701113920754

02.配置的拉取

在创建好配置后,服务是如何获取到配置的,首先我们需要了解 Nacos 读取配置文件的环节是在哪一步,在没加入 Nacos 配置之前,获取配置是这样:

img

加入 Nacos 配置,它的读取是在 application.yml 之前的:

img

这时候如果把 nacos 地址放在 application.yml 中,显然是不合适的,Nacos 就无法根据地址去获取配置了。

因此,nacos 地址必须放在优先级最高的 bootstrap.yml 文件。

img

首先引入依赖

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

添加配置文件bootstrap.yml

spring:
  application:
    name: order-service # 服务名称
  profiles:
    active: dev #开发环境,这里是dev
  cloud:
    nacos:
      server-addr: 81.69.253.228:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名

根据 spring.cloud.nacos.server-addr 获取 nacos地址,再根据${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。

image-20220701121951340

03.配置热更新

以上只是使用了nacos来进行配置管理,并不能实现配置文件热更新,配置的自动刷新

方式01:在需要热更新的类上加@RefreshScope注解

image-20220701130559930

方式02:在需要注入的类上加@ConfigurationProperties(“前缀”)

image-20220701131107103

image-20220701131312140

04.配置共享

在多环境中,不同的环境配置需求有相同的地方也有不相同的地方,在nacos启动的时候会从这个命名空间内读取多个配置文件

读取规则:

  1. 服务名名+文件后缀名
  2. 服务器名+环境名+文件后缀名
  3. 服务器名

image-20220701163031499

(拓展小点:配置注入时 是单例的,配置发生改变时只会修改变更了的结果,不会影响之前没发生改变的值,如果从配置中抹除配置项,已经注入的对象,是不会发生改变的)

在注册完成后就会有一个多配置文件的优先级问题,nacos默认:服务器名+环境名+文件后缀名> 服务名名+文件后缀名 > 服务名称 > 本地

image-20220701161739268

img

09.搭建nacos集群

01.集群架构解析

img

其中三个Nacos节点,然后统一通过Nginx来对三个Nacos节点进行负载均衡,Nacos之间通过MySql数据库集群来进行数据同步

img

02.搭建集群(单台机器环境下)

01.首先下载nacos,将文件复制为三份修改其配置文件,分别为以下配置

节点ipport
nacos1127.0.0.18848
nacos2127.0.0.18849
nacos3127.0.0.18850

02.配置数据库

Nacos 默认数据存储在内嵌数据库 Derby 中,不属于生产可用的数据库。官方推荐的最佳实践是使用带有主从的高可用数据库集群,主从模式的高可用数据库。这里我们以单点的数据库为例。

首先新建一个数据库,命名为 nacos,而后导入下面的 SQL

SQL文件链接: https://github.com/codeXYW/Microservices/tree/main/nacos/sql

03.配置nacos

进入 nacos 的 conf 目录,修改配置文件 cluster.conf.example,重命名为 cluster.conf

127.0.0.1:8848

127.0.0.1.8849

127.0.0.1.8850

然后修改 application.properties 文件,添加数据库配置

#设置nacos端口
server.port=8848/8849/8850
#添加数据库数据
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456

image-20220701185512698

04.配置Nginx代理

修改 nginx 文件夹下的 conf/nginx.conf 文件,配置如下

upstream nacos-cluster {
    server 127.0.0.1:8845;
    server 127.0.0.1:8846;
    server 127.0.0.1:8847;
}

server {
    listen       80;
    server_name  localhost;

    location /nacos {
        proxy_pass http://nacos-cluster;
    }
}

然后分别启动三个集群 startup.cmd

05.使用集群

spring:
  cloud:
    nacos:
      server-addr: localhost:80 # Nacos地址 之所以是80端口是因为Nginx代理了,访问80端口最后由Nginx来做负载均衡转发

项目文件地址

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeWYX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值