首页 > 编程学习 > 02-Nacos的服务注册与发现

02-Nacos的服务注册与发现

发布时间:2022/11/6 17:38:03

Nacos 融合 Spring Cloud可以成为注册配置中心。

  1. 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-discovery 实现服务的注册与发现
  2. 通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config实现配置的动态变更

这篇文章中将介绍第1点,Nacos的服务注册与发现。

Nacos的服务领域模型
在这里插入图片描述

一,准备两个springboot的项目nacos3001和nacos3002;

  这两个项目将会注册到Nacos中,然后利用Nacos的服务注册与发现实现FeginClien的远程过程调用;即3001服务通过fegin掉3002服务;

二, 在3001和3002的工程中引入nacos-discovery服务注册与发现的依赖;

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

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-openfeign</artifactId>
	<version>2.2.9.RELEASE</version>
</dependency>

注意:这里的依赖包版本有使用的Nacos Server是2.1版本的,你可以参照版本说明#组件版本关系来选择相关版本;

三,配置bootstrap.properties文件

  Nacos需要使用bootstrap的文件来进行Nacos Server的地址的相关配置。这是因为nacos的配置的需要优先级更高的bootstrap来进行文件配置的读取。

server.port = 3001
spring.application.name = nacos3001

#服务发现
#单机Nacos: 这里就只需要配置一个地址
#集群Nacos: 这里有几台nacos就配置几个地址,每个地址之间用逗号分割
spring.cloud.nacos.discovery.server-addr = 127.0.0.1:7480,127.0.0.1:7484,127.0.0.1:7488

由于在上节中配置了nacos的集群我这里就配置集群地址,地址之前逗号分割;3001和3002服务除端口配置一样;

四,添加@EnableDiscoveryClient注解;

  通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能;
在这里插入图片描述

五,业务代码编写

3001服务测试代码;

@RestController
public class NacosController {

    @Autowired
    private INacos3002ClientService nacos3002ClientService;

    @GetMapping("/get/name")
    public String getServiceName(){
        return nacos3002ClientService.getServiceName();
    }

}
@FeignClient(name = "nacos3002")
public interface INacos3002ClientService {

    @RequestMapping("/inner/get/service_name")
    String getServiceName();

}

3002服务测试代码(被调用)

@RestController
public class NacosController {

    @RequestMapping("/inner/get/service_name")
    String getServiceName(){
        return "我是Nacos 3002 服务";
    }

}

六,启动3001和3002服务

在这里插入图片描述

七,浏览器访问3001的接口返回3002的数据

在这里插入图片描述

八,Nacos实现集群服务的负载均衡

  3001服务还是作为服务消费者,3002代码一样,只是会通过设置jvm参数的方式设置两个不同的端口启动,分别是3002和3003。
在这里插入图片描述
在这里插入图片描述

当然集群服务部署在不同的机器,每台机器由于配置的不同会导致服务处理请求的效率不同,所以nacos提供了对不同机器服务下权重的设置,如下图。
在这里插入图片描述
注意这里你设置了权重但是你可能发现,访问其他服务还是走的默认的轮训策略,(如果你这里引入了restTemaple的@LoadBalanced会走ribbon的负载均衡策略)也就是说你设置的权重并没有生效。那么还需要在3001服务加上如下配置;

@Component
public class MyNacosRule {
    @Bean
    public IRule ribbonRule(){
        return new NacosRule();
    }
}

九,集群的就近访问原则

在这里插入图片描述
这里服务注册上来如果没有指定集群那么就会是默认的default集群。这里可用通过在bootstrap.properties配置文件里面指定;如下;

spring.cloud.nacos.discovery.cluster-name = xxxx

我这里就通过jvm启动参数的方式来给3002和3003服务指定集群;
在这里插入图片描述
通过测试发现,请求的流量都会走到3002这端口的服务上面来,因为3001和3002服务的集群是一样的

十,临时实例与持久化实例

  默认情况下,注册给nacos的实例默认是临时的,临时的实例表示会通过客户端与服务端之间的心跳保活,默认5秒发送一次心跳来探活。在服务端,如果超过15秒没有收到客户端的心跳,那么就会将该实例标记为不健康状态。

默认true 临时实例,服务下线后就会将数据删除
spring.cloud.nacos.discovery.ephemeral=false

在这里插入图片描述

十一,服务的阈值保护

  在使用过程中,我们可以设置0-1的一个比例,表示如果服务的所有实例中,健康实例的比重低于这个比重就会触发保护,一旦触发保护,在服务消费端侧就会把所有实例拉取下来,不管是否健康,这样就起到了保护的作用,因为正常来说消费端只会拿到健康实例,但是如果健康实例占总实例比例比较小了,那么就会导致所有流量都会压到健康实例上,这样仅剩的几个健康实例也会被压垮,所以只要触发了保护,消费端就会拉取到所有实例,这样部分消费端仍然会访问到不健康的实例从而请求失败,但是也有一部分请求能访问到健康实例,达到保护的作用。

注意:阈值保护的触发需要先开启 持久化实例
在这里插入图片描述

========》》》》》下节将介绍Nacos的动态配置😁😁😁😁😁😁😁😁😁

Copyright © 2010-2022 dgrt.cn 版权所有 |关于我们| 联系方式