Nacos系列-Nacos服务注册与发现

news/2024/11/17 16:04:51/

服务注册与发现

  • 1.故事背景
  • 2.服务注册
    • 2.1服务注册原理
    • 2.2服务注册实现
  • 3服务发现
    • 3.1 服务发现原理
    • 3.2 服务发现实现
    • 3.3 @LoadBalanced注解
  • 总结提升

1.故事背景

上文我们讲到了Nacos的配置中心,介绍了什么是Nacos的配置中心,以及它的相关概念和使用方法。接下来我们来讲解Nacos的另外一个重要功能 服务注册与发现,本文将会从概念和实操两个方面,详细介绍如何使用Nacos的服务注册与发现

2.服务注册

在微服务架构中,服务提供者需要将自己的服务注册到服务注册中心,以便服务消费者能够发现并调用这些服务。Nacos作为服务注册中心,提供了服务注册的功能。

2.1服务注册原理

服务注册的原理如下:

  • 服务提供者启动时,将自己的服务实例信息(如服务名称、IP地址、端口号等)通过RESTful API方式发送给Nacos服务端。
  • Nacos服务端接收到服务提供者发送的注册请求后,将服务实例信息存储在注册中心的数据库中,同时将这些信息缓存到内存中,以便快速查询。
  • Nacos服务端将注册信息存储在两个地方:一个是持久化的存储(如MySQL、Derby等数据库),用于服务实例的持久化存储;另一个是内存中的缓存,用于快速的服务实例查询。
  • 注册成功后,服务提供者会定时向Nacos发送心跳请求,以表明自己的服务实例还在运行中。Nacos服务端根据心跳信息更新服务实例的状态,以便服务消费者能够获取到最新的服务实例信息。
  • 服务消费者通过Nacos服务端的RESTful API查询服务注册中心获取到最新的服务实例信息(如服务名称、IP地址、端口号等),从而能够调用服务提供者。

2.2服务注册实现

  1. 进入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.3.RELEASE</version>
</dependency>
  1. 配置Nacos地址,服务名,端口号
spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848 # Nacos服务器地址application:name: service-provider # 服务名
server:port: 8080 # 端口号
  1. 使用@EnableDiscoveryClient注解,在服务注册项目的启动类上使用@EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(ServiceProviderApplication.class, args);}
}

3服务发现

在微服务架构中,服务消费者需要从服务注册中心获取服务提供者的信息,以便能够调用相应的服务。Nacos作为服务注册中心,提供了服务发现的功能。

3.1 服务发现原理

服务发现的原理如下:

  • 服务消费者启动时,通过RESTful API方式向Nacos服务端发送服务发现请求,请求包括服务名称、版本号、环境等信息。
  • Nacos服务端接收到服务发现请求后,从注册中心的缓存或持久化存储中查询符合请求条件的服务实例信息,并返回给服务消费者。
  • 服务消费者根据返回的服务实例信息,选择一个合适的服务提供者进行调用。Nacos还提供了负载均衡策略,可以根据配置的负载均衡算法进行服务实例的选择。
  • 服务消费者在调用服务提供者时,可以直接使用服务实例的网络地址(如IP地址、端口号)进行调用,从而实现服务间的通信。

3.2 服务发现实现

  1. 引入依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.3.RELEASE</version>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId> <!-- 添加LoadBalancer的依赖 -->
</dependency>
  1. 配置nacos地址
spring:cloud:nacos:discovery:server-addr: 127.0.0.1:8848 # Nacos服务器地址
  1. 使用@LoadBalanced注解在服务发现项目的业务逻辑中,使用@LoadBalanced注解来实现负载均衡
@RestController
public class MyController {@Autowired@LoadBalanced // 使用@LoadBalanced注解private RestTemplate restTemplate; // 使用RestTemplate进行服务调用@GetMapping("/get")public String getServiceUrl() {String result = restTemplate.getForObject("http://service-provider/get", String.class); // 使用服务名进行调用return result;}
}

3.3 @LoadBalanced注解

