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

df83a5c00ca5bef9126bbef416d6a798.png

作者 | 磊哥

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

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

Spring Cloud Alibaba 技术体系中的 Nacos,提供了两个重要的功能:注册中心(服务注册与发现)功能和配置中心功能。

其中注册中心解决了微服务调用中,服务提供者和服务调用者的解耦,让程序开发者可以无需过多的关注服务提供者和调用者的运行细节,只需要通过 Nacos 的注册中心就可以实现两者的互联互通,相当于实现了远程服务本地化,并且提供了健康检查等机制。

而 Nacos 注册中心又提供了两种服务注册和发现的方法:OpenAPI 方法和(Nacos)SDK 方法。

所谓的 OpenAPI 是指通过 Nacos 提供的开放 API 地址实现服务的注册与发现;而 SDK 方法是通过 Nacos 提供的 SDK 框架,也就是使用 spring-cloud-starter-alibaba-nacos-discovery 框架来实现服务注册与发现的功能。

1.服务注册

1.1 服务注册:OpenAPI模式

OpenAPI 的使用方式相对来说比较简单,首先打开系统的命令行,在系统命令行中使用以下命令实现服务注册:

curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=spring-cloud-nacos-producer&ip=192.168.76.224&port=8081'

以上命令的执行结果如下图所示:3bd2ea0ce288c82d2b7ecb509a22de6d.png当返回“ok”结果时,表示服务注册成功,其中:

  • serviceName:表示服务名。

  • ip:表示客户端程序的 IP 地址。

  • port:表示客户端程序的端口号。

与此同时我们打开 Nacos 管理后台也可以看到我们注册的服务,如下图所示:f116eb9ca99e8459be43d0a55a944952.png点击服务详情,可以看到我们注册的 IP 地址和端口,如下图所示:cfb4f741c3f1ba82f25aeca450038735.png

1.2 服务注册:SDK模式

SDK 模式需要先创建一个 Spring Cloud 项目,项目创建方法请参考:https://mp.weixin.qq.com/s/c4EHDWAlTXKr3Xl17biglA,项目创建成功之后添加 Nacos 的 SDK 框架支持,最后再配置 Nacos 的相关信息即可,具体实现如下。

1.2.1 添加 SDK

在 pom.xml 中添加 Nacos SDK 框架支持,具体配置如下:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

1.2.2 Nacos 配置

SDK 框架添加完成之后,需要在项目的配置文件中添加相应的配置,具体配置内容如下:

# 应用名称
spring.application.name=spring-cloud-nacos-producer
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

设置完以上配置之后,启动当前项目,程序会自己自动注册到 Nacos 服务端。

2.服务发现

服务被正确注册到 Nacos 之后,就可以通过服务发现正常的调用服务提供者暴露的方法了,它的实现方法依然有以下两种。

2.1 服务发现:OpenAPI模式

在系统命令行中使用以下命令实现服务发现:

curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'

执行结果如下所示:6bbb1ebc60c69bdc1a4c734964cda426.png以上内容 JSON 格式化之后的信息如下:

{"name": "DEFAULT_GROUP@@spring-cloud-nacos-producer","groupName": "DEFAULT_GROUP","clusters": "","cacheMillis": 10000,"hosts": [{"instanceId": "192.168.76.224#8081#DEFAULT#DEFAULT_GROUP@@spring-cloud-nacos-producer","ip": "192.168.76.224","port": 8081,"weight": 1,"healthy": true,"enabled": true,"ephemeral": true,"clusterName": "DEFAULT","serviceName": "DEFAULT_GROUP@@spring-cloud-nacos-producer","metadata": {"preserved.register.source": "SPRING_CLOUD"},"instanceHeartBeatInterval": 5000,"instanceHeartBeatTimeOut": 15000,"ipDeleteTimeout": 30000}],"lastRefTime": 1644210068852,"checksum": "","allIPs": false,"reachProtectionThreshold": false,"valid": true
}

