服务注册与发现:Nacos

news2024/12/25 15:07:00

为什么需要服务注册与发现

假设 mafeng-user 用户微服务部署了多个实例(组成集群模式),如下图所示:

会出现以下几个问题:

  • mafeng-order订单微服务发出Http远程调用时,该如何得知mafeng-user实例的IP和端口呢?
  • 在多个mafeng-user实例的情况下,mafeng-order该选择哪个实例进行调用呢?
  • mafeng-order如何得知mafeng-user实例状态是否健康?
微服务架构出现的以上问题, Spring Cloud 框架引入了 服务注册与发现 组件把这些问题很好地解决了!
Spring Cloud 框架里面,我们不止只有一种 服务注册与发现 组件,而是有四种比较常用的组件:
  • Eureka
  • Zookeeper
  • Consul
  • Nacos

Nacos简介

Nacos Alibaba 开发的是用于微服务管理的平台,其核心功能是服务注册与发现、集中配置管理。有了之前的一系列相关的技术的学习,Nacos 学习和使用起来就简单多了。
  • Nacos作为 服务注册发现 组件,可以替换Spring Cloud应用中传统的服务注册于发现组件,如:
  • EurekaZookeeperConsul等,支持服务的健康检查。
  • Nacos作为服务配置中心,可以替换ApolloSpring Cloud ConfigBus
官网: https://nacos.io/
当然, Nacos 作为一个微服务管理平台,除了面向 Spring Cloud ,还支持很多其他的微服务基础设施,
如: Docker Dubbo kubernetes 等。除了核心的服务注册与发现和配置管理功能,还提供了各种服
务管理的功能特性,如:动态 DNS 、服务元数据管理等。
所以当你的微服务架构为了维护众多的独立部署的基础组件而烦恼的时候, Nacos 可以在一定程度上解决你的烦恼。

搭建Nacos单机

WIndow方式启动

下载 nacos 压缩包
  • nacos-server-2.1.1.zip
解压进入 bin 目录执行
  • startup.cmd -m standalone
如下图效果,代表启动完成
浏览器访问
http://localhost:8848/nacos

账户密码默认为nacos

Docker方式启动

拉取nacos最新镜像

docker pull nacos/nacos-server:2.0.3

创建容器

docker run --env MODE=standalone --restart=always --name nacos -d -p 8848:8848 - p 9848:9848 -p 9849:9849 nacos/nacos-server:2.0.3

注意: Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口:98489849 Nacos官网 | Nacos 官方社区 | Nacos 下载 | Nacos

端口

与主端口的偏移

描述

9848

1000

客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求

9849

1001

服务端gRPC请求服务端端口,用于服务间同步等

访问:http://192.168.66.133:8848/nacos,同window

服务注册到Nacos单机

mafeng-usermafeng-order都需要注册到Nacos,步骤相同

导入nacos依赖

因为Nacos 属于 SpringCloudAlibaba 体系的组件,所以要单独锁定 spring - cloud - alibaba-

dependencies

在父工程锁定依赖版本:

<properties>
<springcloud.alibaba.version>2.2.9.RELEASE</springcloud.alibaba.version>
</properties>


