SpringCloud(21)之SpringCloud Alibaba Nacos实战应用

一、Nacos安装

1.1 Nacos概述

        Nacos是Alibaba微服务生态组件中的重要组件之一,主要用它实现应用的动态服务发现、配置管理、 服务管理。Nacos discovery · alibaba/spring-cloud-alibaba Wiki · GitHub

        Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

        Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

        Nacos 支持几乎所有主流类型的服务的发现、配置和管理:

1.Kubernetes Service

2.gRPC & Dubbo RPC Service

3.Spring Cloud RESTful Service

        Nacos 的关键特性包括:

  • 服务发现和服务健康监测

        Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生SDK、OpenAPI、或一个独立的Agent TODO注册 Service 后,服务消费者可以使用DNS TODO 或HTTP&API查找和发现服务。

        Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。

  • 动态配置服务

        动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。

        动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

        Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

  • 动态 DNS 服务

        动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

  • 服务及其元数据管理

        Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

1.2 Nacos地图

     

  • 特性大图:要从功能特性,非功能特性,全面介绍我们要解的问题域的特性诉求;
  • 架构大图:通过清晰架构,让您快速进入 Nacos 世界;
  • 业务大图:利用当前特性可以支持的业务场景,及其最佳实践;
  • 生态大图:系统梳理 Nacos 和主流技术生态的关系;
  • 优势大图:展示 Nacos 核心竞争力;
  • 战略大图:要从战略到战术层面讲 Nacos 的宏观优势;

1.3 Nacos生态图   

1.4 Nacos安装

        关于Nacos安装,可以直接参考官网安装 Nacos 快速开始 ,我们接下来 学习基于Docker实现Nacos单机安装和基于Docker实现Nacos集群安装。

        采用Docker-Compose安装Nacos要更方便,所以大家可以先学习一下Docker-Compose

1.4.1 Nacos安装

        nacos安装模式有很多种:

单机模式 Derby:这种模式是极简模式,数据没法持久化存储,适合开发环境。

单机模式 MySQL:(支持MySQL5.7MySQL5.8,我们这里学习MySQL5.7安装模式,因为当前主流还是 MySQL5.7),这种模式支持数据持久化,数据会存储到MySQL中,适合生产环境。

集群模式:这种模式适合生产环境并且服务节点个数较多,不存在单点故障问题。

         安装如下:

#克隆项目
git clone https://github.com/nacos-group/nacos-docker.git

#进入nacos-docker目录
cd nacos-docker


#查看文件列表
cd  example
ll

        文件列表如下:

1.4.1.1 Nacos Derby安装

        安装Nacos生产环境会结合prometheusgrafana实现对Nacos的监控,我们这里不做它们的监控操作,需要将docker-compose的配置注释掉,修改 example/standalone-derby.yaml 配置如下:

         安装命令如下:

docker-compose -f example/standalone-derby.yaml up

       安装完成后,我们可以直接访问它的控制台 http://localhost:8848/nacos ,账号密码都是 nacos ,效果如下:  

1.4.1.2docker 安装nacos

        我们也可以直接采用Docker的方式安装Nacos,这样安装不要克隆项目也不需要修改配置文件,会更方 便,安装命令如下:

        clone项目:

git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker

         运行命令如下:

docker run -d \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.211.145 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-p 8848:8848 \
--restart=always \
--name nacos nacos/nacos-server

             访问 http://localhost:8848/nacos/#/login 效果如下:

二、Nacos功能应用

        2.1 Nacos服务注册与发现

        服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所 有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。Nacos Discovery Starter 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息-例如 host port,健康检 URL,主页等-注册到 Nacos 

        接下来我们学习一下如何使用Nacos作为服务的注册中心,并实现服务注册和服务发现。当前项目开发 主流技术是SpringBoot,我们就讲解基于SpringBoot如何使用Nacos实现服务注册与发现。         

         如上图,我们以打车项目为例,当用户打车成功的时候,会调用 hailtaxi-order hailtaxi-order 会下订单,同时修改司机状态,修改状态需要调用 hailtaxi-driver ,我们把 hailtaxi-order 服务 和 hailtaxi-driver 服务都注册到Nacos中,并实现服务调用,如果整个调用都没有问题,就说明服务 注册发现没问题。

        关于SpringCloud AlibabaSpringBoot的版本,我们可以通过以下链接查 看。https://start.spring.io/actuator/infoicon-default.png?t=N7T8https://start.spring.io/actuator/info        

