Nacos入门
什么是Nacos
使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。
架构图
一图看懂 Nacos,下面架构部分会详细介绍。
特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求
架构大图:通过清晰架构,让您快速进入 Nacos 世界
业务大图:利用当前特性可以支持的业务场景,及其最佳实践
生态大图:系统梳理 Nacos 和主流技术生态的关系
优势大图:展示 Nacos 核心竞争力
战略大图:要从战略到战术层面讲 Nacos 的宏观优势
生态图
实战展示
话不多说,理论知识要搞好,实战才是硬道,首先先把环境配置搞定再说
Nacos环境
Nacos下载路径: https://github.com/alibaba/nacos/tree/develop/distribution.
启动
Linux/Unix/Mac
sh startup.sh -m standalone
如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:
bash startup.sh -m standalone
Windows
启动命令(standalone代表着单机模式运行,非集群模式):
cmd startup.cmd -m standalone
我这里用的是windows系统进行测试,下载后也可以直接在目录下的bin目录下打开startup.cmd即可,效果如下
打开后就可以访问该目录,会有一个UI管理器界面
当可以进入这个界面之后,证明你的nacos已经是没什么问题了,然后登陆账号密码都是nacos,输入即可展现如下画面
依赖
这边基本上是已经没什么问题了,那么这次展现的是SpringBoot整合Nacos的一个小案例,那么下面创建一个SpringBoot项目,这里就不做演示了,下面直接操作,首先老样子加入一个Maven的依赖包,如下
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-spring-context</artifactId>
<version>1.1.0</version>
</dependency>
配置
在 application.properties 中配置 Nacos server 的地址
nacos.config.server-addr=127.0.0.1:8848
启动类加上Nacos注解
@NacosPropertySource(dataId = "example", autoRefreshed = true)
编写配置类
package com.nacos.nacosdb.config;
import com.alibaba.nacos.api.annotation.NacosProperties;
import com.alibaba.nacos.spring.context.annotation.config.EnableNacosConfig;
import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource;
import org.springframework.context.annotation.Configuration;
/**
* @Author uncletj
* @Date 2021/4/19 17:42
* @Version SpringBoot 2.2.2
* @projectName
*/
@Configuration
@EnableNacosConfig(globalProperties = @NacosProperties(serverAddr = "127.0.0.1:8848"))
@NacosPropertySource(dataId = "example", autoRefreshed = true)
public class NacosConfiguration {
}
编写控制类
package com.nacos.nacosdb.controller;
import com.alibaba.nacos.api.config.annotation.NacosValue;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import static org.springframework.web.bind.annotation.RequestMethod.GET;
/**
* @Author uncletj
* @Date 2021/4/19 15:03
* @Version SpringBoot 2.2.2
* @projectName
*/
@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;
}
}
然后我们使用cURL进行一波测试看看返回的内容是什么
什么是cURL
cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl
下载安装传送门
cURL下载路径: https://curl.se/download.html.
测试
下载后即可在cmd内进行使用,既然都一步俱全了下面就来测试吧
首先在cURL内输入curl http://localhost:8080/config/get
测试看看
返回为false,因为我们还没对Nacos进行配置,下面我们在去向 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"
既然它都true了,那么自然应该是没什么毛病了,并且还可以在我们的配置列表中看见有一个配置
这里有配置了,那再去访问上面那条url试试,这回应该就是true了
服务发现
服务提供者(discovery)
项目结构图
首先这边使用的是多模块项目,具体结构如下图,首先是创建了一个名为cloud的父项目,然后在父级文件下创建了一个product的子项目
POM
首先我们先把父级的依赖先完善好
cloud.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.luas.cloud</groupId>
<artifactId>cloud</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>java-boot-parent-2.1</name>
<description>Spring Cloud Learning, parent project by spring boot 2.1.x</description>
<properties>
<java.version>1.8</java.version>
<hutool.version>4.6.13</hutool.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
<spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
然后子级别的的pom当然要与父级的相连通
product.pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.luas.cloud</groupId>
<artifactId>java-boot-parent-2.1</artifactId>
<version>1.0.0-SNAPSHOT</version>
<relativePath>../../cloud</relativePath>
</parent>
<groupId>com.luas.cloud</groupId>
<artifactId>product</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>xmall-product</name>
<description>Spring Cloud Learning,nacos-client</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- nacos cloud -->
<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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
YML配置
server:
port: 8081
spring:
application:
name: uncletj
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
注意,spring.application.name将作为uncletj服务在nacos注册后的服务名称,该服务名称非常重要,后续无论是通过feign调用,还是rest调用,均需要此名称
这里只是配置了一下启动tomcat的端口号与Nacos的连接端口与服务列表的服务名,下面在写一个简单的demo测试一下
DEMO
个人介绍
import cn.hutool.core.map.MapUtil;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author uncletj
* @Date 2021/4/20 14:22
* @Version SpringBoot 2.2.2
* @projectName 个人介绍
*/
@RestController
@RequestMapping("/person")
public class PersonController {
@RequestMapping("/{id}")
public Object get(@PathVariable("id") String id) {
return MapUtil.<String, Object>builder()
.put("id", id)
.put("name", "藤井大叔")
.put("gender", "男")
.put("age","22")
.put("hobby","是一个宅男")
.build();
}
}
运行看看,然后打开nacos控制台,发现访问已然在列表中,注册成功!可以点击详情查看服务元数据
然后在访问一下http://localhost:8081/person/1,得出以下结果