SpringCloud之AlibabaNacos


说明:关于SpringCloud系列的文章中的代码都在码云上面
地址: https://gitee.com/zh_0209_java/springcloud-alibaba.git

作用

  • 服务限流降级:默认支持Servlet.Feign, RestTemplate, Dubbo,和 RocketMQ 限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级Metrics 监控
  • 服务注册与发现:适配Spring Cloud 服务注册与发现标准,默认集成了Ribbon 的支持。
  • 分布式配置的管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
  • 消息驱动能力:基于Spring Cloud Stream 为微服务应用构建消息驱动能力。
  • 阿里云对象存储:
  • 分布式任务调度

Nacos

简介

一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。也就是注册中心 + 配置中心的组合。
nacos 支持AP原则也支持CP 原则

下载

官方下载地址
下载后解压到当前目录
在这里插入图片描述
进入到bin目录中,然后cmd进入命令行模式,启动startup.cmd
在这里插入图片描述
在这里插入图片描述
启动成功后访问 http://localhost:8848/nacos 默认用户名和密码都是 nacos
在这里插入图片描述

新建项目cloudalibaba-provider-payment9001

  1. 修改pom

	<dependencies>
		<!--SpringCloud alibaba Nacos-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
	</dependencies>
  1. 修改配置文件
server:
  port: 9001

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

# 配置监控暴露端点
management:
  endpoints:
    web:
      exposure:
        include: "*"
  1. 启动类上注意添加@EnableDiscoveryClient, 表示这是客户端,启动9001,刷新nacos图形化页面
    在这里插入图片描述

Nacos 和CAP

在这里插入图片描述

Nacos 支持 AP 和CP 模式的切换

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

何时选择使用何种模式?

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

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

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

切换AP 和CP的命令 curl -X put "$NACOS_SERVER:8848/nacos/v1/ns/operator/switches:entry=serverMode&value=CP"

Nacos 作为配置中心

基础配置

新建项目cloudalibaba-config-nacos-client3377
  1. 修改pom
<dependencies>
		<!--nacos-config依赖-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
		</dependency>

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

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
	</dependencies>
  1. 添加bootstrap.ymlapplication.yml 配置文件
    bootstrap.yml
# =====  nacos 配置  =====
server:
  port: 3377

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos注册中心地址
      config:
        server-addr: localhost:8848  # nacos作为配置中心地址
        file-extension: yaml  # 声明从配置中心中读取的配置文件格式

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

application.yml

spring:
  profiles:
    active: dev

说明:Nacos 同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。

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

Nacos中的匹配规则

Nacos中的dataid 的组成格式及与SpringBoot 配置文件中的匹配规则

dataId的完整格式如下:
${prefix}-${spring.profile.active}.${file-extension}

  • prefix 默认为 spring.application.name的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。
  • spring.profile.active 即为当前环境对应的profile,注意:当spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId的拼接格式变成${prefix}.${file-extension}
  • file-extension为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 个 yaml 类型
    在这里插入图片描述
    启动服务测试,
    在这里插入图片描述
    注意:nacos作为配置中心,当配置信息发生变化时,发现客户端跟着动态的发生变更

nacos作为配置中心的分类配置

Namespace+Group+DataId三者关系?

默认情况下:
Namespace=public, Group=DEFAULT_GROUP, 默认Cluster 时DEFAULT
Nacos 默认的命名空间是public,Namespace 主要用来实现隔离
比如说我们现在有三个环境:开发,测试,生产环境,我们就可以创建三个Namespace, 不同的Namespace 之间是隔离的

Group 默认是 DEFAULT_GROUP, Group 可以把不同的微服务划分到同一个分组里面去

类似Java里面的package 名和类名,

最外层的namespace 是可以用于区分部署环境的,Group 和DataID 逻辑上区分两个目标对象
在这里插入图片描述

spring:
  application:
    name: nacos-config-client
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 # nacos注册中心地址
      config:
        server-addr: localhost:8848  # nacos作为配置中心地址
        file-extension: yaml  # 声明从配置中心中读取的配置文件格式
#        group: DEV_GROUP  # 指定分组,不指定默认是 DEFAULT_GROUP
#        namespace: 7c86e828-02fd-405d-9098-f2624077a827 # 指定命名空间,默认是public

Nacos 集群和持久化配置

默认Nacos 使用嵌入式数据库实现数据的存储。所以如果启动多个默认配置下的Nacos节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos采用了集中式存储的方式来支持集群化部署,目前只支持MySQL的存储

Nacos支持三种部署模式
  • 单机模式 - 用于测试和单积试用
  • 集群模式 - 用于生产环境,确保高可用
  • 多集群模式 - 用于多数据中心场景
Nacos持久化配置解释

Nacos 默认自带的是嵌入式数据库derby.

derby 切换到MySQL 配置步骤

因为我这里使用的是1.14版本的nacos

  1. nacos-server-1.1.4\nacos\conf 目录下找到sql脚本,nacos-mysql.sql 脚本并执行
  2. 在nacos的conf目录下修改application.properties配置文件
# ======================================
#  将内置数据库derby 切换成mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://10.10.11.21:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456

注意:低版本nacos与高版本MySQL不适配,比如我这里的nacos1.1.4 与MySQL8 就不能适配,需要使用MySQL5.7;

Docker 部署 Nacos

