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

本文最后更新于:2020年9月10日 下午

什么是nacos?

首先看下官方的简介:

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

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

官方地址:nacos.io/zh-cn/

nacos的特性

  • 服务发现和服务健康监测
  • 动态配置服务
  • 动态DNS服务
  • 服务及元数据管理

nacos脑图

img

nacos的安装

对于nacos的安装,本文不作详细介绍,因为官网文档里面已经介绍的十分全面了,若有需要可以直接参考官网快速开始。安装完成之后,打开nacos后台管理页面如下:

img

可以发现左侧菜单有我们今天需要用到的配置管理和服务管理选项。

使用nacos作注册中心和配置中心

在使用nacos之前,本人所在公司注册中心使用的是eureka,配置中心是携程的apollo。nacos由国内公司阿里巴巴开源出品,集成了注册中心和配置中心两大功能,并且有强大的社区支持,符合国人使用习惯。

创建spring cloud项目

img

在父工程下创建module,创建服务提供者cloud-nacos-provider和服务消费者cloud-nacos-consumer,依赖信息如下:

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>2.2.1.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.yezi</groupId>
            <artifactId>cloud-nacos-api</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>
复制代码

cloud-nacos-provider

创建启动类
package com.yezi;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @Description:
 * @Author: yezi
 * @Date: 2020/7/22 14:17
 */
@EnableFeignClients(basePackages = {"com.yezi"})
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderApplication {

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

复制代码

@EnableDiscoveryClient将服务注册到注册中心

@EnableFeignClients(basePackages = {“com.yezi”})本文使用了feign,开启feign包扫描

服务提供api
package com.yezi.controller;


import com.yezi.api.ProviderApi;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description:
 * @Author: yezi
 * @Date: 2020/7/22 15:01
 */
@RefreshScope
@RestController
public class ProviderApiController implements ProviderApi {

    @Value("${name:123}")
    private String name;

    @Override
    public String say(@PathVariable("msg") String msg) {
        System.out.println("【---------from---------】" + msg);
        return "hello,consumer1";
    }

    @GetMapping("/config")
    public String config() {
        System.out.println("【---------from---------】" + name);
        return name;
    }


}

复制代码

@RefreshScope 局部刷新注解,开启实时更新配置信息

@Value(“${name:123}”) 最常用的配置信息注入直接,默认为123,如果配置文件有信息,则从配置文件获取。本文本地application.yml中没有这个属性,在配置中心中放置name配置

在配置中心创建配置信息

img

nacos的配置data id默认以服务的spring.application.name加上.yml,因此这里创建2个配置文件,分别为nacos-provider.yml、nacos-consumer.yml。

nacos-provider.yml内容:

server:
  port: 8082

name: y好卡机SD卡
复制代码

nacos-consumer.yml内容:

server:
  port: 8081
复制代码
配置bootstrap.yml

创建bootstrap.yml

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      config:
        enabled: false
        server-addr: 192.168.18.244:8848
        file-extension: yml
      discovery:
        server-addr: 192.168.18.244:8848

复制代码

config.enabled 是否开启使用配置中心配置

config.server-addr 配置中心地址,也就是nacos地址

discovery.server-addr 注册中心地址(nacos地址)

笔者这里一开始用的application.yml,发现配置中心的数据没有生效,查看官方之后发现官网直接使用的bootstrap.yml然后就生效了。所以这里一定注意要使用bootstrap.yml。bootstrap.yml与application.yml两者区别如下:

  • bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,如可以使用来配置application.yml中使用到参数等
  • application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。

由此知道bootstrap.yml 先于 application.yml 加载,使用spring cloud的时候,配置信息一般是从配置中心加载的,因此,把配置中心信息放在 bootstrap.yml,用来加载真正需要的配置信息。

创建config文件夹

在resources目录下创建config目录,在config目录中创application.yml配置文件,这里创建配置文件的目的是用作本地配置,当config.enabled=false时,将不会去读取配置中心细心,会直接读取config下配置文件信息。

cloud-nacos-consumer

服务消费者与提供者所有的文件模式是一样的,这里只提供一个消费者的延时controller:

package com.yezi.controller;

import com.yezi.api.ProviderApi;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Description:
 * @Author: yezi
 * @Date: 2020/7/22 15:03
 */
@RestController
public class ConsumerController {

    @Autowired
    private ProviderApi providerApi;


    @GetMapping("/say")
    public String test() {
        return providerApi.say("hello,provider");
    }

}

复制代码

这里解释下为什么要把api层单独提供一个module,在使用feign的时候,服务消费者要使用服务提供者的api,需要构造一个与提供者一个一样的feign的client,为了节省这部分代码,把这部分单独提取一个module,在provider和consumer两边引入即可。

api信息如下:

package com.yezi.api;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * @Description:
 * @Author: yezi
 * @Date: 2020/7/22 16:35
 */
@FeignClient("nacos-provider")
public interface ProviderApi {

    @GetMapping("/provider/say/{msg}")
    String say(@PathVariable("msg") String msg);
}

复制代码

启动服务验证结果

查看nacos配置列表,如下

img

发现2个服务都注册到nacos中心。

测试一下用为注册中心服务调用:

访问consumer服务http://127.0.0.1:8081/say地址,8081端口是我们在配置中心指定的,本地端口为8083,得到如下结果:

img

nacos作为注册中心,验证通过。

测一下用作配置中心:

访问provider服务 http://127.0.0.1:8082/config地址,8082端口是我们在配置中心指定的,本地端口为8084,配置中心中name配置为yezi,得到如下结果:

img

nacos作为配置中心,验证通过。