跳到主要内容

nacos基本使用

1. 说在前面

我一直觉得,了解一个新鲜的技术,最应该看的是技术的官网,或者是github的README.md。而不是看各种博客上的东西,这样对我们了解一个新的东西可能会产生很多的误解。

2. 官网

官网快速开始

对于官方上的介绍:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

这里提到的几点,我们需要注意的是动态服务发现配置管理服务管理

这也就是我们在学习了nacos之后能够做到的事,当然也可以理解为能够解决的问题。

2.1 功能

2.1.1 动态配置服务

动态配置服务让您能够以中心化外部化动态化的方式管理所有环境的配置动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单,也让按需弹性扩展服务更容易。

这段介绍,做做阅读理解就是,我们可以动态管理我们开发环境和生产环境的配置。可以进行动态配置,当我们修改一个配置的时候不用再进行重新部署应用,这点大家应该都是知道的,springboot项目修改一个server.port=9001也是需要进行重新项目的。而nacos就可以消除这个。当然怎么消除,得进行学习。

配置的中心化管理实现无状态服务。这句话是什么意思呢?首先我们要了解什么是无状态服务

这里你可以自行百度一下,比如服务的有状态和无状态 ,我这里引用一下那篇博客说的,很快就懂了

有状态服务

在商城里购买一件商品。需要经过放入购物车、确认订单、付款等多个步骤。

由于HTTP协议本身是无状态的,所以为了实现有状态服务,就需要通过一些额外的方案。比如最常见的session,将用户挑选的商品(购物车),保存到session中,当付款的时候,再从购物车里取出商品信息

无状态服务

对于客户端来说,就可以将请求发送到任意一台server上,而这个请求里面包含了唯一确定的用户信息,这样的技术有jwt

如果你已经明白了无状态服务,那么如果说无状态服务可以更好的通过负载均衡 等手段,实现水平扩展。这个你也应该是理解的。

2.1.2 服务发现及管理

动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,您可以更容易地为您的服务实现断路器。

这段介绍给我的理解就是说,可以集成dubbo。健康检查就是会定期检查注册到nacos上的服务是不是还存活,这个和zookeeper临时节点有点类似,如果你有相关的经验的话。还说到了nacos可以实现断路器。

断路器又是什么呢?占用两分钟的时间看个小视频微服务中的断路器模式

2.1.3 动态DNS服务

通过支持权重路由动态DNS服务能让您轻松实现中间层负载均衡更灵活的路由策略流量控制以及简单数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现,以消除耦合到厂商私有服务发现API上的风险

对于路由这块本人也实在是不太了解哈哈,但是从后面的负载均衡,流量控制,服务发现。我想大家都是知道的。

ok,看完了官网的介绍,我们对nacos其实知道了一下它的功能,能够帮我们解决一下什么样的问题。这时候可以想象自己如果是nacos的产品经理,当出去吹nacos的时候,肯定就可以挑这里面的特点进行宣传和介绍。

3. 安装

说了太多不是重点的东西,来下载一个玩玩。现在官网上给到的推荐稳定版本是1.4.1.

这是官网的快速开始,其实也就是接下来的内容

3.1 下载源码或者安装包

3.1.1 从 Github 上下载源码方式

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
ls -al distribution/target/

// 进入你下载的nacos版本对应的位置
cd distribution/target/nacos-server-$version/nacosjs

3.1.2 下载编译后压缩包方式

您可以从 最新稳定版本 下载 nacos-server-$version.zip 包。

unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin

4. 启动服务器

4.1 Linux/Unix/Mac

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

sh startup.sh -m standalone

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

bash startup.sh -m standalone

4.2 Windows

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

cmd startup.cmd -m standalone image.png

通过你的浏览器进行访问一下,地址:http://127.0.0.1:8848/nacos/index.html#/login

账号密码都是nacos

image.png

5. 服务注册&发现和配置管理

5.1 服务注册

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

当然我们在windows上没有curl操作,可以通过postman来进行image.png

再回到我们的浏览器进行查看,当然你的速度可能要快一点,不然超时时间到了就看不到了

image.png

5.2 服务发现

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

5.3 发布配置

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

5.4 获取配置

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

6. 关闭服务器

6.1 Linux/Unix/Mac

sh shutdown.sh

6.2 Windows

cmd shutdown.cmd

或者双击shutdown.cmd运行文件

好了,这些就是最最最基本的nacos操作了,接下来让我们结合代码看看

7. 集成SpringBoot

实在是因为SpringBoot更加简单一下,就不打算用Spring的例子了。

接下来还是官网的例子,哇靠,官网说的这么详细,那我为什么还要再复制一遍呢

7.1 启动配置管理[动态配置]

启动了 Nacos server 后,您就可以参考以下示例代码,为您的 Spring Boot 应用启动 Nacos 配置管理服务了。完整示例代码请参考:nacos-spring-boot-config-example

  1. 添加依赖。
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>

注意 :版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。

这个注意很重要啊,如果你打算把nacos集成进你的项目中,那么就需要注意到这个,不然可能会出现一些莫名其妙的错误。

  1. application.properties 中配置 Nacos server 的地址:
nacos.config.server-addr=127.0.0.1:8848
  1. 使用 @NacosPropertySource 加载 dataIdexample 的配置源,并开启自动更新:
@SpringBootApplication
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfigApplication {

public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}
}
  1. 通过 Nacos 的 @NacosValue 注解设置属性值。
@Controller
@RequestMapping("config")
public class ConfigController {

@NacosValue(value = "${useLocalCache:false}", autoRefreshed = true)
private boolean useLocalCache;

@RequestMapping(value = "/get", method = GET)
@ResponseBody
public boolean get() {
return useLocalCache;
}
}
  1. 启动 NacosConfigApplication,调用 curl http://localhost:8080/config/get,返回内容是 false
  2. 通过调用 Nacos Open API 向 Nacos server 发布配置:dataId 为example,内容为useLocalCache=true
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example&group=DEFAULT_GROUP&content=useLocalCache=true"
  1. 再次访问 http://localhost:8080/config/get,此时返回内容为true,说明程序中的useLocalCache值已经被动态更新了。

这里不知道大家有没有发现,这个就是实现了动态配置啊!!!好简单!!!

8. 启动服务发现

本节演示如何在您的 Spring Boot 项目中启动 Nacos 的服务发现功能。完整示例代码请参考:nacos-spring-boot-discovery-example

  1. 添加依赖。
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>

注意 :版本 0.2.x.RELEASE 对应的是 Spring Boot 2.x 版本,版本 0.1.x.RELEASE 对应的是 Spring Boot 1.x 版本。

  1. application.properties 中配置 Nacos server 的地址:
nacos.discovery.server-addr=127.0.0.1:8848
  1. 使用 @NacosInjected 注入 Nacos 的 NamingService 实例:
@Controller
@RequestMapping("discovery")
public class DiscoveryController {

@NacosInjected
private NamingService namingService;

@RequestMapping(value = "/get", method = GET)
@ResponseBody
public List<Instance> get(@RequestParam String serviceName) throws NacosException {
return namingService.getAllInstances(serviceName);
}
}

@SpringBootApplication
public class NacosDiscoveryApplication {

public static void main(String[] args) {
SpringApplication.run(NacosDiscoveryApplication.class, args);
}
}
  1. 启动 NacosDiscoveryApplication,调用 curl http://localhost:8080/discovery/get?serviceName=example,此时返回为空 JSON 数组[]
  2. 通过调用 Nacos Open API 向 Nacos server 注册一个名称为 example 服务
curl -X PUT 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=example&ip=127.0.0.1&port=8080'
  1. 再次访问 curl http://localhost:8080/discovery/get?serviceName=example,此时返回内容为:
[
{
"instanceId": "127.0.0.1-8080-DEFAULT-example",
"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": {}
}
]