【微服务专题】Nacos详解

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 【微服务专题】Nacos详解

正文


Nacos是可以代替SpringCloud Eureka和SpringCloud Config的开源组件,有了它我们就不用自己配置和搭建服务端了,服务端直接从最新的发布版本下载即可,我们只需要在服务机器上启动。


首先我们需要从github的官方地址下载最新版本的压缩包。解压缩后进入到bin目录下,因为我的环境是自己的windows开发机器,所以需要修改startup.cmd中的模式为单机模式。然后再启动服务端。

set MODE="standalone"


此时访问localhost:8848/nacos就能访问已经启动的服务端应用了。


一、Nacos作为注册中心


我们创建一个springcloud父工程,只包含web依赖。然后基于该父工程,分别创建服务提供者Provider和消费者Consumer工程。


1.1 服务提供者Provider


需要的依赖如下:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2021.1</version>
</dependency>

配置文件如下:

server:
  port: 8091
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      server-addr: localhost:8848

然后我们创建一个controller来模拟Provider对外提供服务:

@RestController
public class HelloController {
    @GetMapping("/getHello")
    public String getHello(){
        return "hello from nacos provider!";
    }
}

最后,我们在启动类上添加启动注解。

@EnableDiscoveryClient
@SpringBootApplication
public class DiscoveryProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(DiscoveryProviderApplication.class, args);
    }
}

到此,我们服务提供者就创建好了,在localhost:8091端口等待被调用提供服务。


1.2 服务消费者Consumer


需要的依赖如下:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2021.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    <version>3.0.3</version>
</dependency>

配置文件如下:

server:
  port: 8092
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      server-addr: localhost:8848

接下来也创建一个Controller类,对外提供调用的接口,然后在Controller中通过OpenFeign转发调用请求给到Provider。

@RestController
public class HelloController {
    @Autowired
    private FeignService feignService;
    @GetMapping("/getHello")
    public String getHello(){
        return feignService.getHello();
    }
}
@FeignClient("nacos-provider")
public interface FeignService {
    @GetMapping("/getHello")
    String getHello();
}

如上Service表示需要请求注册中心中服务名称为nacos-provider的/getHello接口。


最后,我们需要在启动类上加上启动注解。

@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class DiscoveryConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DiscoveryConsumerApplication.class, args);
    }
}

到此,消费者Consumer也创建好了,在localhost:8092提供调用服务。我们访问Consumer的/getHello接口,获得的返回内容为:


hello from nacos provider!

此时登录nacos服务端,服务管理,也能看到刚刚注册上来的消费者和服务提供者。


二、Nacos作为配置中心


我们以如上provider项目作为示例项目进行如下配置中心功能的演示。


2.1 入门案例


首先我们需要引入必要的依赖包:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2021.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

其次,我们在启动配置文件bootstrap.properties中配置如下的内容:

spring.application.name=nacos-provider
spring.cloud.nacos.server-addr=127.0.0.1:8848

然后我们创建一个Controller就可以演示从远端获取配置内容了:

@RefreshScope
@RestController
public class ConfigController {
    @Value("${provider.name}")
    private String providerName;
    @GetMapping("/getDevConfig")
    public String getDevConfig(){
        return this.providerName;
    }
}

代码层面的示例都已经写好了,我们在远端nacos服务端,切换到配置管理的配置列表界面,需要点击+号新建一个:


DataID,该字段的取名是有规则的,一般而言分为三个部分,{1}-{2}.{3},其中第一部分应该和刚才本地bootstrap.properties中配置的spring.application.name完全一样;第二部分表示生效的环境名称,比如dev、stg等;第三部分表示配置文件后缀,只支持properties或者yaml类型。在这里,我们的值应该为nacos-provider.properties;

Group,这里先设置默认的DEFAULT_GROUP即可;

配置内容,把需要保存在远端Nacos的配置内容写在里面即可,这里为provider.name=nacos123;

配置点击发布后,我们启动本地的nacos-provider服务,访问Controller,就会发现读取到了nacos123的配置内容。


2.2 配置文件的环境区分


在实际使用时,我们一般都是区分dev、stg、prd三套环境来维护各个环境的配置文件内容的。在这样的情况下,我们的应用程序如何读取不同环境下的配置内容呢?


