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 种部署模式:

  1. 单机部署
  2. 集群部署
  3. 多集群部署

Nacos 安装方式有以下 2 种:

  1. 使用源码安装。
  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 源码:

git clone https://github.com/nacos-group/nacos-docker.git

下载完成如下图所示:



进入 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 服务注册与发现功能实现!的更多相关文章

  1. Spring Cloud Alibaba | Nacos服务注册与发现

    目录 Spring Cloud Alibaba | Nacos服务注册与发现 1. 服务提供者 1.1 pom.xml项目依赖 1.2 配置文件application.yml 1.3 启动类Produ ...

  2. Spring Cloud Alibaba 的服务注册与发现

    Spring Cloud Alibaba 服务发现例子 一.需求 1.提供者完成的功能 2.消费者完成的功能 3.可以附加的额外配置 二.实现步骤 1.总的依赖引入 2.服务提供者和发现者,引入服务发 ...

  3. Spring Cloud Consul 实现服务注册和发现

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布 ...

  4. Spring Cloud实践之服务注册与发现Eureka

    一.简述: 服务提供者producer与服务消费者consumer都注册到eureka server,然后服务consumer在其应用内直接调用producer的服务名来调用服务,而不是像之前一样调用 ...

  5. Spring Cloud Consul使用——服务注册与发现(注册中心)

    整理自该文章 一.Consul 服务端接下来我们开发 Consul 的服务端,创建一个 spring-cloud-consul-producer 项目 1.添加依赖包 <dependencies ...

  6. Spring Cloud Eureka 实现服务注册与发现

    微服务 是一种架构模式,跟具体的语言实现无关,微服务架构将业务逻辑分散到了各个服务当中,服务间通过网络层进行通信共同协作:这样一个应用就可以划分为多个服务单独来维护发布.构建一个可靠微服务系统是需要具 ...

  7. 服务注册发现Eureka之一:Spring Cloud Eureka的服务注册与发现

    Spring Cloud简介 Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中的配置管理.服务发现.断路器.智能路由.微代理.控制总线.全局锁 ...

  8. Spring Cloud之Eureka服务注册与发现

    解决什么问题 ➟阐述微服务以及服务注册发现的部分概念 ➟阐述Eureka服务注册与发现的部分原理及细节 为什么需要服务中心 过去,每个应用都是一个CPU,一个主机上的单一系统.然而今天,随着大数据和云 ...

  9. Spring Cloud(一):服务注册与发现

    Spring Cloud是什么 Spring Cloud是一系列框架的有序集合.它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册.配置中心.消息总线.负载均 ...

随机推荐

  1. Codeforce 633C. Spy Syndrome 2

    C. Spy Syndrome 2 time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  2. JUC之线程间的通信

    线程通信 视频1: 2021.12.18 JUC视频学习片段 对上次多线程编程步骤补充(中部): 创建资源类,在资源类中创建属性和操作方法 在资源类里面操作 判断 干活 通知 创建多个线程,调用资源类 ...

  3. Linux Cgroups详解(一)

    [转载]http://blog.chinaunix.net/uid-23253303-id-3999432.html Cgroups是什么? Cgroups是control groups的缩写,是Li ...

  4. 源码解析C#中PriorityQueue(优先级队列)的实现

    前言 前段时间看到有大佬对.net 6.0新出的PriorityQueue(优先级队列)数据结构做了解析,但是没有源码分析,所以本着探究源码的心态,看了看并分享出来.它不像普通队列先进先出(FIFO) ...

  5. 文件挂载(一)- Linux挂载Linux文件夹

    一.概述 工作中经常会出现不同服务器.不同操作系统之间文件夹互相挂载的情形,例如文件服务器或数据备份服务器. 挂载一般来说就是以下四种类型: 同类型操作系统 a. linux挂载linux文件夹 b. ...

  6. java-热部署

    IDEA热部署方式: spring-boot-devtools JRebel插件 spring-boot-devtools为应用提供一些开发时特性,包括默认值设置,自动重启,livereload等. ...

  7. KISS原则

    Keep It Simple, Stupid 1. 模块性原则:写简单的,通过干净的接口可被连接的部件:2. 清楚原则:清楚要比小聪明好.3. 合并原则:设计能被其它程序连接的程序.4. 分离原则:从 ...

  8. CS5211|DP转LVDS |低成本DP to LVDS Conversion 方案设计

    目前市面上DP转LVDS转换--DP to LVDS Conversion 方案设计有以下: 龙迅LT8911 LT7211.普瑞PS8625.昆泰CH7511等方案,DP换LVDS转换主要是用在一些 ...

  9. IntelliJ IDEA 2019.3 代码提示忽略大小写(IDEA 2019版本如何设置代码提示不分大小写?)

    最近在使用IDEA,发现每次只能进行完全匹配,且区分大小写,界面变了IDEA 2019.3 忽略大小写设置跟之前的版本稍微有点不同,跟之前的软件有点点区别,在此记录一下不区分大小写的方法. 1. 使用 ...

  10. 为什么操作dom会消耗性能

    因为对DOM的修改为影响网页的用户界面,重绘页面是一项昂贵的操作.太多的JavaScript DOM操作会导致一系列的重绘操作,为了确保执行结果的准确性,所有的修改操作是按顺序同步执行的.我们称这个过 ...