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

关于Nacos

Nacos是阿里巴巴最新开源的项目,核心定位是“一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台”

为什么叫Nacos

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

Nacos能做什么

Nacos 地图

Nacos核心提供两个功能:服务注册与发现,动态配置管理。

  • 服务注册与发现

    ​ Nacos提供基于DNS和基于RPC的服务发现,即能被用来支持https/http的服务注册与发现,也支持RPC如dubbo的服务注册与发现。

    ​ 与Dubbo使用的zookeeper相比而言,两者差异还是比较大的,zookeeper是一种分布式的协调服务,它天生是作为分布式数据一致性场景下的解决方案,所以zookeeper是CP的,它牺牲了可用性来保证一致性,在极端情况下(master选举期间)服务会对外停止,对于服务可用性要求比较高的系统是难以接受的。Nacos是一种去中心化的架构,属于CAP理论里的AP架构,支持最终一致性,在分布式服务发现与注册场景下具有很不错的性能。目前dubbo官方也支持使用Nacos代替zookeeper。

  • 动态配置服务

    与SpringCloud config 和 SpringCloud Bus类似,Nacos的动态配置服务更加灵活与简便,不需要重启服务可以做到配置实时生效,非常适合“配置优先”的服务开发。

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

Nacos 生态

Nacos 无缝支持一些主流的开源生态,如下图:

nacos 生态图

使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易,它能很方便的和SpringCloud、K8S、Dubbo、gRPC、lstio一起使用。

安装Nacos

官方地址

  • 官网
  • 官方仓库
  • 官方文档

安装方法

Nacos 支持三种部署模式:单机模式、集群模式和多集群模式,Nacos默认将数据存储在自带的嵌入式数据库derby里面,支持mysql数据库,如果部署集群的话必须要使用mysql来保存数据,以保证统一的数据源。因为主要为了测试Nacos的注册中心和配置中心的功能,我这边部署单机模式并使用derby数据库。

前提环境

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
  2. 64 bit JDK 1.8+;下载 & 配置。
  3. Maven 3.2.x+;下载 & 配置。

方式一 源码安装

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

方式二 发行包安装

官方仓库提供了发行包下载,可以从 版本库中下载nacos-server-$version.zip /nacos-server-$version.tar.gz 包,解压后,在包目录下的bin文件夹中有可执行脚本运行即可。

方式三 Docker安装

除了以上两种方式安装docker以外,还可以使用docker的方式安装

docker run -tid  --env MODE=standalone --name nacos -p 8848:8848 nacos/nacos-server

MODE是指定运行模式,有cluster模式/standalone模式

安装完成之后,访问http://localhost:8848/nacos/index.html即可打开nacos的web管理界面

Nacos管理界面

Nacos作为注册中心

根项目配置

使用SpringCloud alibaba 需要在 dependencyManagement 中添加相应配置,因为我这里是多模块开发,所以将 dependencyManagement添加到根pom文件中。

    
        
            
            
                org.springframework.boot
                spring-boot-dependencies
                2.2.2.RELEASE
                pom
                import
            
            
            
                org.springframework.cloud
                spring-cloud-dependencies
                Hoxton.SR1
                pom
                import
            
            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2.1.0.RELEASE
                pom
                import
             
        
    

服务生产者

依赖

                    ...

  com.alibaba.cloud
  spring-cloud-starter-alibaba-nacos-discovery


  org.springframework.boot
  spring-boot-starter-web


  org.springframework.boot
  spring-boot-starter-actuator

                    ...

配置文件

我们将项目端口配置为9001,并配置nacos注册中心地址,以及暴露端点。

server:
  port: 9001

spring:
  application:
    name: nacos-provide-userinfo
  cloud:
    # nacos 配置
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # 配置nacos地址
#暴露端点
management:
  endpoints:
    web:
      exposure:
        include: '*'

测试接口

@RestController
public class EchoController {

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


    @GetMapping("/echo")
    public String echo(){
        return "Hello serverPort : "+serverPort+" uuid :"+ UUID.randomUUID().toString();
    }

}

启动类

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

启动后,再次打开nacos管理界面中 服务管理 下的 服务列表

服务注册成功

我们已经可以看到服务已经注册成功了。我们以上面这个服务为模板,再建立一个端口为9002的服务

多服务实例

服务消费者

依赖


  com.alibaba.cloud
  spring-cloud-starter-alibaba-nacos-discovery


  org.springframework.boot
  spring-boot-starter-web


  org.springframework.boot
  spring-boot-starter-actuator

