一、Nacos 介绍
Nacos 英文全称 Dynamic Naming and Configuration Service,它是 Spring Cloud Alibaba 的核心组件之一,致力于微服务架构中的服务注册与发现、配置管理。
Nacos 将注册中心和配置中心整合在一起,提供了两个核心功能,即服务注册与发现和动态配置服务。
1.1 服务注册与发现
Nacos 支持基于 DNS 和 基于 RPC 的服务发现,服务提供者向 Nacos 服务端注册服务后,服务消费者可以从 Nacos 服务端获取注册列表。
1.2 动态配置服务
提供了一个简洁易用的 UI,方便用户管理所有环境的应用配置和服务配置,消除了配置变更时服务需重新部署的过程。还提供了包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,大大降低配置变更带来的风险。
二、Nacos 服务端
Nacos 分为服务端和客户端,服务端用来提供服务发现与注册等功能,客户端就是不同的应用和服务。
2.1 下载 Nacos
在 Nacos 的 Release Notes 可以看到每个版本的相关介绍。当前最新的稳定版本是 1.4.0。
# 下载
wget https://github.com/alibaba/nacos/releases/download/1.4.0/nacos-server-1.4.0.tar.gz
# 解压
tar -zxvf nacos-server-1.4.0.tar.gz
2.2 启动 Nacos
Nacos 服务需要 Java 运行环境,因此,在启动服务之前需要确保你的服务器已经有了 Java 运行环境,并且配置好了JAVA_HOME
。
# 启动 Nacos
sh shartup.sh -m standalone
参数说明:
-m:指定运行模式,standalone 表示单机模式
2.3 关闭服务
# 关闭 Nacos
sh shutdown.sh
2.4 登录 UI
在 Nacos 配置文件中配置服务器ip,默认的端口号为8848,默认的用户名和密码均为nacos,访问http://ip:8848/nacos/index.html
便能够成功登Nacos管理后台。
三、Nacos 客户端
3.1 Provider 服务提供者
(1) 引入依赖
在 SpringBoot 项目中引入 Nacos 客户端依赖,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.cloud.alibaba.version>2.2.0.RELEASE</spring.cloud.alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- spring cloud alibaba 版本控制-->
<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>
<dependencies>
<!-- nacos 客户端 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
(2) 修改配置
在application.properties
配置文件中添加 Nacos 的基本配置 (也可以是application.yml
)
1)application.properties
spring.application.name=hannibal-order
# Nacos 服务端地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
2)application.yml
spring:
application:
name: hannibal-order
cloud:
nacos:
discovery:
server-addr: 192.168.33.10:8848
(3) @EnableDiscoveryClient 注解
在 SpringBoot 的启动类上添加 @EnableDiscoveryClient
注解来开启服务注册。
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderDemoApplication.class, args);
}
}
3.2 Consumer 服务消费者
Nacos Discovery 默认集成了 Netflix Ribbon,服务消费者可以使用 RestTemplate 或 OpenFeign 进行服务的调用。
@RestController
@RequestMapping(value = "/order/", produces = "application/json; charset=UTF-8")
public class OrderController {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
@Autowired
private LoadBalancerClient loadBalancerClient;
@PostMapping(value = "submit")
public String submit() {
// 根据服务名称获取实例
ServiceInstance serviceInstance = loadBalancerClient.choose("hannibal-stock");
// 获取接口地址
String url = String.format("http://%s:%s/stock/reduce", serviceInstance.getHost(), serviceInstance.getPort());
// 发起请求
return restTemplate().getForObject(url, String.class);
}
}
四、问题总结
(1) Nacos 启动时报如下错误
which: no javac in (/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.171-8.b10.el7_5.i386/bin)
问题原因:通过yum命令安装的普通的openJDK没有javac等工具,而且安装完以后连环境变量都不需要配置,就能使用java -version
验证。
解决方案:重新安装devel开发版openJDK,开发版的openJDK有javac工具,然后配置java环境变量即可。
yum install -y java-1.8.0-openjdk-devel.x86_64
(2) Nacos Provider 启动报错
java.lang.IllegalStateException: failed to req API:/nacos/v1/ns/instance after all servers([localhost:8848]) tried: failed to req API:localhost:8848/nacos/v1/ns/instance. code:500 msg: java.net.ConnectException: Connection refused: connect
问题原因:没有配置 Nacos 服务端的地址,因此,当 Nacos Provider 启动的时候,无法与注册中心通信
解决方案:在配置文件中配置 Nacos 服务端地址,如下所示:
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
网友评论