首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >SpringCloud Alibaba Nacos 服务注册和配置中心

SpringCloud Alibaba Nacos 服务注册和配置中心

作者头像
OY
发布2022-03-17 19:27:19
发布2022-03-17 19:27:19
8920
举报
文章被收录于专栏:OY_学习记录OY_学习记录

博客参考学习视频

SpringCloud Alibaba Nacos 服务注册和配置中心

一、Nacos 简介

① 为什么叫 Nacos

前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 Service。

② 是什么

一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心。

Nacos : Dynamic Naming and Configuration Service

Nacos 就 是 注 册 中 心 + 配 置 中 心 的 组 合 等 价 于 Nacos = Eureka + Config+Bus

③ 能干嘛

  • 代替 Eureka 做服务注册中心
  • 替代 Config 做服务配置中心

④ 去哪下

https://github.com/alibaba/Nacos

官网文档:

⑤ 各种注册中心比较

二、安装并运行 Nacos

① 本地 Java8+Maven 环境已经 OK

② 先从官网下载 Nacos

https://github.com/alibaba/nacos/releases/tag/1.1.4

③ 解压安装包, 直接运行 bin 目录下的 startup.cmd

④ 命令运行成功后直接访问 http://localhost:8848/nacos

默认账号密码都是 nacos

三、Nacos 作为服务注册中心演示

① 官网文档

https://nacos.io/zh-cn/docs/what-is-nacos.html

② 基于 Nacos 的服务提供者

新建 Module: cloudalibaba-provider-payment9001

POM

  1. 父 POM
代码语言:javascript
复制
<!--Spring cloud alibaba 2.1.0.RELEASE-->
<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>
  1. 本模块 POM
代码语言:javascript
复制
<dependencies>
    <!--SpringCloud ailibaba nacos -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <!-- SpringBoot整合Web组件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <!--日常通用jar包配置-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

YML

代码语言:javascript
复制
server:
  port: 9001

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

management:
  endpoints:
    web:
      exposure:
        include: "*"

主启动

代码语言:javascript
复制
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
     public static void main(String[] args) {
           SpringApplication.run(PaymentMain9001.class, args);
      }
}

业务类

代码语言:javascript
复制
@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;
    }
}

测试

  • http://lcoalhost:9001/payment/nacos/1
  • nacos 控制台

nacos 服务注册中心 + 服务提供者 9001 都 OK

③ 演示 nacos 的负载均衡,参照 9001 新建 9002

新建 cloudalibaba-provider-payment9002

9002 其他步骤参考 9001

或者取巧不想新建重复的劳动力,直接拷贝虚拟端口映射

④ 基于 Nacos 的服务消费者

新建 Module: cloudalibaba-consumer-nacos-order83

POM

代码语言:javascript
复制
<dependencies>
        <!--SpringCloud ailibaba nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>com.atguigu.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- SpringBoot整合Web组件 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--日常通用jar包配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

==为什么 nacos 支持负载均衡: 因为依赖了 ribbon==

YML

代码语言:javascript
复制
server:
  port: 83

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

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

主启动

代码语言:javascript
复制
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
     public static void main(String[] args) {
           SpringApplication.run(OrderNacosMain83.class, args);
      }
}

业务类

ApplicationContextBean

代码语言:javascript
复制
@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

OrderNacosController

代码语言:javascript
复制
@RestController
@Slf4j
public class OrderNacosController {

    @Resource
    private RestTemplate restTemplate;

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

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

测试

① nacos 控制台

http://localhost:83/consumer/payment/nacos/13

③ 83 访问 9001/9002, 轮询负载 OK

⑤ 服务注册中心对比

Nacos 全景图所示

Nacos 和 CAP

Nacos 支持 AP 和 CP 模式的切换

代码语言:javascript
复制
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

四、Nacos 作为服务配置中心演示

① Nacos 作为配置中心-基础配置

cloudalibaba-config-nacos-client3377

POM

代码语言:javascript
复制
<dependencies>
        <!--nacos-config-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!--nacos-discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--web + actuator-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--一般基础配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

YML

  1. why 配置两个 Nacos 同 springcloud-config 一样,在项目初始化时,要保证先从配置中心配置拉取,拉取配置之后,才能保证项目的正常启动。 springboot 中配置文件的加载是存在优先级顺序的,bootstrap 优先级高于 application
  2. bootstrap
代码语言:javascript
复制
# 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 #指定yaml格式的配置
  1. application.yml
代码语言:javascript
复制
spring:
  profiles:
    active: dev

主启动

代码语言:javascript
复制
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377 {
     public static void main(String[] args) {
           SpringApplication.run(NacosConfigClientMain3377.class, args);
      }
}

业务类(controller)

代码语言:javascript
复制
@RestController
@RefreshScope
public class ConfigClientController {