# 提前准备好MySQL 数据库,这里用的是 1.1.4版本的nacos, 需要使用5.7版本的mysql
docker run -d --name mysql -p 3306:3306 mysql:5.7

需要在数据库中创建 nacos_config库,以及将nacos需要的表sql脚本执行
在这里插入图片描述

# 下载 nacos1.1.4版本
docker pull  nacos/nacos-server:1.1.4
# 在宿主机上创建文件夹用来存放nacos的配置文件
mkdir -p zhanghang/nacos/conf
# 在将application.properties 配置文件放到 zhanghang/nacos/conf 目录下
docker cp nacos:/home/nacos/conf/application /zhanghang/nacos/conf
# 如果mysql 也是在本机上运行的,需要查看mysql的容器ip
# docker inspect --format='{{.NetworkSettings.IPAddress}}' ID/name
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql
# vim 修改application.properties配置文件,将mysql的连接加入到配置文件的最后面
# 使用 i 进入编辑模式,使用 ESC按钮 进入命令模式,在使用 :wq  保存退出
#  将内置数据库derby 切换成mysql
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://10.10.11.21:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
# 启动nacos
docker run -d --name nacos -e MODE=standalone -v /zhanghang/nacos/conf/applicatioin.properties:/home/nacos/conf/application.properties -p 8848:8848 nacos/nacos-server:1.1.4

启动成功后浏览器访问 虚拟机ip:8848/nacos

在这里插入图片描述测试新建一个配置,然后查看数据库

在这里插入图片描述
在这里插入图片描述
至此,docker部署nacos完成

Docker 部署集群nacos

因我自己本地的虚拟机大小受限,所以我只能启动两个nacos

docker run -d \
-e PREFER_HOST_MODE=hostname \
-e NACOS_APPLICATION_PORT=8846 \   # 指定当前nacos的端口
-e NACOS_SERVERS="10.10.11.21:8846 10.10.11.21:8847 10.10.11.21:8848" \  # 指定nacos集群的信息
-e MYSQL_SERVICE_HOST=localhost \  # 指定mysql的ip
-e MYSQL_SERVICE_PORT=3306 \       # 指定mysql的端口
-e MYSQL_SERVICE_DB_NAME=nacos_config \ # 指定mysql的数据库名称
-e MYSQL_SERVICE_USER=root\             # 指定mysql的用户名
-e MYSQL_SERVICE_PASSWORD=123456\       # 指定mysql的密码
-e SPRING_DATASOURCE_PLATFORM=mysql \   # 指定数据库的类型
-e NACOS_SERVER_IP=10.10.11.21 \        # 指定nacos服务的ip
-e JVM_XMS=612m \                       # 指定java进程的最小Java堆大小
-e JVM_XMX=612m \                       # 指定java进程的最大Java堆大小
-e JVM_XMN=256m \                       # 设置年轻代大小
-e JVM_MS=32m \
-e JVM_MMS=80m \
--e MODE=cluster \                    # 设置为集群模式,standalone为单机模式
-p 8846:8846 \                        # 映射端口
--name my-nacos1 \
nacos/nacos-server

docker run -d \
-e PREFER_HOST_MODE=hostname \
-e NACOS_APPLICATION_PORT=8847 \  # 指定当前nacos的端口
-e NACOS_SERVERS="10.10.11.21:8846 10.10.11.21:8847 10.10.11.21:8848" \  # 指定nacos集群的信息
-e MYSQL_SERVICE_HOST=localhost \  # 指定mysql的ip
-e MYSQL_SERVICE_PORT=3306 \       # 指定mysql的端口
-e MYSQL_SERVICE_DB_NAME=nacos_config \ # 指定mysql的数据库名称
-e MYSQL_SERVICE_USER=root\             # 指定mysql的用户名
-e MYSQL_SERVICE_PASSWORD=123456\       # 指定mysql的密码
-e SPRING_DATASOURCE_PLATFORM=mysql \   # 指定数据库的类型
-e NACOS_SERVER_IP=10.10.11.21 \        # 指定nacos服务的ip
-e JVM_XMS=612m \                       # 指定java进程的最小Java堆大小
-e JVM_XMX=612m \                       # 指定java进程的最大Java堆大小
-e JVM_XMN=256m \                       # 设置年轻代大小
-e JVM_MS=32m \
-e JVM_MMS=80m \
--e MODE=cluster \                    # 设置为集群模式,standalone为单机模式
-p 8847:8847 \                        # 映射端口
--name my-nacos2 \
nacos/nacos-server

两个nacos都启动起来之后访问

在这里插入图片描述

配置nginx.conf

 upstream nacos_server {
 # 10.10.11.21就是虚拟机ip, 8846和8847就是在虚拟机中启动的nacos集群ip
  	server 10.10.11.21:8846;
	server 10.10.11.21:8847;
}

  server{
	listen 80;
        server_name localhost; 
        location / {
		proxy_pass http://nacos_server;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header Host $host;
		proxy_set_header    HTTP_X_FORWARDED_FOR $remote_addr;#在多级代理的情况下,记录每次代理之前的客户端真实ip
                proxy_redirect      default;#指定修改被代理服务器返回的响应头中的location头域跟refresh头域数值
     }
}

启动nginx

docker run -d -v /zhanghang/nginx/conf/nginx.conf:/etc/nginx/nginx.conf --net=host      -- name=nginx_nacos nginx

访问测试
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值