Nacos 搭建和使用

说明

官方文档 https://nacos.io/zh-cn/docs/what-is-nacos.html

 

粘贴一下Nacos地图

 

逻辑架构及其组件介绍

 

服务管理:实现服务CRUD,域名CRUD,服务健康状态检查,服务权重管理等功能

配置管理:实现配置管CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能

元数据管理:提供元数据CURD 和打标能力

插件机制:实现三个模块可分可合能力,实现扩展点SPI机制

事件机制:实现异步化事件通知,sdk数据变化异步通知等逻辑

日志模块:管理日志分类,日志级别,日志可移植性(尤其避免冲突),日志格式,异常码+帮助文档

回调机制:sdk通知数据,通过统一的模式回调用户处理。接口和数据结构需要具备可扩展性

寻址模式:解决ip,域名,nameserver、广播等多种寻址模式,需要可扩展

推送通道:解决server与存储、server间、server与sdk间推送性能问题

容量管理:管理每个租户,分组下的容量,防止存储被写爆,影响服务可用性

流量管理:按照租户,分组等多个维度对请求频率,长链接个数,报文大小,请求流控进行控制

缓存机制:容灾目录,本地缓存,server缓存机制。容灾目录使用需要工具

启动模式:按照单机模式,配置模式,服务模式,dns模式,或者all模式,启动不同的程序+UI

一致性协议:解决不同数据,不同一致性要求情况下,不同一致性机制

存储模块:解决数据持久化、非持久化存储,解决数据分片问题

Nameserver:解决namespace到clusterid的路由问题,解决用户环境与nacos物理环境映射问题

CMDB:解决元数据存储,与三方cmdb系统对接问题,解决应用,人,资源关系

Metrics:暴露标准metrics数据,方便与三方监控系统打通

Trace:暴露标准trace,方便与SLA系统打通,日志白平化,推送轨迹等能力,并且可以和计量计费系统打通

接入管理:相当于阿里云开通服务,分配身份、容量、权限过程

用户管理:解决用户管理,登录,sso等问题

权限管理:解决身份识别,访问控制,角色管理等问题

审计系统:扩展接口方便与不同公司审计系统打通

通知系统:核心数据变更,或者操作,方便通过SMS系统打通,通知到对应人数据变更

OpenAPI:暴露标准Rest风格HTTP接口,简单易用,方便多语言集成

Console:易用控制台,做服务管理、配置管理等操作

SDK:多语言sdk

Agent:dns-f类似模式,或者与mesh等方案集成

CLI:命令行对产品进行轻量化管理,像git一样好用

搭建

您可以在Nacosrelease notes博客中找到每个版本支持的功能的介绍,当前推荐的稳定版本为1.4.22.0.1。(20210708

启动nacos

预备环境准备

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+;下载 & 配置

下载

可以通过源码和发行包的方式获取Nacos

  • 下载源码

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

  • 下载编译后的压缩包

https://github.com/alibaba/nacos/releases

下载最新稳定版本zip

 

启动服务

Linux/Unix/Mac

启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

bash startup.sh -m standalone

Windows

启动命令(standalone代表着单机模式运行,非集群模式):

startup.cmd -m standalone

服务注册发现和配置管理

服务注册

Curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'

服务发现

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

发布配置

curl -X POST http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld

获取配置

curl -X GET http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test

关闭服务

Linux/Unix/Mac

sh shutdown.sh

Windows

shutdown.cmd

或者双击shutdown.cmd运行文件。

新建项目

参考文档https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html

通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更。

通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现。

配置中心使用

先新建一个springboot项目,添加如下依赖

<dependency>

  <groupId>org.springframework.cloud</groupId>

  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

  <version>0.2.0.RELEASE</version>

</dependency>

官方:

<dependency>

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>

    <version>${latest.version}</version>

</dependency>

注意:版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。

版本对应关系

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

在resource目录下加入 bootstrap.properties文件 并添加配置中心相关信息

bootstrap.properties:

#服务名

spring.application.name=nacos-config-example

# 配置中心url

spring.cloud.nacos.config.server-addr=127.0.0.1:8848

说明:

之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。

Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

相应的application.properties的内容写到配置中心里面去

在项目启动时就会去配置中心去读取配置信息(本地的配置文件application.properties还能用,但优先级低于配置中心的配置)

测试

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新:

@RestController

@RequestMapping("/config")

@RefreshScope

public class ConfigController {

    @Value("${useLocalCache:false}")

    private boolean useLocalCache;

    @RequestMapping("/get")

    public boolean get() {

        return useLocalCache;

    }

}

首先通过调用 Nacos Open API 向 Nacos Server 发布配置:dataId 为example.properties,内容为useLocalCache=true

curl -X POST http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=true

运行 NacosConfigApplication,调用 curl http://localhost:8080/config/get,返回内容是 true。

再次调用 Nacos Open API 向 Nacos server 发布配置:dataId 为example.properties,内容为useLocalCache=false

curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=false"

再次访问 http://localhost:8080/config/get,此时返回内容为false,说明程序中的useLocalCache值已经被动态更新了。

服务注册与发现

 

代码:https://github.com/nacos-group/nacos-examples/tree/master/nacos-spring-cloud-example/nacos-spring-cloud-discovery-example

添加依赖

<dependency>

    <groupId>com.alibaba.cloud</groupId>

    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>

    <version>${latest.version}</version>

</dependency>

配置服务提供者

从而服务提供者可以通过 Nacos 的服务注册发现功能将其服务注册到 Nacos server

在 application.properties 中配置 Nacos server 的地址:

server.port=8070

spring.application.name=service-provider

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:

@SpringBootApplication

@EnableDiscoveryClient

public class NacosProviderApplication {

       public static void main(String[] args) {

              SpringApplication.run(NacosProviderApplication.class, args);

       }

       @RestController

       class EchoController {

              @RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)

              public String echo(@PathVariable String string) {

                     return "Hello Nacos Discovery " + string;

              }

       }

}