配置文件

server:
  port: 9091

spring:
  application:
    name: nacos-consume-useradmin
  cloud:
    # nacos 配置
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

RestTemplate注入

Nacos集成了Ribbon,RestTemplate需要添加@LoadBalanced开启负载均衡功能。

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced  // 没有加这个的话没有办法使用服务名来调用接口
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

测试接口

@RestController
@RequestMapping("/consume")
public class UserAdminController {
    @Resource
    RestTemplate restTemplate;

    String URL_PREFIX = "http://nacos-provide-userinfo";

    @GetMapping("/echo")
    public String getUser(){
        return restTemplate.getForObject(URL_PREFIX+"/echo", String.class);
    }

}

启动类

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

启动后查看管理界面,可以看到消费者服务也已经注册进入的注册中心了。

消费者服务注册

请求消费者/consume/echo的时候,消费者会去调用生产者的服务,因为nacos集成了ribbon,所以自带负载均衡功能,会根据一定算法来选择注册中心上的服务实例。

作为配置中心

依赖



  com.alibaba.cloud
  spring-cloud-starter-alibaba-nacos-config



  com.alibaba.cloud
  spring-cloud-starter-alibaba-nacos-discovery


  org.springframework.boot
  spring-boot-starter-web


  org.springframework.boot
  spring-boot-starter-actuator

配置文件

注意,这里是创建bootstrap.yml,这个配置⽂件的作⽤是,先到配置中⼼加载配置,然后加载到application.yml中。

application.yml是用户级的资源配置项。

bootstrap.yml是系统级的,优先级比application.yml更高。

  • Bootstrap.yml

    server:
      port: 99
    
    spring:
      application:
        name: nacos-config-client # 这个名称涉及到远程配置文件的名称
      cloud:
        # nacos 配置
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848 #注册中心地址
          config:
            server-addr: 127.0.0.1:8848 # nacos 作为配置中心地址
            file-extension: yaml # 指定配置文件的格式
    
  • Application.yml

    spring:
      profiles:
        active: dev # 表示开发环境
    

测试接口

@RestController
@RefreshScope
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/getConfigInfo")
    public String getConfigInfo(){
        return configInfo;
    }
}

启动类

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

管理平台配置

新建配置文件

打开Nacos管理界面,选择 配置管理-->配置列表,点击列表右上角的 的图标

添加配置-步骤1

nacos规定了Data ID的设定规则,让服务能更加方便的去寻找自己的配置,默认的Data ID的规则是:

${prefix}-${spring.profile.active}.${file-extension}
  • prefix
    默认就是当前服务的服务名称(spring.application.name)
    也可以通过spring.cloud.necos.config.prefix配置
  • spring.profile.active
    就是我们在application.yml中指定的,当前是开发环境还是测试等环境
    这个可以不配置,如果不配置,那么前⾯的 - 也会没有
  • file-extension
    就是当前⽂件的格式(后缀),⽬前只⽀持yml和propertie

上面我们配置的应用名称是nacos-config-client,环境配置的是dev,文件格式是 yaml,所以Data ID是nacos-config-client-dev.yaml,注意是yaml,而不是yml

添加配置-2

添加完成之后我们可以看到配置文件已经创建成功了。

添加配置-3

配置完成后,我们启动服务,服务如果启动成功说明配置正确了,测试下:

➜  ~ curl http://localhost:99/getConfigInfo
Here is dev,version=1.0%                                                                                                                                                 ➜  ~ 

修改配置

我们测试下更新配置文件是否会马上生效,所以我们修改配置文件

修改配置

配置文件可以查看 历史版本 ,每次修改也会给出对比图。

确认

不要重启nacos-config-client 服务,再次测试接口

➜  ~ curl http://localhost:99/getConfigInfo
Here is dev,version=2.0%                                                                                                                                                 ➜  ~                                                                                        

我们发现更新配置无需手动动态刷新配置,相比较起springcloud config 和 bus的配合动态刷新来说,nacos更加的灵活、方便。

数据隔离

Nacos作为配置中心的时候,我们看到了可以感觉服务的环境来选择不同的配置文件,在Nacos的设计中,我们也可以通过Namespace、Group来做数据的隔离,这里不做赘述,总之,在微服务这些框架里面,Nacos绝对是非常好用的。

你可能感兴趣的:(使用Nacos作为注册中心和配置中心)