Nacos基本使用
什么是 Nacos
Nacos提供了统一配置管理、服务发现与注册。 其中服务注册和发现的功能,相当于dubbo里面使用到的zookeeper、 或者spring cloud里面应用到的consoul以及eureka。
Nacos的特性
-
服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
-
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
-
动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
-
服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
Nacos的使用
使用war包启动
#下载nacos
https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.zip
#window启动
//进入bin目录下,输入
startup.cmd -m standalone
#linux 也一样
-
-m standalone: 代表的时候单机启用
-m cluster: 代表是集群模式启用
-
1.3.2默认版本是:集群启动的,如果没创建数据库会报错的。
打开startup.cmd可以看到:
这就是为什么默认是集群启动的原因了。
启动完成后可以访问地址:
http://127.0.0.1:8848/nacos 账号:nacos 密码:nacos
在docker上启动
docker run -d --name nacos-server-8848 -p 8848:8848 --privileged=true -v
/opt/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v
/opt/nacos/logs:/home/nacos/logs --restart=always -e MODE=standalone -e
PREFER_HOST_MODE=hostname nacos/nacos-server
Nacos结合spring cloud的使用
版本规范:
由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud-commons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本:
- 1.5.x 版本适用于 Spring Boot 1.5.x
- 2.0.x 版本适用于 Spring Boot 2.0.x
- 2.1.x 版本适用于 Spring Boot 2.1.x
- 2.2.x 版本适用于 Spring Boot 2.2.x
注意:这里的是指com.alibaba.cloud包下的版本。
提供者和消费者的共用的pom.xml
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.0.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
提供者的配置(里面包含了动态配置服务的配置)
pom.xml
<dependencies>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!-- <version>2.2.1.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>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
这里使用org.springframework.cloud包下的或者使用com.alibaba.cloud包下的都是可以的。
bootstrap.yml
spring:
cloud:
nacos:
discovery:
enabled: true
server-addr: 127.0.0.1:8848 #注册服务的地址
config:
server-addr: 127.0.0.1:8848 #统一配置中心的地址
file-extension: yaml #配置内容的数据格式
application:
name: nacos-provider
server:
port: 8021
注意: 这里是bootstrap.yml,如果不是boostrap.yml的话。会启动的的时候报错:
可以看到:NacosConfigProperties里面的配置信息都是空的,应该就是NacosConfigProperties读取配置是读取bootstrap.yml,而不是application.yml里的内容。
代码:
启用类:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProvider {
public static void main(String[] args) {
SpringApplication.run(NacosProvider.class,args);
}
}
controller类,后面会通过nacos修改userName配置,让提供者实时返回相应的userName
/**
* @Author: gyc
* @Date: 2020/11/17 16:59
*/
@RestController
@RefreshScope //自动刷新
@RequestMapping("/user")
public class UserController {
@Value("${userAccount:abc}")
private String userAccount;
@GetMapping("/getUser")
public String getUser(){
return userAccount;
}
}
消费者的配置
pom.xml
<dependencies>
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>-->
<!-- <version>2.2.1.RELEASE</version>-->
<!-- </dependency>-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
</project>
这里也一样可以使用com.alibaba.cloud包下的也可以使用org.springframework.cloud包下的,我们还引入了opernfeign来做一个远程的调用
application.yml配置
spring:
cloud:
nacos:
discovery:
enabled: true
server-addr: 127.0.0.1:8848 #注册中心的地址
application:
name: nacos-consumer
server:
port: 8022
代码:
启用类:
/**
* @Author: gyc
* @Date: 2020/11/18 17:13
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.onion.feign")
public class NacosConsumerApp {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApp.class,args);
}
}
feign的配置:
@FeignClient(name = "nacos-provider")
public interface UserFeign {
@GetMapping("/user/getUser")
public String getUser();
}
controller:
@RequestMapping("/product")
@RestController
public class ProductController {
@Autowired
private UserFeign userFeign;
@GetMapping("getUser")
public String getUser(){
return userFeign.getUser();
}
}
服务注册效果展示
上图就是我们nacos-provier,nacos-consumer都注册到nacos中的效果图。
上图就是nacos-priver的服务详情
nacos动态配置效果
首先要新增一个配置管理,然后填写以下的信息:
上图中的Data ID:
${prefix}-${spring.profiles.active}.${file-extension}
- prefix: 默认为 spring.application.name 的值,也可以通过配置项spring.cloud.nacos.config.prefix 来配置
- 当spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension 来配置
上图中的配置格式:
通过配置项spring.cloud.nacos.config.file-extension 来配置的
上图中的配置内容:
就是动态配置的内容,因为我们在UserController.userAccount
的成员变量带上了 @Value("${userAccount:abc}")
注解,所以如果动态配置生效的话,返回的成员变量就是张三了。
因为我们配置的文件如下: 所以得到的dataId: nacos-provider.yaml, 配置格式为:yaml
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 #统一配置中心的地址
file-extension: yaml #配置内容的数据格式
application:
name: nacos-provider
注意: 这里需要使用yaml不能用yml了。因为我之前使用了nacos-provier.yml就不生效
下面是我的动态gif的效果图片:
可以看到,原本我们返回的还是默认值abc,当我们发布了这个nacos-provier配置之后,最后请求就返回了zhangsan。这样子正好能达到我们想要的效果了
Nacos结合dubbo的使用
可以参考我之前写的博客的dubbo的入门参考地址:
https://www.cnblogs.com/dabenxiang/p/13898031.html
Nacos的Api的使用
以入的依赖,pom.xml文件:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.7</version>
</dependency>
</dependencies>
application.yml配置文件
spring:
application:
name: nacos-boot
nacos:
discovery:
server-addr: 127.0.0.1:8848
server:
port: 10001
代码:
/**
* @Author: gyc
* @Date: 2020/11/25 10:40
*/
@SpringBootApplication
public class NacosBootApp {
public static void main(String[] args) {
SpringApplication.run(NacosBootApp.class,args);
}
}
/**
* @Author: gyc
* @Date: 2020/11/25 10:47
*/
@RestController
public class TestController {
@NacosInjected
private NamingService namingService; //服务注册功能的Service
//获取服务信息的api
@GetMapping("/get")
public String get() throws NacosException {
return namingService.
getAllInstances("nacos-boot").toString();
}
//注册服务信息的api
@PostMapping("/registry")
public String registry() throws NacosException {
Instance instance=new Instance();
instance.setClusterName("TestCluster");
instance.setEnabled(true);
instance.setEphemeral(true); //临时节点/持久化节点, CP(Raft), AP(Distro)
instance.setIp("192.168.1.104");
instance.setPort(8888);
instance.setWeight(10); //1~100
namingService.registerInstance("nacos-boot",instance);
return "SUCCESS";
}
}
上面是分为,服务注册的实现和服务发现的实现。
把服务注册到注册中心上,nacos-boot里面的服务详情如下:
然后通过get()接口获取到的数据如下:
[
{
"clusterName": "TestCluster",
"enabled": true,
"ephemeral": true,
"healthy": true,
"instanceHeartBeatInterval": 5000,
"instanceHeartBeatTimeOut": 15000,
"instanceId": "192.168.1.104#8888#TestCluster#DEFAULT_GROUP@@nacos-boot",
"instanceIdGenerator": "simple",
"ip": "192.168.1.104",
"ipDeleteTimeout": 30000,
"metadata": {},
"port": 8888,
"serviceName": "DEFAULT_GROUP@@nacos-boot",
"weight": 10.0
}
]
下面这个图是nacos基本的结构图: