SpringBoot使用Nacos作为配置中心服务和服务注册中心

2023-10-31

简介

从spring开始,所有的配置文件都放在项目中,如果需要修改配置文件内容,则需要登陆服务器重启服务。想象一下如果你有一百台服务的需要修改,那是不可想象的工作量。

目前已有的配置中心

  • 携程开源的Apollo:数据保存在mysql中,支持命名空间和分发更新配置
  • springcloud 中的springcloud config:必须使用git保存配置信息
  • 阿里的开源Nacos

其他项目未关注
最次的就是springcloud config 必须从git,svn才能更新

Nacos 有三大主要功能:

  • 服务发现和服务健康监测
    Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
    Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

  • 动态配置服务
    动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
    动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
    配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
    Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

  • 动态 DNS 服务
    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
    Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

  • 服务及其元数据管理
    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
    在这里插入图片描述

Nacos 确实是极易上手,几乎免安装,只需要简单的解压包, 启动 server 即可,它除了提供配置中心还提供注册中心的作用,可以替代Eureka。
不足。但是官方特别强调了 Nacos v0.8.0 Production Ready 之前不建议在生产上大规模使用,建议使用之后版本在稳定性上要高很多。
Spring Cloud支持使用Eureka、Zookeeper、Consul实现服务发现的能力。Eureka 是其默认的也是推荐的服务注册中心组件。但从Eureka切换成Zookeeper、consul只需要改个依赖,加两行配置就可以了。

辟谣
Eureka没有闭源,是Eurkea 2.x分支不再维护!
Spring Cloud并不强依赖Eureka,不要过分解读

简单入门

官方demo https://github.com/nacos-group/nacos-examples/blob/master/nacos-spring-boot-example
官方git上是有它的demo的,我这里有写了一下
本文配置中心demo源码如下:
https://github.com/BambooZhang/springboot-study.git

服务中心安装和启动

1.JDK环境
2.直接去官网git上下载 tar.gz或者zip格式到本地。
https://github.com/alibaba/nacos

windows安装方式
解压后,直接双击starup.bat

centos

  unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
  cd nacos/bin
#启动
sh startup.sh -m standalone

启动成功后
访问http://localhost:8848/nacos/index.html即可看到如下管理界面

springboot客户端

新建一个springboot工程,我这里直接拷贝了一个springboot项目,修改文件名和工程名以及pom

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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>springboot</groupId>
    <artifactId>springboot-nacos</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-nacos :: 整合 nacos配置中心</name>

    <!-- Spring Boot 启动父依赖 -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
    </parent>

    <properties>
        <nacos-config-spring-boot.version>0.2.1</nacos-config-spring-boot.version>
    </properties>

    <dependencies>

        <!-- Spring Boot Web 依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Test 依赖 -->
        <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>

        <!-- nacos 依赖 -->
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>nacos-config-spring-boot-starter</artifactId>
            <version>${nacos-config-spring-boot.version}</version>
        </dependency>


        <!-- Junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>
</project>

启动类

package org.spring.springboot;

import com.alibaba.nacos.api.config.annotation.NacosValue;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import static org.springframework.web.bind.annotation.RequestMethod.GET;

/**
 * Spring Boot 应用启动类
 *
 * Created by bambo on 19/2/7.
 */
// Spring Boot 应用的标识
@SpringBootApplication
@RestController
@NacosPropertySource(dataId = "bamboo.test", autoRefreshed = true)
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }

    @NacosValue(value = "${service.name:1}", autoRefreshed = true)
    private String serverName;

    @RequestMapping(value = "/test", method = GET)
    @ResponseBody
    public String get() {
        return serverName;
    }


}

配置文件
application.properties

nacos.config.server-addr=127.0.0.1:8848

配置中心配置

这里直接配置管理新增,注意默认group不变哦
在这里插入图片描述
保存发布,然后启动springboot服务,访问http://localhost:8080/test可以看到结果如下,说明成功了,如果修改这个值再发布,刷新url值也会更接着变化。自动刷新的基本功能就实现了

bamboo

扩展知识

其他配置信息

客户端配置文件类型设置

在bootstrap.properties文件中
spring.cloud.nacos.config.file-extension=properties,yml,yaml
属性声明从配置中心中读取的配置文件格式
该配置的缺省值为properties,即默认是读取properties格式的配置文件。当客户端没有配置该属性,并且在nacos server添加的是yml格式的配置文件,则给客户端会读取不到配置文件,导致启动失败。
非properties配置格式,必须添加如下配置才可生效

spring.cloud.nacos.config.file-extension=yml

根据profile设置不同的环境配置

springboot中我们可以通过配置spring.profiles.active 实现在开发、测试、生产环境下采用不同的配置文件
同样,我们同科可以在nacos server分别创建

${application.name}-dev.properties
${application.name}-test.properties
${application.name}-prod.properties

然后通过命令启动jar时 设置spring.profiles.active来实现不同环境下使用不同的配置文件。

java -jar nacos-client-0.0.1-SNAPSHOT.jar --spring.profiles.active=test