<!-- nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${springcloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

以上配置加到dependencyManagement 里面

PS:关于SpringCloudAlibaba的与SpringCloud的版本关系说明:

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E 6%98%8E

在子工程再导入nacos依赖:

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

配置yml连接nacos

spring: 
    cloud:
        nacos:
            discovery:
                server-addr: 192.168.66.133:8848

注意:这里虽然8848端口,但会自动偏移+1000,真正连接的是gRPC端口:9848

重启服务,查看Nacos客户端

临时实例和持久实例

在服务注册时有一个属性ephemeral 用于描述当前实例在注册时是否以临时实例出现;

  • true则为临时实例(默认值);
  •  false则为持久实例;

临时实例

  • 默认情况,服务实例仅会注册在Nacos内存,不会持久化到Nacos磁盘,其健康检测机制为Client 模式,即Client主动向Server上报其健康状态(类似于推模式);
  • 默认心跳间隔为5秒,在15秒内Server未收到Client心跳,则会将其标记为不健康状态;在30秒内若收到了Client心跳,则重新恢复健康状态,否则该实例将从Server端内存清除。即对于不健康的实例,Server会自动清除;
  • Nacos的临时实例 选择采用AP模式 ,采用distro协议实现

持久实例

  • 服务实例不仅会注册到Nacos内存,同时也会被持久化到Nacos磁盘,其健康检测机制为Server 模式,即Server会主动去检测Client的健康状态(类似于拉模式);
  • 默认每20秒检测一次,健康检测失败后服务实例会被标记为不健康状态,但不会被清除,因为其是持久化在磁盘的,其对不健康持久实例的清除,需要专门进行;
  • Nacos的持久实例 选择采用CP模式 ,采用raft协议实现

应用场景

  • 临时实例:适合于存在突发流量暴增可能的互联网项目,可以实现弹性扩容,正常生产中的环境就 是这样;
  • 持久实例:用于保护阈值,比如说服务A100个实例,那么当有98个不可用时:
    • 如果是临时实例,则只会返回两个服务,那么大并发量请求这两个服务肯定会造成雪崩的, 造成整个服务不可用;
  • 如果是持久实例,实例会全部返回,虽然有98个不可用,消费者可能会请求失败,但不至于剩下的两个健康实例崩溃;

Nacos环境隔离

Nacos既是注册中心,又是数据中心。为了便于管理,Nacos提供了namespace来实现环境隔离功能。用于进行租户级别的隔离,我们最常用的就是不同环境比如测试环境,线上环境进行隔离。

  • nacos中可以有多个namespace
  • namespace下可以有group等。业务相关性比较强的可以放在一组,比如:支付和订单不同namespace之间相互隔离,即不同namespace的服务互相不可见

创建新的namespace

服务配置namespace

修改mafeng-usernamespace,加入devnamespace

spring: 
    cloud:
        nacos:
            discovery:
                server-addr: 192.168.66.133:8848 
                ephemeral: true
                namespace: fb99a686-aa07-4ed4-a574-684e1f889189

Nacos数据持久化

默认存储

默认采用内嵌式数据库 Derby 数据库,数据存放在 /nacos/data/derby-data 目录下:

Nacosnamespacegroup、持久实例信息等都会持久化写入Derby数据库。

切换为MySQL

做小型工程,用Derby数据库还行,但中大型应用更建议使用MySQL。我们尝试切换为MySQL

1、登录nacos容器:

docker exec -it nacos /bin/bash

2、修改conf/application.properties文件,在最后追加以下内容

SPRING_DATASOURCE_PLATFORM=mysql 
MYSQL_DATABASE_NUM=1 
MYSQL_SERVICE_HOST=192.168.66.133 
MYSQL_SERVICE_PORT=3306 
MYSQL_SERVICE_DB_NAME=nacos 
MYSQL_SERVICE_USER=root 
MYSQL_SERVICE_PASSWORD=root
 

3、在mysql导入nacos-mysql.sql 

4、重启nacos

docker restart nacos

搭建Nacos集群

Nacos集群架构

搭建集群

我们采用docker-compose搭建,过程轻松简单。

1、上传nacos-docker-master/root目录下

2、查看example/docker-compose.yml文件内容

version: "3.3"
services:
  nacos1:
    hostname: nacos1
    container_name: nacos1
    image: nacos/nacos-server:2.0.3
    volumes:
      - ./cluster-logs/nacos1:/home/nacos/logs
    ports:
      - "8861:8848"
      - "9861:9848"
      - "10555:9555"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql

  nacos2:
    hostname: nacos2
    image: nacos/nacos-server:2.0.3
    container_name: nacos2
    volumes:
      - ./cluster-logs/nacos2:/home/nacos/logs
    ports:
      - "8862:8848"
      - "9862:9848"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql

  nacos3:
    hostname: nacos3
    image: nacos/nacos-server:2.0.3
    container_name: nacos3
    volumes:
      - ./cluster-logs/nacos3:/home/nacos/logs
    ports:
      - "8863:8848"
      - "9863:9848"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql

  mysql:
    container_name: mysql8
    image: nacos/nacos-mysql:8.0.16
    env_file:
      - ../env/mysql.env
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3307:3306"


  nginx:
    image: nginx:latest
    restart: always
    ports:
      - "8801:80"
    volumes:
      - ../nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ../nginx/conf/conf.d:/etc/nginx/conf.d
      - ../nginx/log:/var/log/nginx
      - ../nginx/html:/usr/share/nginx/html
    container_name: "nginx"
    depends_on:
      - nacos1
      - nacos2
      - nacos3

3、查看nginx/conf/nginx.conf文件内容:

user  nginx;
worker_processes  auto;
 
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;
 
 
events {
    worker_connections  1024;
}
 
stream
{
    upstream nacos {
        server 192.168.66.133:9861;
        server 192.168.66.133:9862;
        server 192.168.66.133:9863;
    }
 
 
    server {
        listen  80;
        proxy_pass nacos;
    }
}

4、在example根目录下执行

docker-compose up -d

等待所有容器启动

5、访问集群

http://192.168.66.133:8861/nacos

服务注册到Nacos集群

mafeng-usermafeng-orderNacos连接地址改为:

spring: 
    cloud:
        nacos:
            discovery:
                server-addr: 192.168.66.133:7801 # 7801(程序端口)+1000(偏移量)=8801(Nginx端口)

各大注册中心产品的相同点

作为服务注册中心,核心的服务注册功能和发现功能都是一样的。

项目中我们可以统一使用Spring Cloud框架的DiscoveryClient 对象实现服务发现和远程调用, 具体使用哪个注册中心产品是透明的。

各大注册中心产品的核心区别

核心对比

Nacos(推荐使用)

Eureka

Consul

Zookeeper

一致性协议

CPAP

AP

CP

CP

版本迭代

迭代升级中

不再升级

迭代升级中

迭代升级中

SpringCloud集成

支持

支持

支持

支持

Dubbo集成

支持

不支持

不支持

支持

K8S集成

支持

不支持

支持

不支持

Eureka优先支持AP

Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和 查询服务。而Eureka的客户端在向某个Eureka注册或时如果发现连接失败,则会自动切换至其它节

点,只要有一台Eureka还在,就能保证注册服务可用(保证强可用性AP),只不过查到的信息可能不是最 新的(不保证强一致性CP)

Zookeeper优先支持CP

Zookeeper在选举leader时,会停止服务,直到选举成功之后才会再次对外提供服务,这个时候就说明 了服务不可用,但是在选举成功之后,因为一主多从的结构,zookeeper在这时还是一个高可用注册中 心,只是在优先保证一致性的前提下,zookeeper才会顾及到可用性

Consul优先支持CP

1、服务注册相比Eureka会稍慢一些。因为Consulraft协议要求必须过半数的节点都写入成功才认 为注册成功

2Leader挂掉时,重新选举期间整个consul不可用。保证了强一致性但牺牲了可用性。

Nacos同时支持APCP(推荐使用)

Nacos的临时实例 选择采用AP模式 ,采用distro协议实现

Nacos的持久实例 选择采用CP模式 ,采用raft协议实现

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

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

相关文章

【机器学习智能硬件开发全解】(五)—— 政安晨:嵌入式系统基本素养【总线、地址、指令集、微架构】

在智能硬件领域中&#xff0c;一个核心概念是嵌入式系统&#xff0c;整体结构可以分为以下几个主要组成部分&#xff1a; 控制器&#xff1a;控制器是嵌入式系统的核心&#xff0c;负责处理和执行系统中的各种任务和功能。它通常由中央处理器&#xff08;CPU&#xff09;和相关…

Android studio 性能调试

一、概述 Android studio 的Profiler可用来分析cpu和memory问题&#xff0c;下来进行说明介绍。 二、Android studio CPU调试 从开发模拟器或设备中启动应用程序&#xff1b; 在 Android Studio 中&#xff0c;通过选择View > Tool Windows > Profiler启动分析器。 应…

【NeurIPS】解决离线强化学习中的互模拟缺陷,FaceChain团队联合出品

一、论文 本文介绍被机器学习顶级国际会议NeurIPS 2023接收的论文 "Understanding and Addressing the Pitfalls of Bisimulation-based Representations in Offline Reinforcement Learning"&#xff0c;https://arxiv.org/abs/2310.17139 开源代码 https://gith…

【Python】进阶学习:计算一个人BMI(身体质量指数)指数

【Python】进阶学习&#xff1a;计算一个人BMI&#xff08;身体质量指数&#xff09;指数 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教…

android seekbar thumb 上添加进度值并居中

环境:android studio 、java 项目需要在进度条的滑块上显示进度值并居中, UI设计图: 代码实现效果图: 浅色模式: 深色模式: 由于一开始没有自定义seekbar, 使用源码Seekar, 滑块要求时带圆角,所以需要设置thumbOffset 使滑条和滑块衔接顺畅。想实现UI效果,需要对文…

Hadoop大数据应用:HDFS 集群节点缩容

目录 一、实验 1.环境 2.HDFS 集群节点缩容 二、问题 1.数据迁移有哪些状态 2.数据迁移失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;已部署&#xff09; SecondaryNameNode &#xff08;已部署…

为什么手机和电视ip地址不一样

在数字化时代&#xff0c;我们每天都会与各种电子设备打交道&#xff0c;其中最常见的就是手机和电视。当我们连接到互联网时&#xff0c;这些设备都会被分配一个独特的IP地址&#xff0c;用于在网络上进行标识和通信。然而&#xff0c;您可能已经注意到&#xff0c;即使手机和…

【linux线程(二)】线程互斥与线程同步

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux线程 1. 前言2. 多线程互…

pip 配置镜像加速安装

在使用pip安装Python第三方库时&#xff0c;默认是使用pip官网的非常慢&#xff0c;可通过配置国内镜像源加速下载速度&#xff0c;以下是如何使用国内镜像源安装Python库的两种常见方式&#xff1a; 临时使用镜像源安装 如果你只是想临时使用某个镜像源安装单个或几个库&…

让el-input与其他组件能够显示在同一行

让el-input与其他组件能够显示在同一行 说明&#xff1a;由于el-input标签使用会默认占满一行&#xff0c;所以在某些需要多个展示一行的时候不适用&#xff0c;因此需要能够跟其他组件显示在同一行。 效果&#xff1a; 1、el-input标签内使用css属性inline 111<el-inp…

Mac-自动操作 实现双击即可执行shell脚本

背景 在Mac上运行shell脚本&#xff0c;总是需要开启终端窗口执行&#xff0c;比较麻烦 方案 使用Mac上自带的“自动操作”程序&#xff0c;将shell脚本打包成可运行程序(.app后缀)&#xff0c;实现双击打开即可执行shell脚本 实现细节 找到Mac上 应用程序中的 自动操作&am…

1 redis7概述

Redis7 1 Redis简介 Redis之所以称之为字典服务&#xff0c; 是因为 Redis 是一个 key-value存储系统。 支持存储的 value类型很多&#xff0c; 包括 String(字符串)、List(链表)、Set(集合)、Zset(sorted set --有序集合)和 Hash&#xff08;哈希类型&#xff09;等。 Redis…

Flink通讯模型—Akka与Actor模型

Carl Hewitt 在1973年对Actor模型进行了如下定义&#xff1a;"Actor模型是一个把Actor作为并发计算的通用原语". Actor是异步驱动&#xff0c;可以并行和分布式部署及运行的最小颗粒。也就是说&#xff0c;它可以被分配&#xff0c;分布&#xff0c;调度到不同的CPU&…

2024.3.14 C++

思维导图 封装类 用其成员函数实现&#xff08;对该类的&#xff09;数学运算符的重载&#xff08;加法&#xff09;&#xff0c;并封装一个全局函数实现&#xff08;对该类的&#xff09;数学运算符的重载&#xff08;减法&#xff09;。 #include <iostream>using nam…

202012青少年软件编程(图形化) 等级考试试卷(二级)

青少年软件编程(图形化) 等级考试试卷(二级)2020年12月 第1题:【 单选题】 实现角色一直移动, 碰到舞台边缘发出声音, 正确的选项是?( ) A: B: C: D: 【正确答案】: B 【试题解析】 : 第2题:【 单选题】 执行下图所示的程序, 得到的结果是?( ) A:…

c++ 面试100个题目中的编程题目

88、下列程序的运行结果是? #include <stdlib.h> #include <stdio.h> #include <string.h> #include <iostream> const char* str = "vermeer"; using namespace std; int main(){ const char* pstr = str;cout << "The add…

SAT和SMT介绍及求解器使用

一、SAT 1、介绍 &#xff08;1&#xff09;定义 SAT即命题逻辑公式的可满足性问题/布尔可满足性问题。即给定一个与或非和变量组成的命题公式&#xff0c;判断是否存在一些结果使得这个公式成立 它是第一个被确认为NP完全的问题。 输入&#xff1a;析取范式&#xff08;C…

Linux 大页内存 Huge Pages 虚拟内存

Linux 大页内存 Huge Pages 虚拟内存 - 秋来叶黄 - 博客园 (cnblogs.com) Linux为什么要有大页内存&#xff1f;为什么DPDK必须要设置大页内存&#xff1f;这都是由系统架构决定的。一开始为了解决一个问题&#xff0c;设计了对应的方案&#xff0c;随着事物的发展&#xff0c…

【CesiumJS-5】绘制动态路线实现飞行航线、汽车轨迹、路径漫游等

实现效果 前言 Cesium中&#xff0c;动态路线绘制的核心是借助CZML格式&#xff0c;CZML是一种用来描述动态场景的JSON数组,可以用来描述点、线、多边形、体、模型及其他图元,同时定义它们是怎样随时间变化的&#xff1b; CZML主要做三件事&#xff1a; 1.添加模型信息 2.添加…

Hadoop大数据应用:Yarn 节点实现扩容与缩容

目录 一、实验 1.环境 2.Yarn 节点扩容 3.Yarn 节点缩容 二、问题 1.yarn启动服务报错 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;已部署&#xff09; SecondaryNameNode &#xff08;已部署&…