配置服务消费者

在 application.properties 中配置 Nacos server 的地址:

server.port=8080

spring.application.name=service-consumer

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能(也可以@NacosInjected:说明中介绍)。给 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalanced 与 Ribbon 的集成:

@SpringBootApplication

@EnableDiscoveryClient

public class NacosConsumerApplication {

    @LoadBalanced

    @Bean

    public RestTemplate restTemplate() {

        return new RestTemplate();

    }

    public static void main(String[] args) {

        SpringApplication.run(NacosConsumerApplication.class, args);

    }

    @RestController

    public class TestController {

        private final RestTemplate restTemplate;

        @Autowired

        public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

        @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)

        public String echo(@PathVariable String str) {

            return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);

        }

    }

}

说明:

使用 @NacosInjected 注入 Nacos 的NamingService实例,通过NamingService的registerInstance() 向 Nacos Server 注册一个名称为applicationName的服务,当然,你也可以通过 Nacos Open API 方式注册:

curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=XXX&ip=XXX&port=XXX',这里我们介绍使用代码的方式。

配合springboot

@SpringBootApplication

public class NacosDiscoveryApplication {

    @NacosInjected

    private NamingService namingService;

    @Value("${server.port}")

    private int serverPort;

    @Value("${spring.application.name}")

    private String applicationName;

    @PostConstruct

    public void registerInstance() throws NacosException {

        namingService.registerInstance(applicationName, "127.0.0.1", serverPort);

    }

    public static void main(String[] args) {

        SpringApplication.run(NacosDiscoveryApplication.class, args);

    }

}

再写一个Controller来验证服务是否再 Nacos Server 上注册了,代码如下:

@RestController

@RequestMapping(value = "discovery")

public class NacosDiscoveryController {

    @NacosInjected

    private NamingService namingService;

/**

     * 浏览器访问:http://127.0.0.1:8080/discovery/get?serviceName=nacos-springboot-discovery

     *

     * @param serviceName

     * @return

     * @throws NacosException

     */

    @RequestMapping(value = "/get", method = GET)

    @ResponseBody

    public List<Instance> getInstance(@RequestParam String serviceName) throws NacosException {

        return namingService.getAllInstances(serviceName);

    }

}

可以直接访问

在浏览器上访问:http://127.0.0.1:8080/discovery/get?serviceName=nacos-springboot-discovery,返回结果如下:

[{

       "instanceId": "127.0.0.1#8080#{\"defaultCheckPort\":80,\"defaultPort\":80,\"healthChecker\":{\"type\":\"TCP\"},\"metadata\":{},\"name\":\"\",\"useIPPort4Check\":true}#nacos-springboot-discovery",

       "ip": "127.0.0.1",

       "port": 8080,

       "weight": 1.0,

       "healthy": true,

       "cluster": {

              "serviceName": null,

              "name": "",

              "healthChecker": {

                     "type": "TCP"

              },

              "defaultPort": 80,

              "defaultCheckPort": 80,

              "useIPPort4Check": true,

              "metadata": {}

       },

       "service": null,

       "metadata": {}

}]

启动测试

启动 ProviderApplication 和 ConsumerApplication ,调用 http://localhost:8080/echo/2018,返回内容为 Hello Nacos Discovery 2018。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值