聊聊SpringBoot使用Nacos进行服务注册发现与配置管理问题

前提

最近由于业务发展,需要调研一套完善和主流的基础架构,进行中台化(微服务)的实施,考虑到技术栈切换到SOFAStack。既然整个体系都切换到蚂蚁金服的技术栈,那么自然考虑一些基础组件如服务注册发现、配置管理等都切换为阿里的技术栈。考虑到目前比较热的服务发现组件是Nacos,需要调研SpringBoot服务接入Nacos的可行性,为以后强制要求新服务使用SOFAStack + Nacos的技术栈进行服务开发打下基础。

Nacos简介

Nacos英文全称Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心。服务在nacos是一等公民

下面的简介来源于Nacos的官网:

Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以服务为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。

Nacos地图:

Nacos生态图:

Nacos提供的发展地图来看,它基本提供了目前微服务实施中一些核心问题:监控、服务发现注册、配置灰度发布、配置回滚等等。另外,它在生态上能够融入目前主流的K8SDockerSpringCloudConsulZookeeper等等(有点像屏蔽底层细节,只需少量配置就可以切换底层架构的实现),这一点十分重要。目前Nacos在阿里云上提供了商用版本(记得有前辈说过开源的终极目标就是商用,大概如此)。如果在项目中使用的是SpringCloud全家桶,引入Nacos以及它和SpringCloud之间的胶水层,可以完全替代Eureka组件的功能,替代和强化部分Spring Cloud Config的功能。

Nacos服务部署

Nacos-Server部署相对简单,它的发布版本见Github的Releases页面。下载完成后进行解压,Windows系下启动Nacos-Server只需进入解压后的${解压目录}\nacos\bin目录,执行startup.cmd即可,服务启动成功的结果如下:

单机模式在不修改配置的前提下直接启动,使用的是内存数据库,重启后数据会被清空。如果需要数据持久化,则需要建立数据库,具体的步骤是:

  • 建表的脚本在${解压目录}\nacos\conf目录下,见schema.sqlnacos-mysql.sql两个文件。
  • 自行通过建表的脚本建立数据库。
  • 需要指定数据库,则需要修改${解压目录}\nacos\conf\application.properties,在文件的尾部追加数据源的连接配置,下面是官方给出的多数据源的例子:
# 需要确保多个数据源的用户名和密码一致
db.num=2
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://11.163.152.9:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=nacos

测试获取已经注册的服务:

λ curl -X GET http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName
{"hosts":[],"name":"DEFAULT_GROUP@@nacos.naming.serviceName","clusters":""}

访问http://127.0.0.1:8848/nacos即可打开Nacos-Console,初始的登录账号和密码都是nacos

更多运维部署相关的内容见文档运维指南中的一节。

SpirngBoot应用使用Nacos作为注册中心

SpringBoot应用使用Nacos作为注册中心需要引入依赖nacos-discovery-spring-boot-starter,笔者编写本文的时候(2020-01-01),该依赖的最新版本为0.2.4,对应于SpringBoot的版本为2.0.3.RELEASE,引入如下依赖:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.0.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.boot</groupId>
        <artifactId>nacos-discovery-spring-boot-starter</artifactId>
        <version>0.2.4</version>
    </dependency>
</dependencies>

为了方便起见,笔者把控制器、服务注册的代码都写在启动类ProvideApplication中:

@RestController
@SpringBootApplication(scanBasePackages = "club.throwable.provide")
public class ProvideApplication implements CommandLineRunner {

    @NacosInjected
    private NamingService namingService;

    @Value("${spring.application.name}")
    private String applicationName;

    @Value("${server.port}")
    private Integer serverPort;

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

    @GetMapping(path = "/hello")
    public String hello(@RequestParam(name = "name") String name) {
        return String.format("%s say hello!", name);
    }

    @Override
    public void run(String... args) throws Exception {
        // 通过Naming服务注册实例到注册中心
        namingService.registerInstance(applicationName, "127.0.0.1", serverPort);
    }
}

配置文件application-provide.properties内容如下:

