【springCloudAlibaba-学习笔记】-01-Nacos服务注册与发现

文章来源原创   作者:临窗旋墨   发布时间:2023-12-04   阅读:732   标签:spring-cloud-alibaba,学习笔记 分类:spring cloud alibaba 专题:学习记录

001-Nacos服务注册与发现

常见:zk、eureka、consul、nacos。

Nacos 快速开始

https://www.bilibili.com/video/BV1VW4y1o7n5/?p=15

  • nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

  • 云原生应用简单来说就是SaaS(软件即服务),就是跑在laaS(基础设施即服务)、PaaS(平台即服务)上的SaaS。

  • 云与安生 = 微服务+ DevOps + cd + 容器化。

016-Nacos系统架构解析

版本对应

  • springcloud alibaba 2022.0.0.0.0 对应nacos2.2.1

nacos安装参照官网。

添加依赖:https://spring.io/projects/spring-cloud-alibaba

  1. <dependencyManagement>
  2. <dependencies>
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-dependencies</artifactId>
  6. <version>2022.0.0</version>
  7. <type>pom</type>
  8. <scope>import</scope>
  9. </dependency>
  10. <dependency>
  11. <groupId>com.alibaba.cloud</groupId>
  12. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  13. <version>2022.0.0.0</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. </dependencies>
  18. </dependencyManagement>

019-将consumer注册到nacos_哔哩哔哩_bilibili

  1. <!--nacos discovery-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-loadbalancer</artifactId>
  9. </dependency>
  1. /**
  2. * 以负载均衡的方式调用 新版不在支持ribbon的负载均衡 ,所以需要加入spring-cloud-starter-loadbalancer 依赖
  3. */
  4. @LoadBalanced
  5. @Bean
  6. public RestTemplate restTemplate(){
  7. return new RestTemplate();
  8. }

代码获取nacos注册表信息

  1. //获取所有服务名称
  2. List<String> services = discoveryClient.getServices();
  3. System.out.println("into discovery, services size = " + services.size() + "" );
  4. for (String service : services) {
  5. //获取指定服务的实例
  6. List<ServiceInstance> instances = discoveryClient.getInstances(service);
  7. for (ServiceInstance instance : instances) {
  8. Map<String, Object> map = new HashMap<>();
  9. map.put("instanceId", instance.getInstanceId());
  10. map.put("serviceId", instance.getServiceId());
  11. map.put("host", instance.getHost());
  12. map.put("port", instance.getPort());
  13. map.put("uri", instance.getUri());
  14. System.out.println(map);
  15. }
  16. }

注册表缓存

  • 服务启动后,当发生调用时,会自动从ancos注册中心下载并缓存注册表到本地。

  • 所以,当nacos宕机,消费者仍然可以调用到提供者。

  • 只不过此时不再能进行服务注册了,缓存的注册列表信息也无法更新。4

临时实例与持久实例

区别

  • 临时实例:默认情况下,服务实例只会注册在nacos内存,不会持久化到nacos磁盘。其健康监测机制为client模式,即client主动向server上报其健康状态。在30s内若收到client心跳,则重新恢复健康状态。否则该实例将从server端内存清除。
  • 持久实例:服务实例不仅会注册到nacos内存,同时会持久化到nacos磁盘,其健康监测机制会server模式,即server会主动监测client的健康状态。默认每20s监测一次,健康监测失败后服务实例会被标记为“不健康”状态,但不会清除,因为其是持久化在磁盘的。

一旦注册为临时实例,就不能出则为持久实例,除非把磁盘上的删除或改名,默认在用户目录下的/naming/public/

  1. # ephemeral default is true
  2. spring.cloud.nacos.discovery.ephemeral=false

注销实例接口Open API 指南 (nacos.io)

  1. curl -X DELETE '127.0.0.1:8848/nacos/v1/ns/instance?serviceName=depart-consumer&ip=192.168.140.121&port=8080&username=nacos&password=nacos12345678'

数据持久化到mysql

  1. CREATE DATABASE nacos_config DEFAULT CHARSET utf8;
  2. -- GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'localhost' IDENTIFIED BY '12345678';
  3. -- mysql8
  4. CREATE USER 'nacos'@'localhost' IDENTIFIED BY '12345678';
  5. GRANT ALL PRIVILEGES ON nacos_config.* TO 'nacos'@'localhost' WITH GRANT OPTION;
  6. FLUSH PRIVILEGES;
  • mysql-schema.sql
  1. spring.sql.init.platform=mysql
  2. ### Count of DB:
  3. db.num=1
  4. ### Connect URL of DB:
  5. db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
  6. db.user.0=nacos
  7. db.password.0=12345678

nacos 集群搭建与CAP

集群部署说明 (nacos.io)

  1. cluster.conf 下配置nacos集群ip列表:端口不可连续;然后分别以集群模式启动
  1. 192.168.140.121:8849
  2. 192.168.140.121:8851
  3. 192.168.140.121:8853
  1. springcloud连接(可以修改为nginx代理)

spring.cloud.nacos.discovery.server-addr=localhost:8849,localhost:8851,localhost:8853

报错:The Raft Group [naming_instance_metadata] did not find the Leader node;

解决方案
Nacos 采用 raft 算法来计算 Leader,并且会记录上次启动的集群地址,所以当我们自己的服务器 IP 改变时(网络环境不稳定,如WIFI, IP 地址也经常变化),导致 raft 记录的集群地址失效,导致选 Leader 出现问题,方法:删除 Nacos 根目录下 data 文件夹下的 protocol 文件夹即可。

原因:有小伙伴,部署的nacos包,是本机运行过的,直接扔到服务器了(带着data目录),所以ip 与服务器ip不一致,导致了以上问题。

nacos的CAP模式

  • 默认情况下nacos discovery集群的数据一致性采用的是AP模式,但也支持CP模式。
  • 若需要转换为CP模式,需要提交put请求完成

nacos中的数据模型

Nacos 架构

  • Nacos中的服务是由三元组唯一确定的:namespace、group和服务名称service。
  • namespace与group的作用是ixiangtong,用于划分不同的区域范围,隔离服务。不同的是,namespace的范围更大,不同的namespace中可以包含相同的group,不同的group中可以包含相同的service。

  • Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP

  • NameSpace >> group >> service/DataId

命名空间是需要创建的。

服务隔离

只能消费同namespace下的同group内的服务


发表评论

目录