profile(环境标识):一般和namespace或group一起使用,用于区分环境或分组

Namespace(命名空间):对不同的环境进⾏隔离,⽐如隔离开发环境、测试环境和⽣产环境。

Group(分组):,将若⼲个服务或者若⼲个配置集归为⼀组,通常习惯⼀个系统归为⼀个组。推荐命名格式:产品名称+分组名称

Service(服务):某⼀个服务,例如会员微服务。


2.2.1 通过profile区分


首先我们在Nacos配置中心再增加两个DataID,分别如下:


# nacos-provider-dev.properties
# DEFAULT_GROUP
provider.name=nacos-dev
# nacos-provider-stg.properties
# DEFAULT_GROUP
provider.name=nacos-stg

为了让这两个配置文件生效,我们在本地应用端的bootstrap.properties中指定生效配置文件的环境名称即可:

spring.application.name=nacos-provider
spring.cloud.nacos.server-addr=127.0.0.1:8848
spring.profiles.active=dev
# spring.profiles.active=stg

如此,再重启我们的应用,就能读取到各自环境的配置文件了。


2.2.2 通过namespace区分


默认我们会到public这个命名空间下去读取配置文件,此时我们新建两个命名空间,分别命名为dev和stg,然后将public命名空间下的nacos-provider.properties克隆到dev和stg命名空间下,并修改provider.name的配置内容:


# namespace dev
provider.name=nacos-dev-123
# namespace stg
provider.name=nacos-stg-123

然后我们在本地的应用中增加一个配置项,表明想要引用的namespace:

spring.cloud.nacos.config.namespace=0a6be74a-426e-45eb-8531-6d7230f26af6

然后重启应用,就能读取到对应namespace下面的配置内容了。


2.3 加载多配置文件


默认情况下,本地应用会去nacos服务端读取对应namespace下面的以应用名称开头的配置文件,在本例子中就是nacos-provider.properties,因为我们本地应用配置的spring.application.name=nacos-provider,在实际开发中,往往会有多个配置文件,那么如何同时加载多个配置文件中的配置内容呢?


首先,我们在public命名空间下再新建两个配置文件:

# redis.properties
redis.server=127.0.0.1
# mq.properties
mq.nameserver=localhost

同时,我们需要在本地项目的bootstrap.properties配置文件中增加如下的配置内容:

spring.cloud.nacos.config.ext-config[0].data-id=redis.properties
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true
spring.cloud.nacos.config.ext-config[0].data-id=mq.properties
spring.cloud.nacos.config.ext-config[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.ext-config[0].refresh=true

对应的yml配置形式为:

spring:
  cloud:
    nacos:
      config:
        extension-configs:
          - refresh: true
            group: DEFAULT_GROUP
            data-id: redis.properties
          - refresh: true
            group: DEFAULT_GROUP
            data-id: mq.properties

然后,修改我们的controller,引用nacos服务器上的不同配置文件里面的配置项:

@RefreshScope
@RestController
public class ConfigController {
    @Value("${provider.name}")
    private String providerName;
    @Value("${redis.server}")
    private String redisServer;
    @Value("${mq.nameserver}")
    private String mqServer;
    @GetMapping("/getDevConfig")
    public String getDevConfig() {
        return this.providerName + "/" + this.redisServer + "/" + this.mqServer;
    }
}

重启应用后,就能成功访问不同配置文件里面的配置项了。


2.4 配置文件的分组区分


如上我们注意到,分组Group一直都是DEFAULT_GROUP,其实我们可以在不同的Group里面创建相同名称的配置文件。比如在微服务环境中,多个微服务组件都有redis.properties的配置文件,那么如何区分哪个微服务该使用哪个Group下面的配置文件呢,其实也很简单,只要在配置文件中指定Group即可。


本实例比较简单,就不演示了,其实对于同一个应用也可以读取不同Group下面的配置文件配置内容,我们完全也可以用Group来作为dev、stg和prd的区分。


总之,Nacos为我们提供了三个维度来做区分,即profile、namespace和Group,开发者可以灵活应用来做自己想要的区分。


2.5 共享配置


很多时候,多个微服务中有相同的配置内容,比如大家连结的是同一个redis服务,同一个mq服务,那么就需要在各自的配置文件中都写上相同的配置内容,显得比较繁琐,我们完全可以将这些共同的配置内容抽取出来,形成另一个配置文件,然后大家共享它。


比如,我们在public命名空间下新建DEFAULT_GROUP的配置文件share.properties:


provider.share=share123

然后本地配置文件中新增如下配置内容:


# 如果有多个共享配置文件,相互之间用逗号分隔即可
spring.cloud.nacos.config.shared_dataids: share.properties
spring.cloud.nacos.config.refreshable-dataids: share.properties

然后在Controller中增加共享配置的读取内容,此处就省略了,重启应用就可以生效了。


注意,如果共享配置不是DEFAULT_GROUP下面的,就不能使用如上的方式,而是采用2.3节中讲述的方式。


2.6 配置内容的优先级


有些时候,我们在加载的配置文件中都配置了同一个配置项的值,而且相互之间都不相同,那么本地应用最终以哪个配置文件中的内容为准呢?


  • A:使用spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group这几个参数拼接出来的配置文件;
  • B:使用2.3节中extension-configs指定的配置间件;
  • C:使用2.5节中共享配置指定的配置文件;
  • D:本地配置的配置内容;

优先级顺序为:D>A>B>C


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
24天前
|
监控 网络协议 Nacos
Nacos:构建微服务架构的基石
Nacos:构建微服务架构的基石
71 2
|
4月前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
300 0
|
21天前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评。然而,“客户端不发送心跳检测”是使用中常见的问题之一。本文详细探讨了该问题的原因及解决方法,包括检查客户端配置、网络连接、日志、版本兼容性、心跳检测策略、服务实例注册状态、重启应用及环境变量等步骤,旨在帮助开发者快速定位并解决问题,确保服务正常运行。
44 5
|
22天前
|
Dubbo Cloud Native 应用服务中间件
阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。
在云原生时代,微服务架构成为主流。阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。示例代码展示了如何在项目中实现两者的整合,通过 Nacos 动态调整服务状态和配置,适应多变的业务需求。
34 2
|
1月前
|
网络安全 Nacos 开发者
Nacos作为流行的微服务注册与配置中心,“节点提示暂时不可用”是常见的问题之一
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,“节点提示暂时不可用”是常见的问题之一。本文将探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务的正常运行。通过检查服务实例状态、网络连接、Nacos配置、调整健康检查策略等步骤,可以有效解决这一问题。
36 4
|
1月前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,实际使用中常遇到“客户端不发送心跳检测”的问题。本文深入探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务正常运行。通过检查客户端配置、网络连接、日志、版本兼容性、心跳策略、注册状态、重启应用和环境变量等步骤,系统地排查和解决这一问题。
50 3
|
1月前
|
安全 Nacos 数据库
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改。本文详细探讨了这一问题的原因及解决方案,包括限制公网访问、使用HTTPS、强化数据库安全、启用访问控制、监控和审计等步骤,帮助开发者确保服务的安全运行。
43 3
|
2月前
|
Java Nacos 微服务
微服务中间件之Nacos
Nacos是阿里巴巴开源的动态服务发现、配置管理和服务管理平台,支持服务注册与发现、配置管理及服务健康监测。采用Spring Cloud、Spring Boot、Raft算法等技术,适用于微服务架构和云原生应用,提供简单易用的安装部署方式和丰富的应用场景。
311 2
|
2月前
|
负载均衡 算法 Nacos
SpringCloud 微服务nacos和eureka
SpringCloud 微服务nacos和eureka
69 0
|
4月前
|
Cloud Native Java Nacos
微服务注册中心-Nacos概述
该博客文章提供了对Nacos的全面概述,包括其基本介绍、与Spring Cloud集成的优势、主要功能以及如何在Spring Cloud Alibaba项目中作为服务注册中心使用Nacos。文章解释了Nacos是一个动态服务发现、配置管理和服务管理平台,支持服务发现、健康监测、动态配置、DNS服务和元数据管理。还介绍了如何下载和启动Nacos服务器,以及如何将微服务注册到Nacos中,包括修改pom.xml文件引入依赖、配置application.properties文件和使用@EnableDiscoveryClient注解开启服务注册发现功能。
微服务注册中心-Nacos概述