bootstrap.yml  bootstrap.properties  )用来在程序引导时执行,应用于更加早期配置信息读 取,如可以使用来配置 application.yml 中使用到参数等。

application.yml  application.properties) 应用程序特有配置信息,可以用来配置后续各个模 块中需使用的公共参数等。

bootstrap.yml 先于 application.yml 加载。

         项目中如果使用Nacos,需要使用 bootstrap.yml ,因此我们需要将项目中的 application.yml换成  bootstrap.yml 

        我们修改 hailtaxi-driver  application.yml 改名为 bootstrap.yml ,注释掉consul,并且添加 如下配置:

server:
  port: 18081
#Nacos配置
spring:
  profiles:
    active: dev
  application:
    name: hailtaxi-driver
  cloud:
    nacos:
      discovery:
        #Nacos服务地址
        server-addr: 192.168.211.145:8848
      config:
        #Nacos服务地址
        server-addr: 192.168.211.145:8848

         相同,另外一个项目也加上面的配置,此时我们运行2个项目,可以发现在Nacos中已经注册了相关服务,如下图:

         此时用Postman访问打车下单,效果如下:

        发现服务正常调用没有问题,说明nacos正常注册。

2.2 负载均衡

         ​​​​​

        

如上图,如果此时用户打车成功,会调用订单服务,订单服务会修改司机状态,此时会调用

hailtaxi- driver,如果是生产环境,每个节点一定是集群状态,比如有2 hailtaxi-driver节点,此时如何  实现负载均衡?

 

      我们可以发现服务注册到Nacos中,有一个权重属性,这个权重属性就是Nacos的负载均衡机制,此时 需要用到Nacos的负载均衡策略 NacosRule  ,我们可以在程序中先初始化负载均衡算法,再到bootstrap.yml中配置权重。

    /***
     * Nacos负载均衡算法
     * @return
     */
    @Bean
    @Scope(value="prototype")
    public IRule loadBalanceRule(){
        return new NacosRule();
    }

        然后再在配置文件中指定每个启动实例的权重,便可以实现根据权重不同的负载均衡。

 2.3 配置中心

        2.3.1 配置管理

   我们可以在Nacos控制台配置项目的配置数据,先打开Nacos控制台,在命名空间 新建命名空  ,如下图:

        在配置管理中添加配置文件:

         再将项目中的配置内容拷贝到如下表单中,比如我们可以把 hailtaxi-driver原来在apollo中的配置填 写到下面表单中,如下图:

        需要注意的是,DATA ID和服务名保持一致,作为程序默认加载配置。

         项目中需要先引入依赖包,我们以 hailtaxi-driver 为例,在 pom.xml 中引入如下依赖:

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

         配置文件中添加配置中心地址,在 hailtaxi-driver bootstrap.yml 中添加如下配置:

         上图配置和属性说明如下:

         我们启动 hailtaxi-driver 服务,默认加载 ${spring.application.name}.${file-extension:properties} 配置,加载完成后,配置数据会生效,并访问 http://localhost:18081/driver/info/1 测试,效果如下:

         如果此时配置文件名字如果和当前服务名字不一致,可以使用 name 属性来指定配置文件名字:

2.3.2 多环境切换 

        spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 

