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

c3565f44c4b5c5499cc8345ac7ad0351.png

作者 | 磊哥

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

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

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

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

1.Nacos 简介

Nacos 是 Dynamic Naming and Configuration Service 的首字母简称;它是⼀个更易于构建云原生应用的动态服务发现、配置管理和服务管理的平台。4b6e0b55ed4e7b670162812d70415107.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 检查是否安装成功,如下图所示:1cd10c945431ee5b84cfa3b19744f758.png若显示具体的 Java 版本则表示安装成功。

3.2 下载 Nacos

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

yum -y install git

下载 Nacos 源码:

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

下载完成如下图所示:2b83ecf6a84b6ecbcdd611fbbe7bbeb1.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

启动成功如下图所示:e1d853de6ae05a93b5892945e8694d40.png

3.3 访问Nacos

启动成功之后,就可以使用 http://127.0.0.1:8848/nacos/#/login 来访问 Nacos 的管理控制台了,如下图所示:37dbc220c9505570dfa6f5260cd4e4ca.png用户名和密码都输入 nacos 就可以进入系统了,如下图所示:ecd221e473d7a88d1eab276c13b81786.png

3.4 常见报错问题

3.4.1 docker-compose 命令未找到

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

安装成功如下图所示:39bfad7137aeee2893cfbec9d1c7900e.png

3.4.2 image:invalid reference format

使用 docker-compose 可能会提示“ERROR: no such image: nacos/nacos-server:: invalid reference format”,无效的参数格式,如下图所示:74d4c3c97193353790547bf16d0d8efb.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 项目为基础创建的,具体操作步骤如下:7aa64eeae13bbb941a6cd397a3ace5ec.png创建项目使用阿里云的地址 http://start.aliyun.com 来创建 Spring Cloud Alibaba Nacos 项目,点击下一步 Next,如下图所示:90859e5151f4c13fb447ff09022f349d.png增加 Nacos Service Discovery 框架支持,如下图所示:3dd4904755445f80569cd70fdd3fc466.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 中的服务列表就可以看到此项目,如下图所示:dd0d0ab1b613538e90cd93ad19cbd17d.png经过以上操作,我们创建的 Spring Cloud Alibaba 的项目就被注册到 Nacos 中了,其他程序也可以通过 Nacos 对它进行调用了。

5.Spring Cloud Alibaba 服务发现

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

5.1 创建项目