同样也适用于yml/yaml文件,只是客户端设置spring.cloud.nacos.config.file-extension=yaml具体可见上一个说明

自定义group

在同一个group下,配置文件名不能重复,所以当需要创建文件名称相同的两个配置文件时,将两个配置文件创建在不同的group下即可。当我们再同一个group下创建一个已有的配置文件时,nacos会将其视为配置文件的修改,而不是新建。
因此我们可以把group作为一个project名称,相当于pom中的artifactId来标示不同的工程,每个工程拥有不同的配置文件即可。
在这里插入图片描述
但是如果创建了新的group那么客户端需要显式的配置group信息否则默认DEFAULT_GROUP空间中会出现找不到或者配置信息不符合你真实想法的情况。

#spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.group=bamboo_group

自定义 namespace 命名空间

相应的如果是服务,我们一般是按照一个服务一个隔离空间的,比如公司有两个不同的业务项目都有amdin服务,那么为了避免不会发生冲突,服务配置中就使用命名空间作为隔离开来。
在这里插入图片描述
上图我创建了一个private服务命名空间,这样只有配置了该命名空间的服务客户端才会找到,否则就找不到了

# 根据自己nacos server生成的命名空间ID进行修改
spring.cloud.nacos.config.namespace=fd69214f-54f1-47e8-affb-d19bc6616c13

注:该配置必须放在 bootstrap.properties 文件中。此外 spring.cloud.nacos.config.namespace的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespace,否则将会导致读取不到正确的配置。

服务中心使用mysql保存数据

在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:

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

具体操作:
1.在mysql server 新建数据库:nocas(名字自己随意)
2.在nacos server的 conf目录下找到nacos-mysql.sql 文件,并在创建的nacos数据库下执行表nacos-mysql.sql中的SQL语句
3.修改nacos server application.properties配置文件,修改后如下图所示

# spring
 
server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8848
 
spring.datasource.platform=mysql
 
db.num=1
db.url.0=jdbc:mysql://数据库IP:端口号/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=数据库用户名
db.password=数据库密码

4.重启Nacos server并添加配置文件,就可以看到mysql数据库数据表中出现了自己的配置文件内容

注:由嵌入式数据库切换为mysql数据库后,数据并不能自动转移到mysql中,导致之前的配置文件丢失

注 :当然为了可用性较高,生产使用建议至少主备模式,或者采用高可用数据库。

配置中心的高可用集群

nacos server的集群部署

