Spring Cloud Alibaba Nacos 服务注册与发现功能实现!
Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分,它提供了两个重要的功能:服务注册与发现和统一的配置中心功能。
服务注册与发现功能解决了微服务集群中,调用者和服务提供者连接管理和请求转发的功能,让程序的开发者无需过多的关注服务提供者的稳定性和健康程度以及调用地址,因为这些都可以依靠 Nacos 进行监测、管理和自动转发。
试想一下,当一个系统被部署多个之后,如何确定要调用哪一个(服务)实例?当某个被调用的实例出现问题时,又如何将请求转发到其他实例上?这些问题都是微服务架构中现实存在的问题,然而使用 Nacos 就可以轻松的解决这些问题。并且 Nacos 也提供了统一的配置中心,解决了之前项目配置文件存放在本地或 github 上的安全性问题,并且支持动态修改和统一维护配置文件的功能。
1.Nacos 简介
Nacos 是 Dynamic Naming and Configuration Service 的首字母简称;它是⼀个更易于构建云原生应用的动态服务发现、配置管理和服务管理的平台。

官网:https://nacos.io/
仓库源码:https://github.com/alibaba/nacos
2.Nacos 生态
Nacos 几乎支持所有主流语言,其中 Java/Golang/Python 已经支持 Nacos 2.0 长链接协议,能最大限度发挥 Nacos 性能。阿里微服务 DNS(Dubbo+Nacos+Spring-cloud-alibaba/Seata/Sentinel)最佳实践,是 Java 微服务生态最佳解决方案。
3.Nacos 快速部署
Nacos 支持 3 种部署模式:
- 单机部署
- 集群部署
- 多集群部署
Nacos 安装方式有以下 2 种:
- 使用源码安装。
- 使用已编译好的安装包进行安装。
本文我们将使用第一种方式加 Docker,来快速部署 Nacos 服务器端。
因为 Docker 方式安装和卸载都比较方便,所以本文就采用此方式来演示 Nacos 的安装,其他安装方式,详见官网:https://nacos.io/zh-cn/docs/quick-start.html
3.1 预备环境准备
Nacos 依赖 Java 环境来运行,如果您是从代码开始构建并运行 Nacos,还需要为此配置 Maven 环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+。
- Maven 3.2.x+。
因为本文使用的是 Nacos + Docker 的方式进行部署的,所以没有安装 Docker 的同学,自行搜索安装哦。
安装 Open JDK 8
yum -y install java-1.8.0-openjdk-devel.x86_64
安装完之后,使用 java -version 检查是否安装成功,如下图所示:

若显示具体的 Java 版本则表示安装成功。
3.2 下载 Nacos
本文使用 git 的方式来下载 Nacos 源码包,所以需要使用以下命令来先安装 git:
yum -y install git
下载 Nacos 源码:
下载完成如下图所示:

进入 Nacos 目录:
cd nacos-docker
3.3 启动 Nacos 服务
Nacos 的运行是需要数据库的,它支持两种数据库:本地数据库 Derby、和 MySQL 数据库。
所以对应的启动命令有以下几种:
- Derby 数据库运行单机模式:docker-compose -f example/standalone-derby.yaml up
- MySQL 5.7 数据库运行单机模式:docker-compose -f example/standalone-mysql-5.7.yaml up
- MySQL 8 数据库运行单机模式:docker-compose -f example/standalone-mysql-8.yaml up
集群模式启动:docker-compose -f example/cluster-hostname.yaml up
启动成功如下图所示:

3.3 访问Nacos
启动成功之后,就可以使用 http://127.0.0.1:8848/nacos/#/login 来访问 Nacos 的管理控制台了,如下图所示:

用户名和密码都输入 nacos 就可以进入系统了,如下图所示:

3.4 常见报错问题
3.4.1 docker-compose 命令未找到
docker-compose 是用于定义和运行多容器 Docker 应用程序的编排工具。使用 docker-compose 后不再需要逐一创建和启动容器。您可以使用 YML 文件来配置应用程序需要的所有服务,然后使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。
但是 docker-compose 需要单独安装,否则会出现以下错误:

解决方案:
cd /usr/local/bin
wget https://github.com/docker/compose/releases/download/1.14.0-rc2/docker-compose-Linux-x86_64
rename docker-compose-Linux-x86_64 docker-compose docker-compose-Linux-x86_64
chmod +x /usr/local/bin/docker-compose
docker-compose version
安装成功如下图所示:

3.4.2 image:invalid reference format
使用 docker-compose 可能会提示“ERROR: no such image: nacos/nacos-server:: invalid reference format”,无效的参数格式,如下图所示:

解决方案:修改 Nacos 源码中 example/standalone-mysql-5.7.yaml 的配置项,将“image: nacos/nacos-server:{{NACOS_VERSION}}”,修改为:“image: nacos/nacos-server:latest”。
4.Spring Cloud Alibaba 服务注册
服务注册者也就是生产者,是微服务中的服务提供者。它是以 Spring Boot 项目为基础创建的,具体操作步骤如下:

创建项目使用阿里云的地址 http://start.aliyun.com 来创建 Spring Cloud Alibaba Nacos 项目,点击下一步 Next,如下图所示:

增加 Nacos Service Discovery 框架支持,如下图所示:

再添加 Spring Web(Spring MVC)框架的支持,最后点击 Finish 完成项目创建。
4.1 项目依赖
Spring Cloud Alibaba Nacos 项目主要有两个依赖项,如下内容所示:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
4.2 修改配置文件
在配置文件 application.properties 中要填写 Nacos 的相关信息,具体内容如下:
# 应用名称(也是 Nacos 中的服务名)
spring.application.name=spring-cloud-nacos-producer
# 应用服务 WEB 访问端口
server.port=8082
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=mse-6d50f4f0-p.nacos-ans.mse.aliyuncs.com:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
4.3 添加代码
接下来添加一个 Restful API 的接口,给后面的服务调用者使用,具体实现代码如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
@EnableDiscoveryClient
public class SpringCloudNacosProducerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringCloudNacosProducerApplication.class, args);
}
@RequestMapping("/sayhi/{name}")
public String sayHi(@PathVariable String name) {
return "Hi Nacos Discovery " + name;
}
}
编写完代码之后,运行项目,观察 Nacos 中的服务列表就可以看到此项目,如下图所示:

经过以上操作,我们创建的 Spring Cloud Alibaba 的项目就被注册到 Nacos 中了,其他程序也可以通过 Nacos 对它进行调用了。
5.Spring Cloud Alibaba 服务发现
与上面创建方式类似,接下来我们再创建一个服务调用者,也叫做消费者来调用上面框架中的 sayhi 方法,具体操作步骤如下。
5.1 创建项目


5.2 修改配置文件
# 应用名称
spring.application.name=springcloud-nacos-consumer
# 应用服务 WEB 访问端口
server.port=8082
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=82.157.146.10:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public
5.3 添加代码
消费者的实现代码有两个类,在启动类中添加一个 RestTemplate 的 Bean 对象,用于提供 Restful API 的请求,启动类的具体实现代码如下:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudNacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(SpringcloudNacosConsumerApplication.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
消费者的具体实现代码如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hi")
public String hi(String name) {
// 调用生产者 sayhi 方法,并返回结果
return restTemplate.getForObject("http://spring-cloud-nacos-producer/sayhi/" + name,
String.class);
}
}
添加完代码之后,运行程序,在 Nacos 的服务列表中可看到以下内容:

之后访问消费者的 hi 方法,让其调用生产者的实现效果如下:

从上述结果可以看出,消费者通过 Nacos 已经成功的调用到了生产者 spring-cloud-nacos-producer 中的 sayhi 方法了。
小结
Nacos 提供了两个重要的功能:服务注册与发现和统一配置中心的功能,它提供了 3 种部署方式:单机部署、集群部署和多集群部署,以及两种安装方式:源码安装和安装包安装。我们使用的是 Docker 加 Nacos 源码的方式来安装和部署 Nacos 的。Nacos 服务注册和发现都需要添加 Nacos Service Discovery 框架的支持,且在配置文件中配置相应的 Nacos 信息,才可以正确的实现服务的注册和发现功能。
参考&鸣谢
《Nacos框架与原理》
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java中文社群
Java面试合集:gitee.com/mydb/interview
Spring Cloud Alibaba Nacos 服务注册与发现功能实现!的更多相关文章
- Spring Cloud Alibaba | Nacos服务注册与发现
目录 Spring Cloud Alibaba | Nacos服务注册与发现 1. 服务提供者 1.1 pom.xml项目依赖 1.2 配置文件application.yml 1.3 启动类Produ ...
- Spring Cloud Alibaba 的服务注册与发现
Spring Cloud Alibaba 服务发现例子 一.需求 1.提供者完成的功能 2.消费者完成的功能 3.可以附加的额外配置 二.实现步骤 1.总的依赖引入 2.服务提供者和发现者,引入服务发 ...
- Spring Cloud Consul 实现服务注册和发现
Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...
- Spring Cloud实践之服务注册与发现Eureka
一.简述: 服务提供者producer与服务消费者consumer都注册到eureka server,然后服务consumer在其应用内直接调用producer的服务名来调用服务,而不是像之前一样调用 ...
- Spring Cloud Consul使用——服务注册与发现(注册中心)
整理自该文章 一.Consul 服务端接下来我们开发 Consul 的服务端,创建一个 spring-cloud-consul-producer 项目 1.添加依赖包 <dependencies ...
- Spring Cloud Eureka 实现服务注册与发现
微服务 是一种架构模式,跟具体的语言实现无关,微服务架构将业务逻辑分散到了各个服务当中,服务间通过网络层进行通信共同协作:这样一个应用就可以划分为多个服务单独来维护发布.构建一个可靠微服务系统是需要具 ...
- 服务注册发现Eureka之一:Spring Cloud Eureka的服务注册与发现
Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...
- Spring Cloud之Eureka服务注册与发现
解决什么问题 ➟阐述微服务以及服务注册发现的部分概念 ➟阐述Eureka服务注册与发现的部分原理及细节 为什么需要服务中心 过去,每个应用都是一个CPU,一个主机上的单一系统.然而今天,随着大数据和云 ...
- Spring Cloud(一):服务注册与发现
Spring Cloud是什么 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...
随机推荐
- 郑厂长系列故事——体检(hdu 4519)
郑厂长系列故事--体检 Time Limit: 500/200 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total S ...
- SOA 和微服务
====>场景 不可能让客户端与6个不同的应用/系统都一一去通信来去完成数据的展示.而是6个应用/系统之间进行彼此通信来完成调用,最后客户端只需要调用一个接口来获取数据即可. SOA架构 SOA ...
- Shell自动上传下载文件到SFTP服务器
1.说明 本文提供一个Shell脚本, 可以自动连接到SFTP服务器, 然后上传或者下载指定的文件, 进而可以使用Linux的corntab命令, 定时执行脚本上传下载文件, 实现文件的同步或者备份功 ...
- Ranger-Yarn插件安装
Ranger-Yarn插件ranger-0.6.0-yarn-plugin安装到Yarn的所有ResourceManager节点, 其他的NodeManager节点不需要安装. 登陆hdfs安装的用户 ...
- linux(CentOS7) 之 MySQL 5.7.30 下载及安装
一.下载 1.百度搜索mysql,进入官网(或直接进入官网https://www.mysql.com) 2.选择 downloads 3.翻到最下面,选择MySQL Community (GPL) D ...
- vim 安装使用 pathogen
目录 pathogen 是什么? 如何安装? pathogen 是什么? pathogen 一般作为 vim 新手的第一个插件,用来统一管理 vim 插件包. (官方解释)非常容易地管理你的 'run ...
- spring cloud --- Ribbon 客户端负载均衡 + RestTemplate ---心得【无熔断器】
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 了解了 eureka 服务注册与发现 的3大角色 ,会使用RestTem ...
- Kubernetes三大落地姿势,你pick谁?
Kubernetes是面向企业的开源容器编排工具的事实标准,它提供了应用部署.扩展.容器管理等功能.经过几年的发展,Kubernetes已成为云计算和现代IT基础架构的通用平台,得到广泛应用进入产业落 ...
- 联盛德 HLK-W806 (十三): 运行FatFs读写FAT和exFat格式的SD卡/TF卡
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- CTF-sql-万能密码
以下是我在学习sql注入时的一些感想分享,希望能帮助到大家,如有错误,望指出. 万能密码的种类: ①select * from admin where username ="" a ...