    @Value("${config.info}")
    private String configinfo;

    @GetMapping("/config/info")
    public String getConfiginfo(){
       return configinfo;
    }
}

注意@RefreshScope

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新

② 在 Nacos 中添加配置信息

  1. Nacos 中的匹配规则

理论:

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

官网https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

③ 实操

配置新增: nacos-config-client-dev

Nacos 界面配置对应

==设置 DataId==

公 式 : {spring.application.name}-{spring.profile.active}.

  • prefix 默认为 spring.application.name 的值
  • spring.profile.active 既 为 当 前 环 境 对 应 的 profile, 可 以 通 过 配 置 项 spring.profile.active 来配置
  • file-exetension 为 配 置 内 容 的 数 据 格 式 , 可 以 通 过 配 置 项 spring.cloud.nacos.config.file-extension 配置

小总结说明

测试

  1. 启动前需要在 nacos 客户端-配置管理-配置管理栏目下有没有对应的 yaml 配置文件
  2. 运行 cloud-config-nacos-client3377 的主启动类
  3. 调用接口查看配置信息: http://localhost:3377/config/info 自带动态刷新

自带动态刷新

修改下 Nacos 中的 yaml 配置文件, 再次调用查看配置的接口, 就会发现配置已经刷新

④ Nacos 作为配置中心-分类配置

问题: 多环境多项目管理

Nacos 的图形化管理界面

  1. 配置管理
  1. 命名空间

Namespace+Group+Data ID 三者关系? 为什么这么设计?

Case

1.DataID 方案

指定 spring.profile.active 和配置文件的 DataID 来使不同环境下读取不同的配置 默认空间+默认分组+新建 dev 和 test 两个 DataID

新建 dev 配置 DataID

新建 test 配置 DataID

通过 spring.profile.active 属性就能进行多环境下配置文件的读取

测试

  • http://localhost:3377/config/info 配置是什么就加载什么: test
2.Group 方案

通过 Group 实现环境区分 新建 Group

在 nacos 图形界面控制台上面新建配置文件 DataID

bootstrap+application

​ 在 config 下 增 加 一 条 group 的 配 置 即 可 。 可 配 置 为 DEV_GROUP 或 TEST_GROUP

3.Namespace 方案

新建 dev/test 的 Namespace

回到服务管理-服务列表查看

按照域名配置填写

YML

  • Bootstrap
代码语言:javascript
复制
namespace:
  • Application: 不变

五、Nacos 集群和持久化配置

① 官网说明

https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html

官网架构图:

上图官网翻译, 真实情况

==说明==

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

Nacos 支持三种部署,模式

  • 单机模式,用于测试和单机试用
  • 集群部署,用于生产环境,确保高可用。
  • 多集群模式,用于多数据中心场景。

windows

cmd starup.cmd 或者双击 startup.cmd 文件

单机模式支持 mysql

按照上述: 我们需要 mysql 数据库。

==官网说明==

https://nacos.io/zh-cn/docs/deployment.html

② Nacos 持久化配置解释

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

derby 到 mysql 切换配置步骤

  1. nacos-server-1.1.4\nacos\conf 目录下找到 sql 脚本

执行脚本:

代码语言:javascript
复制
CREATE DATABASE nacos_config;
USE nacos_config;
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
CREATE TABLE `config_info` (
	`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
	`data_id` varchar(255) NOT NULL COMMENT 'data_id',
	`group_id` varchar(255) DEFAULT NULL,
	`content` longtext NOT NULL COMMENT 'content',
	`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
	`gmt_create` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '创建时间',
	`gmt_modified` datetime NOT NULL DEFAULT '2010-05-05 00:00:00' COMMENT '修改时间',
	`src_user` text COMMENT 'source user',
	`src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',`app_name` varchar(128) DEFAULT NULL,
	`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
	`c_desc` varchar(256) DEFAULT NULL,
	`c_use` varchar(64) DEFAULT NULL,
	`effect` varchar(64) DEFAULT NULL,
	`type` varchar(64) DEFAULT NULL,
	`c_schema` text,
	PRIMARY KEY (`id`),
	UNIQUE KEY `uk_configinfo_datagrouptenant` (`data_id`,`group_id`,`tenant_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='config_info';

....省略后面的。参考自己的
  1. nacos-server-1.1.4\nacos\conf 目 录 下 找 到 application.properties 在文件下面添加
代码语言:javascript
复制
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow

参考

启动 nacos, 可以看到是个全新的空记录界面, 以前是记录进 derby

③ Linux 版 Nacos+MySQL 生产环境配置

预计需要, 1 个 nginx+3 个 nacos 注册中心+1 个 mysql

Nacos 下载 linux 版本

  1. https://github.com/alibaba/nacos/releases/tag/1.1.4
  2. nacos-server-1.1.4.tar.gz
  3. 解压后安装

集群配置步骤(==重点==)

  1. Linux 服务器上 mysql 数据库配置
  1. application.properties 配置

位置:

内容

代码语言:javascript
复制
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://1.7.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=HF_mysql_654321

**==注意==**:

mysql 授权远程访问

代码语言:javascript
复制
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
flush privileges;

④ Linux 服务器上 nacos 的集群配置 cluster.conf

  • 梳理出 3 台 nacos 机器的不同服务端口号 复制出 cluster.conf

内容

这个 IP 不能写 127.0.0.1,必须是 Linux 命令 hostname -I 能够识别的 IP

⑤ 编辑 Nacos 的启动脚本 startup.sh, 使它能够接受不同的启动端

/mynacos/nacos/bin 目录下有 startup.sh 在什么地方, 修改什么, 怎么修改 思考

修改内容

==注意:==

代码语言:javascript
复制
这里是 —Dserver.port=${PORT}, 不要误认为是“.”

在启动前一定要先启动 mysql 服务,不然 nacos 会报错:

代码语言:javascript
复制
[root@localhost ~]# service mysql start

执行方式

同时通过 window 浏览器访问

  • http://192.168.64.129:3333/nacos/#/login
  • http://192.168.64.129:4444/nacos/#/login
  • http://192.168.64.129:5555/nacos/#/login

⑥ Nginx 的配置, 由它作为负载均衡器

安装 nginx 请参考我这篇博客:

修改 nginx 的配置文件

nginx.conf

代码语言:javascript
复制
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
  	}
	....省略

按照指定启动

⑦ 截止到此处, 1 个 Nginx+3 个 nacos 注册中心+1 个 mysql

  • 测试通过 nginx 访问 nacos https://写你自己虚拟机的 ip:1111/nacos/#/login
  • 新建一个配置测试
  • linux 服务器的 mysql 插入一条记录

⑧ 测试

​ 微服务 cloudalibaba-provider-payment9002 启动注册进 nacos 集群

Yml

代码语言:javascript
复制
server-addr: 写你自己的虚拟机 ip:1111

结果

六、高可用小总结

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SpringCloud Alibaba Nacos 服务注册和配置中心
    • 一、Nacos 简介
      • ① 为什么叫 Nacos
      • ② 是什么
      • ③ 能干嘛
      • ④ 去哪下
      • ⑤ 各种注册中心比较
    • 二、安装并运行 Nacos
      • ① 本地 Java8+Maven 环境已经 OK
      • ② 先从官网下载 Nacos
      • ③ 解压安装包, 直接运行 bin 目录下的 startup.cmd
      • ④ 命令运行成功后直接访问 http://localhost:8848/nacos
    • 三、Nacos 作为服务注册中心演示
      • ① 官网文档
      • ② 基于 Nacos 的服务提供者
      • ③ 演示 nacos 的负载均衡,参照 9001 新建 9002
      • ④ 基于 Nacos 的服务消费者
      • ⑤ 服务注册中心对比
    • 四、Nacos 作为服务配置中心演示
      • ① Nacos 作为配置中心-基础配置
      • ② 在 Nacos 中添加配置信息
      • ④ Nacos 作为配置中心-分类配置
    • 五、Nacos 集群和持久化配置
      • ① 官网说明
      • ② Nacos 持久化配置解释
      • ③ Linux 版 Nacos+MySQL 生产环境配置
      • ④ Linux 服务器上 nacos 的集群配置 cluster.conf
      • ⑤ 编辑 Nacos 的启动脚本 startup.sh, 使它能够接受不同的启动端
      • ⑥ Nginx 的配置, 由它作为负载均衡器
      • ⑦ 截止到此处, 1 个 Nginx+3 个 nacos 注册中心+1 个 mysql
      • ⑧ 测试
    • 六、高可用小总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档