spring.application.name=provide-service
server.port=9092
nacos.discovery.server-addr=127.0.0.1:8848

使用spring.profiles.active=provide启动ProvideApplication,启动成功后用浏览器打开Nacos-Console

暂时可知服务的提供方已经注册成功。接着编写服务的消费方代码,引入的最小依赖和服务提供方完全一致,编写启动类ConsumeApplication如下:

@SpringBootApplication(scanBasePackages = "club.throwable.consume")
public class ConsumeApplication implements CommandLineRunner {

    @NacosInjected
    private NamingService namingService;

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

    @Override
    public void run(String... args) throws Exception {
        // 根据服务名从注册中心获取一个健康的服务实例
        Instance instance = namingService.selectOneHealthyInstance("provide-service");
        // 这里只是为了方便才新建RestTemplate实例
        RestTemplate template = new RestTemplate();
        String url = String.format("http://%s:%d/hello?name=throwable", instance.getIp(), instance.getPort());
        String result = template.getForObject(url, String.class);
        System.out.println(String.format("请求URL:%s,响应结果:%s", url, result));
    }
}

消费服务的配置文件application-consume.properties内容如下:

spring.application.name=consume-service
server.port=9091
nacos.discovery.server-addr=127.0.0.1:8848

使用spring.profiles.active=consume启动ConsumeApplicationCommandLineRunner执行完毕后控制台打印:

请求URL:http://127.0.0.1:9092/hello?name=throwable,响应结果:throwable say hello!

这种方式使用起来会感觉模板代码比较多,不够简洁。如果在SpringCloud体系中,结合Feign客户端则可以省略这些模板代码。

SpirngBoot应用使用Nacos管理配置

如果使用Nacos进行配置管理,则需要引入nacos-config-spring-boot-starter依赖,笔者编写本文的时候(2020-01-01),该依赖的最新版本为0.2.4

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.2.4</version>
</dependency>

新建一个启动类ConfigApplication如下:

@RestController
@NacosPropertySource(dataId = "example", autoRefreshed = true)
@SpringBootApplication(scanBasePackages = "club.throwable.config")
public class ConfigApplication {

    @NacosValue(value = "${counter:0}", autoRefreshed = true)
    public Long counter;

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

    @GetMapping(path = "/get")
    public String get() {
        return String.format("Counter value:%d", counter);
    }
}

笔者定义了一个长整型的计数器,设置了autoRefreshed(自动刷新)为true,新建一个配置文件application-config.properties

spring.application.name=config-service
server.port=9093
nacos.config.server-addr=127.0.0.1:8848

使用spring.profiles.active=config启动ConfigApplication,启动成功后通过CURL调用下面的接口:

λ curl -X GET http://127.0.0.1:9093/get
Counter value:0

接着通过Nacos-Console添加一个配置:

点击发布按钮后再次调用接口:

λ curl -X GET http://127.0.0.1:9093/get
Counter value:10086

可见计数器的值已经动态刷新。配置项里面还有很多高级配置如:指定配置生效的服务、Beta发布等等,可以按照合适的场景进行设置。

另外,Nacos Server提供Open API从而可以使用HTTP客户端就可以轻松进行配置查询、配置更新发布等操作(目前这些API没有做鉴权,社区也有人曾提出这样会引发安全性问题,Nacos官方已经立项在后续新版本中加入鉴权的功能,目前建议屏蔽或者仅允许内网访问这些Open API):

小结

本文只是简单介绍了SpringBoot中使用Nacos作为注册中心以及进行配置管理。Nacos项目Github仓库当前(2020-01-01)的star数已经接近10000,社区也十分活跃,Issues和交流群的响应都十分迅速。加之Netflix的部分开源产品如EurekaHystrix等已经停止迭代,但Nacos还在飞速迭代,甚至已经在阿里云衍生出商业版本,所以笔者认为Nacos值得使用,在相对熟悉它的大部分特性之后会付之于生产环境中使用。

参考资料:

Nacos文档

本文的Demo项目:

spring-boot-nacos

