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

    技术2022-07-10  131

    一、Nacos简介

    1.1 为什么叫Nacos

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

    谁在使用Nacos

    https://nacos.io/zh-cn/

    https://github.com/alibaba/nacos/issues/273

    1.2 是什么

    一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台

    Nacos:Dynamic Naming and Configuration Service

    Nacos就是注册中心+配置中心的组合

    等价于 Nacos = Eureka + Config + Bus

    1.3 能干嘛

    替代Eureka做服务注册中心

    替代Config做服务配置中心

    1.4 去哪下

    https://github.com/alibaba/Nacos

    1.4.1 官网文档

    https://nacos.io/zh-cn/index.html

    https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery

    1.5 各种注册中心比较

    二、安装并运行Nacos

    本地Java8+Maven环境已经OK

    2.1 先从官网下载Nacos

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

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

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

    默认账号密码都是nacos

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

    3.1 官网文档

    https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery

    3.2 基于Nocos的服务提供者

    3.2.1 新建Module

    cloudalibaba-provider-payment9001

    cloudalibaba-provider-payment9002

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

    3.2.2 POM

    父POM引入

    <!--spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency>

    本模块POM

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.atguigu.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-provider-payment9001</artifactId> <dependencies> <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-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>

    3.2.3 YML

    server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848 #配置Nacos地址 management: endpoints: web: exposure: include: '*'

    3.2.4 主启动

    package com.atguigu.springcloud.alibaba; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class PaymentMain9001 { public static void main(String[] args) { SpringApplication.run(PaymentMain9001.class,args); } }

    3.2.5 业务类

    package com.atguigu.springcloud.alibaba.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @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; } }

    3.2.6 测试

    http://localhost:9001/payment/nacos/1

    http://localhost:8848/nacos

    nacos控制台

    3.3 基于Nacos的服务消费者

    3.3.1 新建Module

    cloudalibaba-consumer-nacos-order83

    3.3.2 POM

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.atguigu.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-consumer-nacos-order83</artifactId> <dependencies> <!--SpringCloud ailibaba nacos --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.atguigu.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency> <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>

    为什么nacos支持负载均衡

    3.3.3 YML

    server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: localhost:8848 service-url: nacos-user-service: http://nacos-payment-provider

    3.3.4 主启动

    package com.atguigu.springcloud.alibaba; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnableDiscoveryClient @SpringBootApplication public class OrderNacosMain83 { public static void main(String[] args) { SpringApplication.run(OrderNacosMain83.class,args); } }

    3.3.5 业务类

    package com.atguigu.springcloud.alibaba.config; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * @author by Jak * @date 2020/6/30 */ @Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } } package com.atguigu.springcloud.alibaba.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; /** * @author by Jak * @date 2020/6/30 */ @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); } }

    3.3.6 测试

    启动9001、9002、83

    nacos控制台

     

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

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

    四、服务注册中心对比

    4.1 Nacos全景图所示

    4.2 Nacos和CAP

    4.3 Nacos支持AP和CP模式的切换

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

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

    4.1.1 建Module

    cloudalibaba-config-nacos-client3377

    4.1.2 POM

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.atguigu.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloudalibaba-config-nacos-client3377</artifactId> <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>

    4.1.3 YML

    bootstrap

    server: port: 3377 spring: application: name: nacos-config-client cloud: nacos: discovery: server-addr: localhost:8848 #服务注册中心地址 config: server-addr: localhost:8848 #配置中心地址 file-extension: yaml #指定yaml格式的配置

    application

    spring: profiles: active: dev

    为什么配置两个

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

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

    4.1.4 主启动

    package com.atguigu.springcloud.alibaba; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * @author by Jak * @date 2020/7/1 */ @EnableDiscoveryClient @SpringBootApplication public class NacosConfigClientMain3377 { public static void main(String[] args) { SpringApplication.run(NacosConfigClientMain3377.class, args); } }

    4.1.5 业务类

    package com.atguigu.springcloud.alibaba.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; /** * @author by Jak * @date 2020/7/1 */ @RestController @RefreshScope //通过SpringCloud原生注解实现配置自动更新 public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } }

    @RefreshScope

    通过SpringCloud原生注解实现配置自动更新

    4.1.6 在Nacos中添加配置信息

    理论

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

    官网

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

    配置新增

    nacos-config-client-dev

    Nacos界面对应配置

    config: info: from nacos config center, nacos-config-client-dev.yaml, version=1

    设置DataId

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

    4.1.7 测试

    http://localhost:8848/nacos/#/configurationManagement?serverId=center&namespace=&edasAppName=&edasAppId=&searchDataId=&searchGroup=&group=&dataId=&appName=

    启动前需要在nacos客户端-配置管理-配置管理栏目下有没有对应的yaml配置文件

    运行cloud-config-nacos-client3377主启动类

    调用接口查看配置信息

    http://localhost:3377/config/info

    可以获取到一下信息

    4.1.8 自带动态刷新

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

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

    4.2.1 问题

    多环境多项目管理

    4.2.2 Nacos的图形化管理界面

    配置管理

    命名空间

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

    4.2.4 DataID方案

    指定spring.profile.active和配置文件的DataId来使不同环境下读取不同的配置

    默认空间+默认分组+新建dev和test两个DataID

    新建dev配置DataID

    新建test配置DataID

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

    测试

    http://localhost:3377/config/info

    配置是什么就加载什么

    test

    4.2.5 Group方案

    通过Group实现环境区分

    新建Group

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

    bootstrap+application

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

    4.2.6 Namespace方案

    新建dev/test的Namespace

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

    按照域名配置填写

    YML

    bootstrap

    五、Nacos集群和持久化配置

    5.1 官网说明

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

    架构图

    真实情况

    官网说明

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

    5.2 Nacos持久化配置解释

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

    https://github.com/alibaba/nacos/blob/develop/config/pom.xml

    5.2.2 derby到mysql切换配置步骤

    D:\StudySoftware\Nacos\nacos-server-1.1.4\nacos\conf目录下找到sql脚本->nacos-mysql.sql

    执行脚本

    nocos-server-1.1.4\nacos\conf目录下找到application.properties

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

    重启nacos

    启动Nacos,可以看到是个全新的空记录界面,以前是记录进derby,说明数据库切换成功了

    新增配置

    成功保存到mysql数据库

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

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

    5.3.1 Nacos下载linux版本

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

    nacos-server-1.1.4.tar.gz

    将其保存到centos的opt文件夹

     

    5.3.1 Nacos下载Linux版安装

    1.下载linux版nacos-server-1.3.2.tar.gz

    2.执行命令:tar -zxvf nacos-server-1.3.2.tar.gz

    3.进入bin目录 cd bin,linux下执行startup.sh

    ./startup.sh -m standalone

    默认启动为集群模式,单机版访问不到页面,要加启动参数standalone 单机模式

    5.3.2 集群配置步骤

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

    2.application.properties配置

    # 表明用mysql作为后端存储 spring.datasource.platform=mysql # 有几个数据库实例 db.num=1 # 第1个实例【从0开始】 db.url.0=jdbc:mysql://10.45.8.239:3306/bsp_dev2_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false db.user=bsp_dev2_db db.password=buctestmysql

    ​​

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

    梳理出3台nacos集群的不同服务端口号

    复制出cluster.conf

    ​​​

     

    内容:这个ip不能写127.0.0.1,必须是linux命令hostname-i能够识别的ip

    ​​​

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

    nacos/bin目录下有startup.sh

    对于一个服务器,平时单机版的启动,都是./startup.sh -m standalone即可,但是,集群启动,希望传递不同的端口号启动不同的nacos实例。

    命令:./startup.sh -P 3333表示启动端口号为3333的nacos服务器实例,和上一步的cluster.conf配置的一致

    执行方式

    # 查看nacos运行状态 ps -ef|grep nacos # 关闭nacos ./shutdown.sh # 开启单机版 ./startup.sh -m standalone # 开启三个节点 ./startup.sh -P 3333 ./startup.sh -P 4444 ./startup.sh -P 5555

    5.nginx的配置,由它作为负载均衡器

    修改nginx的配置文件

    进入,nginx/sbin下,启动nginx

    whereis nginx # 启动nginx ./nginx # 停止nginx ./nginx -s stop # 重启nginx ./nginx -s reload # 查看nginx运行状态 ps -ef|grep nginx

    6.截至到此处,1个Nginx+3个nacos注册中心+1个mysql

    测试,启动三个nacos

    # 开启三个节点 ./startup.sh -P 3333 ./startup.sh -P 4444 ./startup.sh -P 5555 # 查看启动集群数目 ps -ef|grep nacos|grep -v grep |wc -l

    成功启动三个nacos集群

    ​启动nginx,ip地址10.30.5.143 端口号2222

    测试通过nginx访问nacos:http://10.30.5.143:2222/nacos/index.html

    单机版:http://10.30.5.143:8848/nacos/index.html

    ​、

     

    至此,nacos集群和持久化配置完成。

    7.微服务中yaml配置为集群模式

    启动微服务,成功注册进nacos集群

     ​https://www.cnblogs.com/renoside/p/13606521.html

    源码

    Processed: 0.014, SQL: 9