nacos注册中心


一、什么是注册中心

注册中心是微服务架构中的一个重要组件,用于服务的注册和发现
主要作用为
1.服务注册:服务实例启动时将自身信息注册到注册中心,包括服务名称、地址端口等
2.服务发现:消费者向注册中心查询服务,并获取服务实例信息来访问服务
3.服务健康检查: 注册中心定期检查服务实例监控状况,过滤不健康的实例
4.服务路由: 提供服务的路由与负载均衡功能
5.服务监控:统计服务调用次数,时长等,用于监控服务状态
6.服务更新:当服务实例信息变更时,向注册中心发送更新信息通知
通过注册中心,服务提供者和消费者只需和注册中心交互即可,从而实现服务的注册与发现,降低了服务间的耦合度。

二、注册中心的实践

1.交互流程

在这里插入图片描述
服务中心通常有两个角色
1.服务提供者(生产者):对外提供服务的微服务应用,它会把自己的服务地址注册到注册中心,以供消费者发现和调用
2.服务调用者(消费者):调用其它微服务的应用程序,他会向注册中心订阅自己需要的服务,并基于服务注册者的信息发起远程调用。

2.1 生产者实现

分为三步
1.添加对应的依赖
2.配置yml文件中nacos信息
3.提供调用接口

2.1.1

添加依赖

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

2.1.2

配置nacos信息

spring:
  application:
    name: nacos-discovery-abc # Nacos 服务名(很重要,命名不用使用“_”)
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        ephemeral: false # 设置此服务为永久实例
#        group: TEST_GROUP
server:
  port: 0 # 动态端口

这里使用动态端口 因为消费者调用时无需关注端口号 注册中心会自动处理

2.1.3 编写调用端口

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private ServletWebServerApplicationContext context;

    @RequestMapping("/getnamebyid")
    public String getNameById(Integer id) {
        return "provider-name-" + id +
                " | port:" + context.getWebServer().getPort();
    }

}

这里获取端口号用到了ServletWebServerApplicationContext的getWebServer().getPort()方法

2.1.4 测试

启动项目 当然我们也可以注册多个生产者 可以通过new一个模块的方式 也可以直接复制配置
在这里插入图片描述
全部启动
在这里插入图片描述

启动之后这里就会显示 这里有四个实例是因为我之前有一个实例停止了又重新启动 而这个实例是永久实例 因为是动态端口号重启之后的实例被看做一个新的 而之前的永久实例也不会消失 关于临时实例和永久实例下文会有说明

测试编写的方法是否可以调通
在这里插入图片描述
没有问题

2.2 消费者实现

注册中心消费者的实现比生产者要复杂一些,首先是消费者要调用生产者的HTTP接口,需要引入Spring Cloud OpenFeign进行HTTP调用,其次为了实现负载均衡,我们还需要添加客户端负载均衡器Spring Cloud LoadBalancer。
分为5步
1.添加依赖
2.配置nacos信息
3.开启Openfeign
4.编写Openfeign调用代码
5.通过Openfegin调用生产者

2.2.1. 添加依赖

总共添加三个依赖:Nacos注册中心、Openfeign和Spring Cloud LoadBalancer,.如下配置所示:

		<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

2.2.2. 配置nacos

spring:
  application:
    name: nacos-consumer-demo
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
        register-enabled: false # 消费者(不需要将此服务注册到nacos)
server:
  port: 8080

这里就使用的固定端口号 因为我们需要自己主动去访问

2.2.3.开启Openfeign

在启动类上加上注解

@SpringBootApplication
@EnableFeignClients // 开启 OpenFeign
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }

}

2.2.4.编写调用代码

@Service
@FeignClient("nacos-discovery-abc") // 表示调用 nacos 中的 nacos-discovery-abc 服务
public interface UserService {

    @RequestMapping("/user/getnamebyid") // 调用生产者的"/user/getnamebyid"接口
    public String getNameById(@RequestParam("id") int id);

}

这里的nacos-discovery-abc一定要和生产者的名字相同才能调用成功

2.2.5 通过Openfegin调用生产者

@RestController
public class BusinessController {

    @Autowired
    private UserService userService;

    @RequestMapping("/getnamebyid")
    public String getNameById(Integer id){
        return userService.getNameById(id);
    }

}

2.2.6 测试

通过在这里插入图片描述

通过本地的8080端口成功访问到了生产者提供的接口

3.参数说明

在这里插入图片描述
重要参数说明:
1.分组:注册服务所在的组名,默认是DEFAULT_GROUP,例如:研发小组,测试小组等。
2.保护阈值:健康节点要求的最小百分比。用于在服务出现不健康实例时,阻止流量过度向少量健康实例集中保护服务的整体可用性。保护阈值应设置为一个0到1之间的浮点数,默认值为0。当集群中的健康实例占比,小于设置的保护阈值时,就会触发阈值保护功能。触发保护阈值后,Ncos会将全部实例(健康实例+非健康实例)返回给调用者,虽然可能会损失一部分流量,但能保证集群中剩余的健康实例能正常工作。
3.服务路由类型:用于实现不同的路由需求,常见的路由类型有以下两种:
none:默认路由,基于权重的轮询负载均衡路由策略。
label:标签路由,相同标签的实例会被聚合为一个集群,不同标签则实现流量隔离。
4.临时实例:Ncos中的实例分为临时实例和永久实例(也叫持久实例),临时实例的生命周期和服务的运行周期相同,服务停止运行Ncos中就会将临时实例删除;而永久示例即时程序终止,也会保留在Nacos中。在配置文件中通过:spring.cloud.nacos.discovery.ephemeral==true设置。
5.权重:用于实现负载均衡,取值范围0到10000,数值越大,权重越大,负载均衡被分配的概率也就越高。设置为0的时候表示下线。

4.临时实例与永久实例

永久实例(persistent instance)和l临时实例(ephemeral instance)是注册中心的两种不同的服务类型。
1.永久实例(Persistent Instance)是指注册到Nacos的服务实例,其注册信息会一直保留在Nacos服务器上,直到主动注销或被删除。这意味着即使服务实例下线或不可用,它的注册信息仍然会保留在Ncos上,直到显式取消注册。永久实例适用于需要长期存在的服务,比如稳定部署的服务或长时间运行的后端服务。
2.临时实例(Ephemeral Instance)是指注册到Nacos的服务实例,其注册信息在实例下线或不可用时会自动被删除。如果服务实例下线、断开连接或主动注销,Ncos会自动从注册表中删除这些实例的信息。临时实例适用于临时性的服务实例,比如临时加入集群的短期任务或特定场景下的临时服务

5.监控监测机制

Ncos中的健康检测机制是用来检查服务健康状态的,只有健康的节点才会被服务消费端调用,这样才能保证程序稳定、正常的运行。
Nacos中提供了两种健康检测的机制:
1.客户端主动上报(健康状态的)机制。
2.服务器端反向探测(健康状态的)机制。
而Ncos中的两种服务实例分别对应了两种健康检查机制:
1.临时实例(也可以叫做非持久化实例):对应的是客户端主动上报机制。
2.永久实例(也可以叫做持久化实例):服务端反向深测机制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值