这里我们详细讲一讲@LoadBalanced注解,此注解的主要作用如下:

  • 负载均衡:@LoadBalanced注解用于开启Ribbon负载均衡功能,使得客户端在进行服务调用时可以自动选择具体的服务提供者进行负载均衡调用。通过负载均衡,可以将请求均匀地分发到多个服务提供者上,从而实现对多个服务实例的负载均衡。
  • 客户端负载均衡策略:@LoadBalanced注解可以用于指定客户端负载均衡策略。例如,可以使用@LoadBalanced注解的value属性来指定使用的负载均衡策略,如@LoadBalanced(value = “myLoadBalancer”),其中"myLoadBalancer"为自定义的负载均衡策略的名称。
  • 服务名称作为请求地址:当使用@LoadBalanced注解时,可以将服务名称作为请求地址,而不是具体的服务URL。这样,Ribbon会根据服务名称自动选择具体的服务实例进行负载均衡调用。例如,可以将请求地址设置为"http://service-provider/service-name",其中"service-provider"为服务名称,Ribbon会自动根据服务名称选择具体的服务实例进行请求。
  • 它可以帮助我们简化服务消费者中的负载均衡调用代码,提高系统的可扩展性和可用性。

总结提升

通过本篇文章相信您已经对Nacos服务注册与发现有了一定的了解。通过使用Nacos的服务注册与发现功能,可以方便地管理和调用微服务,提高了微服务架构的稳定性、可靠性和灵活性。快去按照我的代码去进行尝试吧!!


http://www.ppmy.cn/news/46191.html

相关文章

动力节点Springsecurity笔记01-05认证入门

1 问题 如何保护我们的程序&#xff1f; 1.1 创建code目录 目的&#xff1a;后面的security工程均在此目录下学习 创建code目录&#xff0c;并使用idea打开 1.2 不使用安全框架的springboot web程序 1.2.1 新建子模块springboot-01-hello [外链图片转存失败,源站可能有防盗…

深入剖析 Qt QMultiMap :原理、应用与技巧

目录标题 引言QMultiMap 的基本用法接口的用途和实际应用场景综合示例展示QMultiMap的所有用法 迭代器&#xff1a;遍历 QMultiMap 中的元素&#xff08;Iterators: Traversing Elements in QMultiMap &#xff09;QMultiMap 的高级用法QMultiMap 的优点和局限性优点局限性 QMu…

一起读源码 —— Fastjson 的核心方法及其实现原理

源码介绍 Fastjson 是阿里巴巴开源的一个 Java 工具库&#xff0c;它常常被用来完成 Java 的对象与 JSON 格式的字符串的相互转化。 此文读的源码是撰写此文时 Fastjson 的最新的发布版本&#xff0c;即 1.2.83 下载源码 请前去 github 找到 release 最新版下载后解压&…

JUC源码系列-ReentrantLock独占锁的释放

前言 开始之前先提一句, JAVA的内置锁在退出临界区之后是会自动释放锁的, 但是ReentrantLock这样的显式锁是需要自己显式的释放的, 所以在加锁之后一定不要忘记在finally块中进行显式的锁释放: Lock lock new ReentrantLock(); ... lock.lock(); try {// 更新对象//捕获异常…

IOC容器——Bean

IOC容器——Bean Bean配置name别名属性Bean作用范围scopeBean的实例化构造方法示例化静态工厂实例化实例工厂与FactoryBean实例工厂FactoryBean bean的生命周期 Bean配置 name别名属性 Bean ID 唯一&#xff0c;而关于Spring别名&#xff0c;我们可以在配置文件中使用name来定…

《高等工程数学》各知识点解题思路梳理(基于AI模型)

《高等工程数学》各知识点解题思路梳理 **一、填空题****1.给定线性空间的一个基&#xff0c;求一给定向量在该基下的坐标****2. 给定欧氏空间的标准正交基&#xff0c;求一给定向量的长度****3.求给定矩阵的2-范数、无穷范数&#xff0c;1-范数****4.确定方阵幂级数收敛的条件…

COMSOL锂离子电池仿真技术与应用

背景&#xff1a; 随着各国燃油车禁售时间表的推出&#xff0c;新能源汽车的地位愈发稳固。而锂离子电池作为电动车的核心动力源&#xff0c;也越来越受到市场的追捧。锂离子电池在制作过程中涉及正极、电解液、负极、隔膜等材料的选取与匹配&#xff0c;极片设计参数的选择等…

Docker容器---网络、容器操作

Docker容器---网络、容器操作 一、docker实现原理二、docker网路模式1、Host模式2、container模式3、none模式4、bridge模式 三、自定义网络1、查看网络模式列表2、查看容器信息3、指定分配IP地址4、自定义网络固定IP 四、暴露端口五、容器端口映射1、创建端口映射 六、资源控制…