Spring Cloud Alibaba Nacos 服务注册与发现功能实现!

Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分,它提供了两个重要的功能:服务注册与发现和统一的配置中心功能。

服务注册与发现功能解决了微服务集群中,调用者和服务提供者连接管理和请求转发的功能,让程序的开发者无需过多的关注服务提供者的稳定性和健康程度以及调用地址,因为这些都可以依靠 Nacos 进行监测、管理和自动转发。

试想一下,当一个系统被部署多个之后,如何确定要调用哪一个(服务)实例?当某个被调用的实例出现问题时,又如何将请求转发到其他实例上?这些问题都是微服务架构中现实存在的问题,然而使用 Nacos 就可以轻松的解决这些问题。并且 Nacos 也提供了统一的配置中心,解决了之前项目配置文件存放在本地或 github 上的安全性问题,并且支持动态修改和统一维护配置文件的功能。

1.Nacos 简介

Nacos 是 Dynamic Naming and Configuration Service 的首字母简称;它是⼀个更易于构建云原生应用的动态服务发现、配置管理和服务管理的平台。

image.png


官网: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 检查是否安装成功,如下图所示:

image.png


若显示具体的 Java 版本则表示安装成功。

3.2 下载 Nacos

本文使用 git 的方式来下载 Nacos 源码包,所以需要使用以下命令来先安装 git:

yum -y install git

下载 Nacos 源码:

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

下载完成如下图所示:

image.png


进入 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

启动成功如下图所示:

image.png

3.3 访问Nacos

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

image.png


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

image.png

3.4 常见报错问题

3.4.1 docker-compose 命令未找到

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

image.png


解决方案:

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

安装成功如下图所示:

image.png

3.4.2 image:invalid reference format

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

image.png


解决方案:修改 Nacos 源码中 example/standalone-mysql-5.7.yaml 的配置项,将“image: nacos/nacos-server:{{NACOS_VERSION}}”,修改为:“image: nacos/nacos-server:latest”。

4.Spring Cloud Alibaba 服务注册

服务注册者也就是生产者,是微服务中的服务提供者。它是以 Spring Boot 项目为基础创建的,具体操作步骤如下:

image.png


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

image.png


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

image.png


再添加 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 中的服务列表就可以看到此项目,如下图所示:

image.png


经过以上操作,我们创建的 Spring Cloud Alibaba 的项目就被注册到 Nacos 中了,其他程序也可以通过 Nacos 对它进行调用了。

5.Spring Cloud Alibaba 服务发现

与上面创建方式类似,接下来我们再创建一个服务调用者,也叫做消费者来调用上面框架中的 sayhi 方法,具体操作步骤如下。

5.1 创建项目

image.png


image.png

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 的服务列表中可看到以下内容:

image.png


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

image.png


从上述结果可以看出,消费者通过 Nacos 已经成功的调用到了生产者 spring-cloud-nacos-producer 中的 sayhi 方法了。

小结

Nacos 提供了两个重要的功能:服务注册与发现和统一配置中心的功能,它提供了 3 种部署方式:单机部署、集群部署和多集群部署,以及两种安装方式:源码安装和安装包安装。我们使用的是 Docker 加 Nacos 源码的方式来安装和部署 Nacos 的。Nacos 服务注册和发现都需要添加 Nacos Service Discovery 框架的支持,且在配置文件中配置相应的 Nacos 信息,才可以正确的实现服务的注册和发现功能。

参考&鸣谢

《Nacos框架与原理》

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java中文社群

Java面试合集:gitee.com/mydb/interview

原文地址:https://www.cnblogs.com/vipstone/p/15867052.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Nacos 中的参数有很多,如:命名空间、分组名、服务名、保护阈值、服务路由类型、临时实例等,那这些参数都是什么意思?又该如何设置?接下来我们一起来盘它。 1.命名空间 在 Nacos 中通过命名空间(Namespace)+ 分组(Group)+服务名(Name)可以定位到一个唯一的服务实例。 命名
Nacos 支持两种 HTTP 服务请求,一个是 REST Template,另一个是 Feign Client。之前的文章咱们介绍过 Rest Template 的调用方式,主要是通过 Ribbon(负载均衡) + RestTemplate 实现 HTTP 服务调用的,请求的核心代码是这样的: @
Nacos 是 Spring Cloud Alibaba 中一个重要的组成部分,它提供了两个重要的功能:服务注册与发现和统一的配置中心功能。 服务注册与发现功能解决了微服务集群中,调用者和服务提供者连接管理和请求转发的功能,让程序的开发者无需过多的关注服务提供者的稳定性和健康程度以及调用地址,因为这
Spring Cloud Alibaba 是阿里巴巴提供的一站式微服务开发解决方案,目前已被 Spring Cloud 官方收录。而 Nacos 作为 Spring Cloud Alibaba 的核心组件之一,提供了两个非常重要的功能:服务注册中心(服务注册和发现)功能,和统一配置中心功能。 Nac
在 Nacos 的路由策略中有 3 个比较重要的内容:权重、保护阈值和就近访问。因为这 3 个内容都是彼此独立的,所以今天我们就单独拎出“保护阈值”来详细聊聊。 保护阈值 保护阈值(ProtectThreshold):为了防止因过多实例故障,导致所有流量全部流入剩余健康实例,继而造成流量压力将剩余健
前两天遇到了一个问题,Nacos 中的永久服务删除不了,折腾了一番,最后还是顺利解决了。以下是原因分析和解决方案,建议先收藏,以备不时之需。 临时实例和持久化实例是 Nacos 1.0.0 中新增了一个特性。临时实例和持久化实例最大的区别是健康检查的方式:临时实例使用客户端主动上报的健康检查模式,而
Spring Cloud Alibaba 技术体系中的 Nacos,提供了两个重要的功能:注册中心(服务注册与发现)功能和配置中心功能。 其中注册中心解决了微服务调用中,服务提供者和服务调用者的解耦,让程序开发者可以无需过多的关注服务提供者和调用者的运行细节,只需要通过 Nacos 的注册中心就可以
负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角 Ribbon 就属于后者——客户端负载均衡器。 服务端负载均衡器的问题是,它提供了更强的流量控制权,但无法满足不同的消费者希望使用不同负载均衡策略的需求,而使用不同负载均衡策略的场景确实是存在的,所以客
本篇文章为大家展示了如何解决Spring Cloud 服务冲突问题,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、背景...
本篇内容主要讲解“spring cloud服务的注册与发现怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“spri...
本篇内容介绍了“Dubbo怎么实现Spring Cloud服务治理 ”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处...
本篇内容主要讲解“SpringCloud相关面试题有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringCloud相...
如何分析Spring Cloud Ribbon、Spring Cloud Feign以及断路器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希
这篇文章主要讲解了“springcloud微服务的组成部分有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“s...
这篇文章主要讲解了“SpringCloud的OpenFeign项目怎么创建”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习...
本篇内容主要讲解“spring cloud oauth3整合JWT后获取用户信息不全怎么办”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带...
怎样解析微服务架构SpringCloud,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。...
这篇文章主要介绍spring cloud中API网关的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、服务网关简介1、外观模式客户端...
本篇内容介绍了“Spring Cloud微服务的相关问题有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处...
本文小编为大家详细介绍“spring cloud config整合gitlab如何搭建分布式的配置中心”,内容详细,步骤清晰,细节处理妥当,希望这篇“spring cloud config整合gi...