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

简介

从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即可看到如下管理界面

nacos账号密码默认都是:nacos

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)@ResponseBodypublic 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=8848spring.datasource.platform=mysqldb.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的集群部署

集群部署架构图
官方的推荐部署架构图:

推荐用户把所有服务列表放到一个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一起使用

SpringBoot使用Nacos作为配置中心服务和服务注册中心相关推荐

  1. 理解nacos 服务治理(注册中心)、Nacos简介、下载与配置持久化到Mysql

    Nacos简介 什么是Nacos Nacos致力于帮助您发现.配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现.服务配置.服务元数据及流且管理. Nacos帮助您更敏 ...

  2. 微服务架构:注册中心 ZooKeeper、Eureka、Consul 、Nacos 对比!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 前言 服务注册中心本质上是为了解耦服务提供者和服务消费者. ...

  3. 微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关

    微服务笔记:第一章_微服务简介|Eureka注册中心|Nacos注册中心|Nacos配置管理|Feign|Gateway服务网关 1. 微服务简介 1.1 服务架构演变 1.2 SpringCloud ...

  4. Nacos数据库配置更新需要重启服务

    排查问题 线上环境报错,看报错信息可定位到是SQL语句有误. 但这段SQL在测试环境是没有问题的. 对比后发现是数据库配置 spring:dataSource:url: 的数据库链接后面要加 & ...

  5. nacos enablediscoveryclient_Spring Cloud(五):注册中心nacos篇

    点击蓝字关注我们 大家好,我是杰哥,转眼间,我们的Spring Cloud专辑已到了第五次分享,而我们的注册中心篇章已经分别完成了Eureka.zookeeper篇,今天正式进入nacos篇的学习na ...

  6. 【微服务】Eureka注册中心

    文章目录 前置导入 Eureka的结构和作用 搭建eureka-server 创建eureka-server服务 引入eureka依赖 编写启动类 编写配置文件 启动服务 总结 服务注册 引入依赖 配 ...

  7. Slime Meshregistry 开源,化解服务网格多注册中心兼容之痛

    背景 服务发现是微服务治理的核心环节.传统的微服务架构采用Consumer/Provider模式,Provider将服务信息注册到注册中心,Consumer通过注册中心发现Provider的服务信息. ...

  8. 微服务架构之注册中心

    假设你发布了一个服务,并且已经在一台机器上部署了服务,那如果我想调用这个服务,我该如何知道你部署的这台机器的地址呢? 这个问题就跟我想去吃肯德基一样,我可以去谷歌地图上搜索肯德基,然后谷歌地图会返回所 ...

  9. SpringBoot使用Nacos作为配置中心服务

    spring cloud alibaba教程:如何使用nacos作为配置中心 startup.cmd -m standalone 1.下载与解压Nacos压缩包(Nacos安装指南具体教程可查看) 下 ...

  10. Windowns10配置安装Seata14.0(注册中心和配置中心用的都是nacos)

    翻来翻来csnd,倒腾了一天一夜,也没看到一篇关于Windowns10下安装配置nacos完整的解释,都是缺胳膊少腿的,废话不多说直接进入主题!!! 我的环境:window10+nacos2.0.2+ ...

最新文章

  1. Elasticsearch yellow 意味着主分片可用,副本不可用
  2. 6亿数据秒级查询,ClickHouse太快了!
  3. 经理=PD + Architect + PM + HR
  4. vue 导航栏刷新页面定位:
  5. python中调用函数时必须有实参_Python之函数(一)定义函数以及传参
  6. js调用linux命令,xshell调用js脚本开发
  7. 【错误记录】记录 Android 命令行执行 Java 程序中出现的错误 ( dx 打包 PC 可执行文件报错 | dalvik 命令执行 kotlin 编译的 dex 文件报错 )
  8. SAP Spartacus lock focus directive如何判断有没有focusable children
  9. android可点击的列表,如何在Android的可扩展列表视图中的子点击...
  10. 数据结构-Hash总结(二)
  11. 带给你灵感的3D街画艺术设计
  12. 数据库---事务的隔离级别
  13. 远程连接“终端服务器超出了最大允许连接数” 解决
  14. 解封装(六):通过遍历获取AVStream音视频流信息并打印参数
  15. TokenInsight:BTC新增流量稳定,但泡沫指数已超17年峰值
  16. 一些看起来有用但没用过的函数
  17. 综合能源管理服务认证是什么?综合能源管理服务认证含哪些专业?综合能源服务认证流程
  18. 微信小程序-使用ColorUI
  19. iOS 截屏 长图 拼图
  20. Luogu P1540 机器翻译

热门文章

  1. android极光富媒体推送,极光推送如何在android客户端接收富媒体
  2. 固态加装机械计算机不显示,笔记本电脑装了固态硬盘,机械硬盘却无法识别
  3. Android View绘制6 Draw过程(下)
  4. idea工具首次提交代码到git上
  5. 关于weight decay
  6. 2022 华东师范大学 数据学院复试机考
  7. [杂谈]金克木:《与小说对话:不败求败》
  8. 2008年IT业十大预测:微软收购雅虎
  9. 减脂增肌运动和饮食结合
  10. 100句话记住7000个单词。