使用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文件中。

    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--     SpringCloud Alibaba       -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency> 
        </dependencies>
    </dependencyManagement>

服务生产者

依赖

                    ...
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
                    ...

配置文件

我们将项目端口配置为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的服务

多服务实例

服务消费者

依赖

<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置文件

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,所以自带负载均衡功能,会根据一定算法来选择注册中心上的服务实例。

作为配置中心

依赖

<!-- nacos config-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--   nacos server     -->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置文件

注意,这里是创建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绝对是非常好用的。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,227评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,755评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,899评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,257评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,617评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,757评论 1 221
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,982评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,715评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,454评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,666评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,148评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,512评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,156评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,112评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,896评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,809评论 2 279
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,691评论 2 272