集群部署架构图
官方的推荐部署架构图:
[外链图片转存失败(img-x4go827X-1568616387514)(https://nacos.io/img/deployDnsVipMode.jpg)]
推荐用户把所有服务列表放到一个vip(虚拟IP,主机宕机后可以自动漂移到备用机器上)下面,然后挂到一个域名下面
http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。
http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。
http://nacos.com:port/openAPI 域名+VIP模式,可读性好,而且换ip方便,推荐模式

具体操作实践
注:目前器群模式下不采用mysql作为配置文件的存储方式,所以需要先配置为采用mysql数据源模式,我在上一篇博客中已经说明了,这里不再介绍,直接配置集群。

步骤如下:

1.conf文件夹下的文件如下图所示,其中下载的压缩包解压出来是没有cluster.conf的,通过复制cluster.conf-example并修改文件名得来。
修改cluster.conf,将部署nacos server的三台服务器ip地址写上即可
三台服务器cluster.conf文件相同,都是协商这三个IP地址即可

#it is ip
#example
114.116.137.***
132.232.159.***
47.107.122.***

2.分别启动三台nacos server
修改客户端,在客户端的bootstrap.properties文件中修改server的IP地址
注:修改成自己的三台服务器ip地址,用逗号分隔

spring.cloud.nacos.config.server-addr=114.116.137.***:8848,132.232.159.***:8848,47.107.122.***:8848
 ``

启动客户端 发现可以正常启动



## 更多功能
关于如何在这些生态中使用 Nacos,请参考以下文档:

Nacos与Spring Cloud一起使用
Nacos与Kubernetes一起使用
Nacos与Dubbo一起使用
Nacos与gRPC一起使用
Nacos与Istio一起使用


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot使用Nacos作为配置中心服务和服务注册中心 的相关文章

随机推荐

  • 数据库的事务

    以MySQL为视角 了解数据库的事务 目录 一 事务简介 1 概念 2 操作 3 例子 4 事务提交方式 二 事务的四大特征 ACID 1 原子性 atomicity 2 一致性 consistency 3 隔离性 isolation 4
  • Python: 用于计算txt文档的字数的小脚本

    在一次实践中 需要计算txt文档 英文和数字 的字数 并且还要统计路径下的所有txt文档的字数总数 本来以为很简单 但是在编写的过程中还是出现了一些问题 首先就是 字数和字符数是不一样的 不能简单的用len 根据英文的特性 每个单词都需要空
  • VUE iscroll

    https github com Dafrok vue iscroll view 基本使用方法 npm i vue iscroll view save dev npm i iscroll save dev import IScrollVie
  • uniapp scroll-view 隐藏滚动条

    如果是想全局隐藏的话 可以放在App vue中 如果是局部则在对应的页面中引入使用即可 ifdef MP WEIXIN APP PLUS webkit scrollbar display none width 0 important hei
  • C#贝塞尔曲线的应用-未读红点拖拽粘连效果

    前言 提示 仿照手机qq未读红点拖拽粘连效果 贝塞尔曲线的应用非常广泛 本篇文章将使用Winform贝塞尔曲线来实现QQ未读红点拖拽粘连的效果 手机QQ粘连效果 最终实现的效果 分析效果 1 可以看出随着拖拽的距离变大 固定点的圆会逐渐变小
  • 管理 Python 依赖项

    有几种不同的方法来管理 Python 依赖项 最常见的方法是使用 requirements txt 文件 其中列出了所有项目依赖项及其版本 然后 您可以通过运行 pip install r requirements txt 为您的项目安装所
  • 玩家传递信息

    小 A 和 ta 的小伙伴们玩传信息游戏 游戏规则如下 有 n 名玩家 所有玩家编号分别为 0 n 1 其中小朋友 A 的编号为 0 每个玩家都有固定的若干个可传信息的其他玩家 也可能没有 传信息的关系是单向的 比如 A 可以向 B 传信息
  • X210核心板、底板原理图、数据手册导读

    1 有用的资料 写代码时需要查阅和参考的资料有 核心板原理图 底板原理图 相应硬件的数据手册 S5PV210数据手册 2 原理图 PCB图 丝印图各自是什么 原理图是电路原理设计图 各个电路中的部件的逻辑连接图 原理图可能会影响软件编写 P
  • python 按文件名批量移动文件至指定文件夹

    做猫狗分类任务 要求数据集划分为训练集 training dataset 和验证集 validation dataset 均包含dogs和cats两个目录 且每个目录下包含与目录名类别相同的RGB图 数据集共25000张照片 其中训练集猫狗
  • k8s之工作负载控制器的应用

    k8s之工作负载控制器的应用 1 k8s工作负载控制器是什么 2 Deployment介绍 2 1 deployment的资源清单文件 2 2 Deployment 滚动升级 2 3 Deployment 水平扩容 2 4 Deployme
  • rsync 时提示 skipping non-regular file。。。。。 的问题

    在执行 rsync 时会提示 skipping non regular file 的内容 原因是原文件夹中包含软链接导致 可以忽略 rsync rvtO delete media u2 downloads media uu2 downloa
  • windows10+vscode+anaconda+python3.7配置LiDAR-MOS动态物体点云开源项目

    之前用c 开发较多 最近开始尝试深度学习方面的工作 用到python合pytorch 经过4天的探索 终于能把测试代码跑起来了 记录下遇到的坑 1安装anaconda 这个不是本文重点 网上教程很多 2创建python虚拟环境 2 1使用v
  • STM32F103 USB虚拟成U盘功能

    STM32F103 USB虚拟成U盘功能 还在学习 中
  • 蓝桥杯省赛模拟题-智能门锁

    本文是对 坊间流传的 蓝桥杯省赛模拟题 智能门锁 的一种解法和思路 用的是蚂蚁科技的底层代码 其中有一个BUG虽然解决 但仍然不清除原因 数码管显示6个数组字符就会出问题 最多4个稳定 但是加入超声波底层就会都正常 不清楚这是什么原因造成的
  • yolo5 训练无人人机识别系统

    环境搭建 安装驱动 点击鼠标右键 如果出现NVIDIA图标 点开 出现如下图片 我的显卡是1650 根据显卡的型号去官网找相应的驱动下载就好了 驱动官网 安装好之后 打开命令行cmd 输入如下指令 nvidia smi 显示出如下数据即为安
  • 电机驱动的三种脉冲模式

    电机驱动的三种脉冲模式 脉冲 方向 脉冲 脉冲 A B正交脉冲
  • TLS certificate verification has been disabled

    git push 推送仓库报错 缺少了安全认证 所以解决方法是重启安全认证 git config global http sslVerify true
  • 电机控制常用PID控制算法

    本文分享自己在电机控制仿真中的建模方法 敬请批评指正 同名B站链接 Timer sir 电机控制常用PID控制算法 PID控制原理 位置式PID 增量式PID 抗饱和PID PID控制仿真 仿真模型 仿真结果 PID控制原理 将偏差的比例
  • 记一次ThreadLocal的使用注意点(线程池)

    Threadlocal的作用就不用多讲了 主要是一个map用于线程间的数据隔离 正常情况下 线程回收 那么这个线程对应的map值也会被回收 是ThreadLocal中被移除并非值本身被移除 如果是对象并且任然被引用 它是不会被回收的 基于上
  • SpringBoot使用Nacos作为配置中心服务和服务注册中心

    简介 从spring开始 所有的配置文件都放在项目中 如果需要修改配置文件内容 则需要登陆服务器重启服务 想象一下如果你有一百台服务的需要修改 那是不可想象的工作量 目前已有的配置中心 携程开源的Apollo 数据保存在mysql中 支持命