8e61fd15dec54a4f6bba4a6f3db8ecad.png93ce6aa8f9858c5b910460b14e0e5582.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@Beanpublic 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 {@Autowiredprivate RestTemplate restTemplate;@RequestMapping("/hi")public String hi(String name) {// 调用生产者 sayhi 方法,并返回结果return restTemplate.getForObject("http://spring-cloud-nacos-producer/sayhi/" + name,String.class);}
}

添加完代码之后,运行程序,在 Nacos 的服务列表中可看到以下内容:3156a77bc780fe4f9214e7959a1aaee2.png之后访问消费者的 hi 方法,让其调用生产者的实现效果如下:

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

小结

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

参考&鸣谢

《Nacos框架与原理》

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

公众号:Java中文社群

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java类class cast()方法及示例

类class cast()方法 (Class class cast() method) cast() method is available in java.lang package. 在java.lang包中提供了cast()方法 。 cast() method casts this Object to the class or an interface denoted by this Class object. cast()方法将此Object强制转换为该Cl…

加分进了字节,MySQL真yyds!

Java研发工程师必备技能非MySQL莫属&#xff0c;虽说易学好上手&#xff0c;但应对大厂面试&#xff0c;最容易遭遇滑铁卢、功败垂成的也是它。上手简单&#xff0c;玩转难&#xff0c;才是这款开源数据库叱咤业界多年的真实写照。MySQL 8.0正式版的到来&#xff0c;在性能和速…

基于Fragment的百度地图框架的使用

博客:http://blog.csdn.net/developer_jiangqq (一)基本介绍(Fragment和SupportMapFragment): Fragment的使用现在安卓APP开发中用的比较多了&#xff0c;Fragment名称为碎片和Activity有着相似的生命管理周期&#xff0c;基本作用可以进行开发兼容手机和平板的app,较少兼容分辨…

Nacos服务注册与发现的2种实现方法!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;Spring Cloud Alibaba 技术体系中的 Nacos&#xff0c;提供了两个重要的功能&#xff1a;注册中心&#xff08;服务注册与发…

java settime_Java日历setTime()方法及示例

java settime日历类setTime()方法 (Calendar Class setTime() method) setTime() method is available in java.util package. setTime()方法在java.util包中可用。 setTime() method is used to sets time with the specified Date(d) of this Calendar. setTime()方法用于使用…

面试必备:Spring 面试 63 问!

作者 | 夏目blog.csdn.net/wuzhiwei549/article/details/122324261Sping原理Spring是一个轻量级Java开发框架&#xff0c;最早有Rod Johnson创建&#xff0c;目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的JavaSE/JavaEE full-stack&#xff0…

javafor循环打印图案_C程序使用循环打印盒子图案

javafor循环打印图案Input a number and print the following box pattern in C language, 输入数字并以C语言打印以下框形 &#xff0c; 4 4 4 4 4 4 44 3 3 3 3 3 4 4 3 2 2 2 3 4 4 3 2 1 2 3 4 4 3 2 2 2 3 4 4 3 3 3 3 3 4 4 4 4 4 4 4 4 Input format: 输入…

懒人专用SSH框架下的基本配置

项目结束&#xff0c;马上就要出去找工作了&#xff0c;这段时间也不用写项目&#xff0c;就整理了一些以后可能会用的到的配置&#xff0c;还有一个原因就是我不想去记忆。。。。。。。。。SSH下application.xml的基本配置&#xff0c;应该满足一般的开发需求<?xml versio…

为什么HashMap会产生死循环?

作者&#xff1a;磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;面试合集&#xff1a;https://gitee.com/mydb/interviewHashMap 死循环是一个比较常见、比较经典的问题&am…

iOS的自动化测试

2019独角兽企业重金招聘Python工程师标准>>> iOS的自动化测试:http://www.360doc.com/content/13/1225/22/1912775_340124906.shtml 转载于:https://my.oschina.net/CeShiXiaoSongShu/blog/496660

为什么阿里全面推动 K8S 落地,咬紧牙关也要搞云原生?

身为让容器应用实现大规模工业生产的一大功臣&#xff0c;过去几年&#xff0c;Kubernetes 势头迅猛&#xff0c;BAT、京东、美团、字节都走上了全域容器化部署以及云原生架构的康庄大道。而作为支撑阿里万亿级应用背后的核心&#xff0c;阿里云早在2016年就顺势搭上容器化这趟…

python字符串find_Python字符串| 带示例的find()方法

python字符串findString.find()方法 (String.find() Method) find() is an inbuilt method of python, it is used to check whether a sub-string exists in the string or not. If sub-string exists, the method returns the lowest index of the sub-string, if sub-string…

.sdp文件格式介绍

最近做RTSP流播放&#xff0c;需要了解.sdp这种会话描述的文件格式&#xff0c;当然&#xff0c;里面的具体语法有SDP解析器来分析。但是我需要大概了解一些字段的意思&#xff0c;它是文本描述的&#xff0c;采用key value的形式描述。 https://en.wikipedia.org/wiki/Session…

Spring Cloud Alibaba Nacos路由策略之保护阈值!

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在 Nacos 的路由策略中有 3 个比较重要的内容&#xff1a;权重、保护阈值和就近访问。因为这 3 个内容都是彼此独立的&#…

lambda python_Python | Lambda和filter()与示例

lambda pythonThe filter() function is used to filter the elements from given iterable collection based on applied function. filter()函数用于根据应用函数从给定的可迭代集合中过滤元素。 Example: 例&#xff1a; Given a list of integers and we have to filter …

浅谈 OneAPM 在 express 项目中的实践

【编者按】OneAPM 运营团队&#xff0c;近日在 github 上发现了一篇文章&#xff0c;特别奉献给大家。本文作者王宇先生从2015年年初就开始使用我们的产品&#xff0c;也是OneAPM 的忠实用户。 OneAPM 是一个优秀的性能监控平台。为什么我们要使用性能监控呢&#xff1f; 并不是…

【万字长文】Spring Cloud Alibaba 开箱即用!

互联网时代&#xff0c;面对复杂业务&#xff0c;讲究 分而治之。将一个大的单体系统拆分为若干个微服务&#xff0c;保证每个系统的职责单一&#xff0c;可以垂直深度扩展。但是一个个独立的微服务像一座座孤岛&#xff0c;如何将他们串联起来&#xff0c;才能发挥最大价值。这…

stl swap函数_C ++ STL | vector :: swap()函数与示例

stl swap函数C STL vector :: swap()函数 (C STL vector::swap() function) vector::swap() function is used to swap/exchange the content of two vectors with the same type, their sizes may differ. vector :: swap()函数用于交换/交换相同类型的两个向量的内容&#x…

HDFS DataNode 设计实现解析

前文分析了 NameNode&#xff0c;本文进一步解析 DataNode 的设计和实现要点。 文件存储 DataNode 正如其名是负责存储文件数据的节点。HDFS 中文件的存储方式是将文件按块&#xff08;block&#xff09;切分&#xff0c;默认一个 block 64MB&#xff08;该大小可配置&#xff…

芭比扣了!Nacos中服务删除不了,肿么办?

作者 | 磊哥来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;前两天遇到了一个问题&#xff0c;Nacos 中的永久服务删除不了&#xff0c;折腾了一番&#xff0c;最后还是顺利解决了。以下…