其中:

  • healthy:表示是否开启健康检测功能,也就是定期的将自己的健康状态报告给 Nacos 服务器端。

  • ephemeral:表示是否为临时实例,临时实例下线一段时间之后,会被 Nacos 直接剔除。

  • “"instanceHeartBeatInterval": 5000”:表示每 5s 执行一次健康检测。

  • “"instanceHeartBeatTimeOut": 15000”:表示如果超过 15s 没有收到(客户端)心跳包,就将此实例设置为非健康状态。

  • “"ipDeleteTimeout": 30000”:表示如果超过 30s 没有收到心跳包就剔除临时实例。

2.2 服务发现:SDK模式

与 SDK 实现服务注册的步骤类似,服务发现也是先要创建 Spring Cloud 项目,然后添加 Nacos SDK 框架,再配置 Nacos 相关信息,最后编写代码来调用服务提供者提供的方法。

2.2.1 添加 SDK

在项目的 pom.xml 文件中,添加 Nacos SDK 框架支持,具体内容如下:

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.2.2 配置 Nacos

在项目的配置文件中添加如下 Nacos 的相关配置:

# 应用名称
spring.application.name=springcloud-nacos-consumer
# Nacos认证信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
# 注册到 nacos 的指定 namespace,默认为 public
spring.cloud.nacos.discovery.namespace=public

2.2.3 调用服务提供者

最后一步在项目中使用 RestTemplate 对象,实现调用服务提供者暴露的方法。首先我们需要一个 RestTemplate 对象,具体实现代码如下:

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();}
}

有了 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);}
}

其中“http://spring-cloud-nacos-producer/sayhi/xxx”中的“spring-cloud-nacos-producer”为 Nacos 的服务名,“/sayhi/xxx”为服务提供者提供的方法访问地址。从这里可以看出,在服务调用者这里无需知道服务提供者的具体地址,只需要调用 Nacos 提供的服务名就可以了,这样就实现了服务提供者和调用者的(请求地址)解耦了。

小结

Nacos 注册中心提供了两种服务注册与发现的方法:OpenAPI 方式和 SDK 方式,其中比较常用的是 SDK 的实现方式,也就是在项目中添加 Nacos 的 SDK,再配置好 Nacos 的相关配置就可以实现服务的自动注册和调用了。

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

公众号:Java中文社群

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

2b7b199e1b775b65171acd5c8d796ccc.gif

往期推荐

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

2022-02-07

5a0604e7fd27d7b372cbdd970da26d46.png

Spring Boot Admin,贼好使!

2022-01-14

3b49303df1f9608d0f0a12b87eefeab0.png

Spring Boot Admin 报警提醒和登录验证功能实现!

2022-01-26

7398114556e31829c2a0e9a82ad2e30a.png

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

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

相关文章

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;最后还是顺利解决了。以下…

scala 空列表_如何在Scala中展平列表列表?

scala 空列表Flattening of List is converting a list of multiple List into a single List. To flatten List of List in Scala we will use the flatten method. 扁平化列表是将多个列表的列表转换为单个列表。 为了在Scala中扁平化List列表&#xff0c;我们将使用flatten方…

Spring Cloud OpenFeign夺命连环9问,这谁受得了?

1、前言前面介绍了Spring Cloud 中的灵魂摆渡者Nacos&#xff0c;和它的前辈们相比不仅仅功能强大&#xff0c;而且部署非常简单。今天介绍一款服务调用的组件&#xff1a;OpenFeign&#xff0c;同样是一款超越先辈&#xff08;Ribbon、Feign&#xff09;的狠角色。文章目录如下…

Automation Test in Maya Plugin Development

现状和问题- 开发插件的功能A的时候随手建立场景, 测试插件的功能A. 测试通过后,测试场景就被丢掉.- 发现插件的功能A有bug时, 修改代码, 然后随手建立场景, 测试bug. 测试通过后,测试场景就被丢掉.- 添加功能B, 测试功能B通过后, 在使用的时候发现之前的功能A却产生了bug, 应该…

scala集合中添加元素_如何在Scala中将元素添加到列表中?

scala集合中添加元素In Scala, lists are immutable data structures in which adding new elements is not allowed. So, here we will solve this problem that is generally done in functional programming paradigms. 在Scala中&#xff0c;列表是不可变的数据结构&#…