下一篇博文会介绍一下SOFAStack中基于SOFABootSOFARpc以及Nacos等组件作为基础架构搭建一套微服务的详细过程。

到此这篇关于SpringBoot使用Nacos进行服务注册发现与配置管理的文章就介绍到这了,更多相关SpringBoot服务注册与配置管理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于springboot中nacos动态路由的配置

    目录 nacos动态路由的配置 1.作为一个动态路由维护管理的类 2.基于Nacos动态配置路由服务 3.yml配置 4. nacos网关配置 5.最后:我建的是 Springboot配置Nacos出现的问题 报错信息 具体如下 nacos动态路由的配置 什么都不说了,springboot-nacos 不懂得的下面自行学习啦我直接贴下代码! 首先... 我自己有个服务器.在无聊之时写的代码,主要是通过网关来调用接口所以有了下面的代码. 1.作为一个动态路由维护管理的类 @Service publ

  • SpringBoot使用Nacos动态配置数据源的方法

    SpringBoot/SpringCloud项目部署运行后,如果使用硬编码方式定义数据源,那么如果需要更换数据库,就只能通过更改源码并重启的方式来达成目的 而SpringCloud生态中有配置中心这一组件,我们可以将数据源连接属性编写在配置中心中,需要修改连接属性就可以从配置中心中修改并发布,这样就可以热修改数据源位置无需重启服务 那么下面实战说明如何将使用Nacos配置/注册中心配置数据源(请注意看我写的注释来避坑) 首先说明版本 SpringBoot 2.2.0.RELEASE Druid

  • SpringBoot使用Nacos配置中心的实现

    本文介绍SpringBoot如何使用阿里巴巴Nacos做配置中心. 1.Nacos简介 Nacos是阿里巴巴集团开源的一个易于使用的平台,专为动态服务发现,配置和服务管理而设计.它可以帮助您轻松构建云本机应用程序和微服务平台. Nacos基本上支持现在所有类型的服务,例如,Dubbo / gRPC服务,Spring Cloud RESTFul服务或Kubernetes服务. 尤其是使用Eureka注册中心的,并且担心Eureka闭源的开发者们,可以将注册中心修改为Nacos,本文主要介绍Naco

  • SpringBoot项目War包部署无法注册到Nacos中的解决

    目录 SpringBoot项目War包部署无法注册到Nacos中 问题 解决方案 SpringBoot项目war包部署及出现的问题 1.修改pom文件 2.在启动类或者配置类中继承SpringBootServletInitializer SpringBoot项目War包部署无法注册到Nacos中 注: 其实标题的描述不是很准确,准确的说是已经注册成功并且可以正常访问,但是在服务列表却看不到. 问题 最近在进行Eureka迁移Nacos架构升级的时候,发现有两个之前的旧项目,虽然也是SpringB

  • 聊聊SpringBoot使用Nacos进行服务注册发现与配置管理问题

    前提 最近由于业务发展,需要调研一套完善和主流的基础架构,进行中台化(微服务)的实施,考虑到技术栈切换到SOFAStack.既然整个体系都切换到蚂蚁金服的技术栈,那么自然考虑一些基础组件如服务注册发现.配置管理等都切换为阿里的技术栈.考虑到目前比较热的服务发现组件是Nacos,需要调研SpringBoot服务接入Nacos的可行性,为以后强制要求新服务使用SOFAStack + Nacos的技术栈进行服务开发打下基础. Nacos简介 Nacos英文全称Dynamic Naming and Co

  • SpringBoot + Spring Cloud Consul 服务注册和发现详细解析

    什么是Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更"一站式",内置了服务注册与发现框架.分布一致性协议实现.健康检查.Key/Value 存储.多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 等).使用起来也较为简单.Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux.windows和Mac OS X):安装包仅包含一个可执行文件

  • Nacos框架服务注册实现流程

    目录 rpc远程调用 微服务服务治理 分布式注册中心 Nacos 介绍 安装 基本使用 rpc远程调用 可能存在的问题 超时的问题. 安全的问题. 服务与服务之间URL地址管理. 在我们的微服务架构通讯,服务之间依赖关系非常大,如果通过传统的方式管理我们服务的 url 地址的情况下,-一旦地址发生变化的情况下,还需要人工修改rpc远程调用地址. 微服务服务治理 在RPC远程调用过程中,服务与服务之间依赖关系非常大,服务Url地址管理非常复杂,所以这时候需要对我们服务的url实现治理,通过服务治理

  • 聊聊SpringBoot整合Nacos自动刷新配置的问题

    目录 目的 环境 pom 配置文件 代码 日志 测试 目的 Nacos作为SpringBoot服务的注册中心和配置中心. 在NacosServer中修改配置文件,在SpringBoot不重启的情况下,获取到修改的内容. 本例将在配置文件中配置一个 cml.age=100 的配置项,程序中编写一个方法读取配置文件,并通过 Get--->/test/age 接口提供给浏览器访问. 若配置文件中的 age 修改为 200 ,不用重新启动程序,直接访问 /test/age 接口,将获取到最新的值 200

  • Spring Cloud EureKa Ribbon 服务注册发现与调用

    概述 用一个简单的例子演示Spring Cloud中EureKa和Ribbon的基本用法. 版本和环境 IDEA Spring Boot 1.5.·0 JDK 1.8 Maven 3 构建eureka server 在Spring Cloud,可以使用eureka来管理微服务,微服务可以注册到eureka中. 首先可以用IDEA的Spring Initialzr 来创建eureka server注册中心. 修改application.properties文件,添加如下内容 spring.appl

  • SpringCloud之服务注册与发现Spring Cloud Eureka实例代码

    一.Spring Cloud简介 Spring Cloud是一个基千SpringBoot实现的微服务架构开发 工具.它为微服务架构中涉及的 配置管理.服务治理. 断路器. 智能路由.微代理. 控制总线. 全局锁. 决策竞选.分布式会话和集群状态管理等操作提供了一种简单的开发方式. Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品,还可能会新增),如下所述. Spring Cloud Config: 配置管理工具.Spring Cloud Netflix: 核心组件

  • 利用go-kit组件进行服务注册与发现和健康检查的操作

    在go的微服务架构中 使用go-kit组件进行开发微服务 type Reg struct { Host string Port int Client consul.Client } func MakeReg (host string , port int) (*Reg , error) { reg := api.DefaultConfig() reg.Address = host + ":" + strconv.Itoa(port) apiclient , err = api.NewC

  • 微服务架构之服务注册与发现功能详解

    目录 微服务的注册与发现 1.服务注册 2.服务发现 3.注册中心 4.现下的主流注册中心 4.1 Eureka 4.1.1 介绍 4.1.2 整体架构 4.1.3 接入Spring Cloud 4.2 ZooKeeper 4.2.1 介绍 4.2.2 整体架构 4.2.3 接入Dubbo生态 4.3 Consul 4.3.1 介绍 4.3.2 整体架构 4.3.3 生态对接 4.4 总结对比 详解微服务架构及其演进史 微服务全景架构全面瓦解 微服务架构拆分策略详解 微服务的注册与发现 我们前面

  • SpringCloud Eureka 服务注册实现过程

    一.将服务注册到Eureka 一个SpringBoot应用如果要注册到Spring Cloud环境(Greenwich.SR3版本),步骤很简单: pom.xml中添加启动器:spring-cloud-starter-netflix-eureka-client: 增加配置:eureka.client.serviceUrl.defaultZone: http://localhost:8100/eureka/: 启动应用: 如果注册中心正常,此时就能在注册中心发现这个应用了,如下图红框所示: 按照s

  • SpringBoot集成Nacos的详细教程

    一.环境说明 1.CentOS7 2.Jdk1.8 3.Mysql5.7 4.Nacos1.3 5.SpringBoot2.3.1.RELEASE 6.Maven3.6 二.下载Nacos 1.Nacos官网:https://nacos.io/zh-cn/index.html 2.Nacos下载地址:https://github.com/alibaba/nacos/releases/download/1.3.0/nacos-server-1.3.0.tar.gz 三.解压启动Nacos 1.解压

随机推荐