${spring.application.name}.${file-extension:properties} 为前缀的基础配置,还加载了dataid ${spring.application.name}- ${profile}.${file-extension:properties} 基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的${spring.profiles.active} 这个配置项来配置。

        比如开发环境我们可以在nacos中创建 hailtaxi-driver-dev.yaml ,测试环境可以在配置中创建  hailtaxi-driver-test.yaml  ,创建如下:

        hailtaxi-driver-test.yaml 

         hailtaxi-driver-dev.yaml

        修改 hailtaxi-driver bootstrap.yml 配置文件,如下:

         测试 http://localhost:18081/trip/message 效果如下:

         active 换成test,效果如下:

2.3.3 共享配置

        在实际的业务场景中应用和共享配置间的关系可能, Spring Cloud Alibaba Nacos Config 从 0.2.1版本后,可支持自定义 Data Id 的配置,通过它可以解决配置共享问题。

        我们可以先创建一个配置 datasource.yaml 用于配置数据库连接,如下图:

         我们把之前的 hailtaxi-driver-dev.yaml 中的数据库连接池删掉,只保留IP,如下图:

      程序中我们读取IP,修改 hailtaxi-driver DriverController info() 方法,注入配置文件中的

ip ,代码如下:

         bootstrap.yml 中引入配置需要使用 extension-configs 属性,配置如下:

         这里 extension-configs[n] n值越大,优先级越高,它既能解决一个应用多个配置,同时还能解决 配置共享问题。

        测试访问 http://localhost:18081/driver/info/1 ,此时能访问数据库,同时也能获取 hailtaxi-driver-dev.yaml 中的配置,效果如下:

2.3.4配置刷新 

         配置自动刷新对程序来说非常重要,Nacos支持配置自动刷新,并且提供了多种刷新机制。

        程序中如果写了 @Value 注解,可以采用 @RefreshScope 实现刷新,只需要在指定类上添加该注解即可,如下代码:

2.3.5 灰度发布 

        灰度配置指的是指定部分客户端IP 进行新配置的下发,其余客户端配置保持不变,用以验证新配置对客 户端的影响,保证配置的平稳发布。灰度配置是生产环境中一个比较重要的功能,对于保证生产环境的 稳定性非常重要。在1.1.0 中, Nacos 支持了以 IP 为粒度的灰度配置,具体使用步骤如下:
 

         修改配置内容,点击“发布Beta”按钮,即可完成灰度配置的发布,点击发布Beta”后,发布Beta”按钮 变灰,此时可以选择“停止Beta”或者发布停止Beta”表示取消停止灰度发布,当前灰度发布配置的IP 列表和配置内容都会删除,页面回到正常发布的样式。“发布表示将灰度配置在所有客户端生效,之前 的配置也会被覆盖,同时页面回到正常发布的样式:

三、Nacos集群 

         在生产环境Nacos一般都不是单节点存在,如果是单节点,很容易存在单点故障,因此生产环境一般都 以集群形式存在。

3.1 集群架构

        Nacos集群模式有多种,但其实无论哪种都是将3Nacos服务进行集群发布,而且必须采用数据共享模 式进行配置信息共享,也就是要将数据存入到同一个数据库中,我们对每种集群模式进行说明:

1)直连模式:

        http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。 比如我现在有3Nacos,每次操作数据的时候,都需要使用IP:端口的模式,这种模式效率极低,并 且一旦节点故障无法识别,因此官方不推荐这种模式。

2)VIP模式:

        http://SLB:port/openAPI 挂载SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),直连SLB即可,下面挂server真实ip,可读性不好。

3)域名模式:

        http://nacos.com:port/openAPI 域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式。

3.2 集群部署 

        我们搭建Nacos集群环境,集群环境配置如下:

1)服务下载 

        在 https://github.com/alibaba/nacos/releases/ 下载需要的服务,当前使用的是1.4.1, 我们可以 选择下载1.4.1版本,版本如下:

        解压缩后:

2)配置数据库 

       修改 conf/application.properties 配置数据库,配置如下:

3)集群配置 

        修改 conf/cluster.conf 配置集群:

4)配置同步 

        将上面那台服务器配置好的nacos发送到另外两台服务器上:

5)分别启动每一个节点 

         

 访问任何一个单节点,信息如下:

        一般客户端访问,可以再前置环节访问nginx,然后通过nginx负载到每个nacos节点上,那我们服务配置只需要单独配置nginx的域名地址。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation

MotionCtrl: A Unified and Flexible Motion Controller for Video Generation 这篇论文是基于VideoCrafter的&#xff0c;而VideoCrafter是基于LVDM的 关于LVDM可以看https://blog.csdn.net/Are_you_ready/article/details/136615853 2023年12月6日发表在arxiv 这篇论文讨论…

seo js转码工具

js转码工具作用 用于把js加密 如果不想让别人看到自己的js 代码就可以使用这个方法 js工具网址 https://tool.chinaz.com/js.aspx 效果

J.K.罗琳创作的《神奇动物》系列电影赏析

故事情节 《神奇动物在哪里》&#xff1a; 这部电影讲述了纽特斯卡曼德来到纽约的故事&#xff0c;他是一位收集和研究魔法动物的巫师。在纽约&#xff0c;他的一只神奇生物逃脱&#xff0c;并引发了一系列麻烦。与此同时&#xff0c;纽约巫师社会面临着黑暗力量的威胁&#x…

超大规模-近场

这里先了解基站到用户的&#xff0c;无RIS的近场模型 超大规模智能反射面辅助的近场移动通信研究 &#xff08;论文题目&#xff09; &#xff08;期刊&#xff09;无线电通信技术 系统&#xff1a;BS-RIS-UE&#xff0c;两个阶段都是近场 模型&#xff1a;球面波传播模型&…

在dpvs上实现ICMP的源进源出

目录 1. 缘起2. 源码分析3. 让ICMP也走源进源出1. 缘起 在网络通信中,当一个请求报文从源主机到达目标主机,并经过中间路由器或交换机进行转发时,请求报文进入主机A的路径和响应报文离开主机A的路径可能不同。这种情况下,就会出现所谓的三角路径问题。如下图: 具体来说,…

USB协议学习(三)大容量存储设备SCSI协议分析

笔者来简单介绍一下SCSI得协议命令 1、SCSI协议认识 SCSI&#xff1a;Small Computer System Interface&#xff0c;用于计算机外部设备得接口标准&#xff0c;定义了与外部设备得一套协议。SCSI标准协议族支持很多钟SCSI设备&#xff0c;像盘&#xff0c;打印机&#xff0c;扫…

论企业安全漏洞扫描的重要性

前言 随着信息技术的迅猛发展和互联网的广泛普及&#xff0c;网络安全问题日益凸显。在这个数字化的世界里&#xff0c;无论是企业还是个人&#xff0c;都面临着前所未有的安全威胁。安全漏洞&#xff0c;作为这些威胁的源头&#xff0c;常常被忽视或无法及时发现。 而安全漏洞…

提示并输入一个字符串,统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C++风格字符串完成

#include <iostream> #include <array> using namespace std;int main() {cout<<"请输入一个字符串"<<endl;//array<string,100> str;string str;getline(cin,str);int daxie0,xiaoxie0,num0,space0,other0;int lenstr.size();;for(in…

植物病害识别:YOLO水稻病害识别数据集(11000多张,yolo标注)

YOLO水稻病害识别数据集&#xff0c;包含叶斑病&#xff0c;褐斑病&#xff0c;细菌性枯萎病&#xff0c;东格鲁病毒病4个常见病害类别&#xff0c;共11000多张图像&#xff0c;yolo标注完整&#xff0c;可直接训练。 适用于CV项目&#xff0c;毕设&#xff0c;科研&#xff0c…

Flink 性能优化总结(反压优化篇)

反压的理解 Flink 中每个节点间的数据都以阻塞队列的方式传输&#xff0c;下游来不及消费导致队列被占满后&#xff0c;上游的生产也会被阻塞&#xff0c;最终导致数据源的摄入被阻塞。简单来说就是系统接收数据的速率远高于它处理数据的速率。 反压如果不能得到正确的处理&am…

软件测试面试需要准备什么?面试有什么技巧?看完面试轻松解决

前言 无论是在校招还是社会企业招聘中&#xff0c;应聘者总是要经过层层的考核才能被聘用。然而&#xff0c;在招聘时&#xff0c;设置的编程以及非技术面试问题&#xff0c;真的有必要吗&#xff1f;如此就能考核出一位开发者的真实水平&#xff1f; 说到底就是考验你的技术以…

分享10个ai人工智能ppt生成软件,一键轻松搞定PPT制作!

ai 人工智能发展至今&#xff0c;已经诞生了各式各样的 AI 软件&#xff0c;最常见的如 AI 写作软件、AI 绘画软件、AI 人工智能 ppt 生成器、AI 人工智能抠图软件等等。对每天要面对各类文档、演示文稿&#xff08;PPT&#xff09;的职场人来说&#xff0c;最被需要的 AI 软件…

javascript:void(0);用法及常见问题解析

在Web开发中&#xff0c;javascript:void(0);是一个经常被用到的代码片段&#xff0c;特别是在一些老式的网页中。这个代码片段的作用是执行一个空操作&#xff08;null operation&#xff09;&#xff0c;即不执行任何操作。它的主要用途是在JavaScript代码中创建一个空链接&a…

AHU 汇编 实验二

一、实验名称&#xff1a;实验二 不同寻址方式的灵活运用 二、实验内容&#xff1a;定义数组a[6]&#xff0c;用多种寻址方式访问对应元素&#xff0c;实现&#xff08;a[0]a[1]&#xff09;*(a[2]-a[3])/a[4],将结果保存在内存a[5]中&#xff0c;用debug查询结果。 实验过程&a…

代码随想录算法训练营第四十六天| 139.单词拆分、背包总结

文章目录 1.单词拆分[2.背包总结] 1.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1…

c++ 开发环境 LNK1104: 无法打开文件“carve.lib” 已解决

别人分享&#xff0c; 和自己最近遇到问题一摸一样。以为没什么用的静态资源&#xff0c;结果 无法编译。 昨天安装配置了&#xff0c;结果今天早上打开电脑&#xff0c;所以dll的工程全部报错&#xff1a; 1>------ 已启动全部重新生成: 项目: Dll_test, 配置: Debug x64…

nginx禁止国外ip访问

1.安装geoip2扩展依赖 yum install libmaxminddb-devel -y 2.下载ngx_http_geoip2_module模块 https://github.com/leev/ngx_http_geoip2_module.git 3.编译安装 ./configure --add-module/datasdb/ngx_http_geoip2_module-3.4 4.下载最新数据库文件 模块安装成功后,还要…

LLM 推理优化

LLM 推理服务重点关注两个指标&#xff1a;吞吐量和时延&#xff1a; 吞吐量&#xff1a;主要从系统的角度来看&#xff0c;即系统在单位时间内能处理的 tokens 数量。计算方法为系统处理完成的 tokens个数除以对应耗时&#xff0c;其中 tokens 个数一般指输入序列和输出序列长…

CVE-2021-31440:eBPF verifier __reg_combine_64_into_32 边界更新错误

文章目录 前言漏洞分析构造 vuln reg 漏洞利用漏洞修复参考 前言 影响版本&#xff1a;Linux 5.7 ~ 5.11.20 8.8 编译选项&#xff1a;CONFIG_BPF_SYSCALL&#xff0c;config 所有带 BPF 字样的编译选项。General setup —> Choose SLAB allocator (SLUB (Unqueued Allocat…

C#请假与加班案例

请假余额表示一年当中可以请几天假。输入请假天数&#xff0c;点击请假按钮则减少假期余额。如果请假天数大于当前假期余额&#xff0c;则提示“假期余额不足”。输入加班天数&#xff0c;点击加班按钮则增加假期余额。 private void button1_Click(object sender, EventArgs e…