【分布式微服务专题】从单体到分布式(二、SpringCloud整合Nacos)

目录

  • 前言
  • 阅读对象
  • 阅读导航
  • 前置知识
  • 笔记正文
    • 一、下载安装
    • 二、项目整合
      • 2.1 服务注册与发现
      • 2.2 动态配置管理
    • 三、其他实验
    • 四、服务之间的调用
  • 学习总结
  • 感谢

前言

本篇笔记主要是记录我整合Nacos项目进来的过程。以实现服务注册发现,以及分布式配置管理。关于Nacos,右侧点击:Nacos官网传送门

阅读对象

  1. 需要有实际Springboot-web开发经验
  2. 了解Nacos基本使用(可以从前言里面给的链接去官网学习,或者看看这篇文章《Nacos使用详解》)

阅读导航

系列上一篇文章:《【分布式微服务专题】从单体到分布式(一、SpringCloud项目初步升级)》

前置知识

笔记正文

一、下载安装

1)下载
当前环境:win11
版本:2.2.3,官方介绍说这是当前推荐的稳定版本
下载地址:Nacos2.2.3下载
在这里插入图片描述
2)解压运行
解压,然后进入nacos/bin目录,以单机模式运行startup.cmd -m standalone在这里插入图片描述
当看到下面这个界面的时候就表示启动成功了:
在这里插入图片描述
接着,访问Nacos自带的客户端验证一下:http://localhost:8848/nacos
在这里插入图片描述

二、项目整合

Nacos在项目模块上,大概会分为两个,分别是:nacos-confignacos-discovery,即:【分布式配置】和【服务注册与发现】。下面我们就分开两步来整合。

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

2.1 服务注册与发现

1)首先是现在pom中添加【服务注册与发现】的jar包依赖

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

2)添加项目yml配置

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

3)最后就是在启动类上添加@EnableDiscoveryClient启用【服务注册与发现】相关功能
4)启动服务。我则是添加到了shen-product服务上,效果如下:
在这里插入图片描述
可以在nacso的服务列表中,看到shen-product注册到了nacos上。我们也可以尝试启动其他服务去验证哦。比如,我这里再启动一个shen-productshen-order服务。
在这里插入图片描述
点击shen-product服务集群的的详情可以看到如下画面:
在这里插入图片描述
OK,非常强大。注意刀上面的权重了吗?你会想到啥?对嘛,负载均衡呀xdm。
对了,想要在IDEA里面启动多个服务实例其实也不难,就是右上角新增一个SpringBootApplication实例就好,当然注意修改端口
在这里插入图片描述
5)调用shen-product
我们在上面启动了两个shen-product实例,我们来试试效果。先来试试http://localhost:9001/product/list,再来试试http://localhost:9002/product/list
在这里插入图片描述
在这里插入图片描述

2.2 动态配置管理

说到动态配置这个东西,有个前置内容需要先跟大家说说。Nacos提供的这个动态配置,是用于存储配置和其他元数据的 key/value,为分布式系统中的外部化配置提供服务器端和客户端支持。比如:同一组服务集群里面共享一些配置application.yml
那你们,还记得SpringBoot项目得application.yml加载顺序吗?包括其他所有配置。正常来说包括但不限于以下:

  1. 命令行参数
  2. 操作系统环境变量
  3. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  4. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件 再来加载不带profile
  5. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  6. jar包内部的application.properties或application.yml(不带spring.profile)配置文件

上面的内容不是重点,重点是,这里体现了一种配置思想:高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置 (覆盖 + 并级)。
那么问题就来了,既然SpringBoot配置文件需要遵循以上原则,那么,我在Nacos中的配置文件如何获取?有同学会说:我们不是有Nacos的地址嘛,通过地址去下载获取咯。确实是的,但是Nacos的地址你配置在哪里?我们上面的示例是把它配置在application.yml文件吧?但是application.yml文件要互补,然而想要获取最全的配置文件一定要先去nacos下载!所以在引入nacos-config配置中心的时候,就出现了逻辑矛盾。
为了解决这个问题,SpringCloud标准约定,引入一个全新的配置文件bootstrap.yml。它跟application.yml差不多,只不过优先级大于后者。bootstrap直译:引导。

1)首先是现在pom中添加【配置中心】的jar包依赖

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

另外我们不是在上面说要引入新的配置文件bootstrap.yml嘛,似乎2.x版本之后需要额外引入另一个包才行,不然会报错找不到bootstrap配置文件,如下:(下面这个包来自spring-cloud-dependencies,所以需要自己添加这个项目的管理依赖哦)

   <!-- bootstrap文件发现-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>

2)在bootstrap.yml文件配置nacos配置中心地址(spring.cloud.nacos.config

server:
  port: 9001

spring:
  application:
    name: shen-product
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848

3)在nacos中新建两张配置表
说到配置文件,首先需要向大家解释。SpringCloud应用会首先向Nacos查找${prefix}-${spring.profiles.active}.${file-extension}的配置文件。

  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
  • 更多内容请查看Nacos Config

比如我上面的配置中,会默认先查找shen-product.properties文件。
但是通常我们在配置中心里面,还会自定义很多通用的配置文件,比如我这么配置:

  1. application-conf.yaml:用来配置所有微服务的数据库配置。毕竟我是在试验阶段,共用一个数据库很合理吧… 甚至redis,mq等等。这些配置往往不需要支持动态更新
  2. config-info.yaml:用来存放一些需要动态更新的业务配置。例如我在里面存放了一个config.author来存放作者名字

如下图:
在这里插入图片描述
在这里插入图片描述
4)修改bootstrap.yml文件,支持yaml格式配置文件,支持拓展配置文件

server:
  port: 9001

spring:
  application:
    name: shen-product
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
        extension-configs:
          - data-id: application-conf.yaml
          - data-id: config-info.yaml
            refresh: true

5)商品服务新增测试接口
在这里插入图片描述
注意上面@RefreshScope注解,用来开启类的动态配置刷新

6)访问http://localhost:9001/product/getMyMan测试接口;修改配置继续测试

三、其他实验

官方还有一些其他的东西,比如:
在这里插入图片描述
这里就不试了,感觉Nacos比较重要的应该就是以上两点。另外还有Nacos集群搭建等等,也不在这里实验咯。

四、服务之间的调用

前面我的很多接口示例都是在单个服务上发生的,在我们的实际使用场景中,肯定会存在跨服务之间的调用。目前正在学习DubboOpenFeign,看看整合哪一种。

不过考虑到Alibaba的微服务体系,我应该会选择整合Dubbo。理由如下:

  1. 横向对比的话,Dubbo可以完美替代OpenFeign
  2. OpenFeign唯一的优势应该是在于使用更简单,不过我觉得缺点是它只能使用http协议。http在我的刻板印象里面就是性能很拉跨,当然,http还有http1.1http2,Dubbo框架可以支持http2,而前者默认不支持,不过也可以切换客户端的方式来支持
  3. 学习Dubbo更有利于面试
  4. Dubbo唯一的缺点就是学习成本会高一点,毕竟内容多,呜呜呜

其实我还有一点疑问,Dubbo看官网介绍,总感觉跟Nacos有很多功能是重叠的,咋回事呢
在这里插入图片描述

学习总结

感谢

感谢本站大佬【作者:不凉帅】的文章《Nacos使用详解》)

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

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

相关文章

hive数据库查看参数/hive查看当前环境配置

文章目录 一、hive查看当前环境配置命令 在一次hive数据库执行命令 set ngmr.exec.modecluster时&#xff0c;想看一下 ngmr.exec.mode参数原先的值是什么&#xff0c;所以写一下本篇博文&#xff0c;讲一下怎么查看hive中的参数。 一、hive查看当前环境配置命令 set &#…

06 硬件知识入门(MOSS管)

1 简介 MOS管和三极管的驱动方式完全不一样&#xff0c;以NPN型三极管为例&#xff0c;base极以小电流打开三极管&#xff0c;此时三极管的集电极被打开&#xff0c;发射极的高电压会导入&#xff0c;此时电流&#xff1a;Ic IbIe &#xff1b;电压&#xff1a;Ue>Uc>Ub…

DBSCAN算法原理及其Python实现

文章目录 原理Python实现验证 原理 DBSCAN&#xff0c;即Density-Based Spatial Clustering of Applications with Noise&#xff0c;基于密度的噪声应用空间聚类。 在DBSCAN算法中&#xff0c;将数据点分为三类&#xff1a; 核心点&#xff1a;若样本 x i x_i xi​的 ε \v…

《深入理解计算机系统》学习笔记 - 第三课 - 浮点数

Floating Point 浮点数 文章目录 Floating Point 浮点数分数二进制示例能代表的数浮点数的表示方式浮点数编码规格化值规格化值编码示例 非规格化的值特殊值 示例IEEE 编码的一些特殊属性四舍五入&#xff0c;相加&#xff0c;相乘四舍五入四舍五入的模式二进制数的四舍五入 浮…

Linux 网络协议

1 网络基础 1.1 网络概念 网络是一组计算机或者网络设备通过有形的线缆或者无形的媒介如无线&#xff0c;连接起来&#xff0c;按照一定的规则&#xff0c;进行通讯的集合( 缺一不可 )。 5G的来临以及IPv6的不断普及&#xff0c;能够进行联网的设备将会是越来越多&#xff08…

扩展学习|商务智能与社会计算

一、概念介绍 &#xff08;一&#xff09;商务智能 商务智能&#xff08;Business Intelligence&#xff0c;简称BI&#xff09;是一种基于数据分析的决策支持系统&#xff0c;旨在帮助企业或组织更好地理解和利用自身数据&#xff0c;发现其中的模式和趋势&#xff0c;并提供…

Java物联网项目源码

Java物联网项目源码 使用技术&#xff1a;JAVA [ springmvc / spring / mybatis ] 、Mysql 、Html 、Jquery 、css 协议和优势&#xff1a;TCP/IP、HTTP、MQTT 通讯协议。 系统包括&#xff1a;后台服务&#xff0c;传感器解析服务、web展示&#xff1b; 目前web系统支持功…

【Proteus仿真】【STM32单片机】蓝牙遥控小车

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使LCD1602液晶&#xff0c;L298电机&#xff0c;直流电机&#xff0c;HC05/06蓝牙模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显…

基于springboot实现的仿天猫商城项目

一、系统架构 前端&#xff1a;jsp | js | css | jquery 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.7 | mysql | maven 二、代码及数据库 三、功能介绍 01. web端-首页 02. web端-商品查询 03. web端-商品详情 04. web端-购物车 05. web端-订单…

YOLOv8改进 | 2023 | DiverseBranchBlock多元分支模块(有效涨点)

一、本文介绍 本文带来的改进机制是YOLOv8模型与多元分支模块&#xff08;Diverse Branch Block&#xff09;的结合&#xff0c;Diverse Branch Block (DBB) 是一种用于增强卷积神经网络性能的结构重新参数化技术。这种技术的核心在于结合多样化的分支&#xff0c;这些分支具有…

C++ day57 回文子串 最长回文子串序列

题目1&#xff1a;647 回文子串 题目链接&#xff1a;回文子串 对题目的理解 返回字符串s中回文子串的个数&#xff0c;字符串s至少包含一个字符&#xff0c;且仅由小写字母组成。 动态规划 动规五部曲 1&#xff09;dp数组及下标i的含义 dp[i][j]&#xff1a;[i,j]子串…

22款奔驰S450L升级主动式环境氛围灯 安全提醒功能

主动式氛围灯有263个可多色渐变的LED光源&#xff0c;营造出全情沉浸的动态光影氛围。结合智能驾驶辅助系统&#xff0c;可在转向或检测到危险时&#xff0c;予以红色环境光提示&#xff0c;令光影艺术彰显智能魅力。配件有6个氛围灯&#xff0c;1个电脑模块。星骏汇小许Xjh158…

第二十一章——网络通信总结

网络程序设计基础 局域网与互联网 为了实现两台计算机的通信&#xff0c;必须用一个网络线路连接两台计算机。如下图所示 网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。Internet 网络采用的协议是TCP/IP协议&#xff0c;其全称是Transmission…

第21章网络通信

Internet 提供了大量有用的信息&#xff0c;很少有人能在接触过Internet后拒绝它的诱惑。计算机网络实现了多台计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是在已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c…

Python编程技巧 – 异常处理

Python编程技巧 – 异常处理 Python Programming Skills – Exception Handling By JacksonML 每一个程序都未必是健壮的&#xff0c;有时候很脆弱。只有在人的理想思维状况下&#xff0c;返回的结果才是正确的&#xff0c;如意的。 1. 错误发生及异常输出 面对种种编写有疏…

【mysql】下一行减去上一行数据、自增序列场景应用

背景 想获取if_yc为1连续账期数据 思路 获取所有if_yc为1的账期数据下一行减去上一行账期&#xff0c;如果为1则为连续&#xff0c;不等于1就为断档获取不等于1的最小账期&#xff0c;就是离当前账期最近连续账期 代码 以下为mysql语法&#xff1a; select acct_month f…

机场信息集成系统系列介绍(1)

机场信息集成系统是一种专为机场运营管理设计的先进系统&#xff0c;旨在提高机场的航班调度指挥效率&#xff0c;同时为机场各生产部门提供航班保障计划的制定和实时调整功能。 该系统的核心用户是机场运控部门&#xff0c;他们利用系统进行航班运行指挥&#xff0c;通过采集航…

Kafka性能调优:高吞吐、低延迟的数据流

Apache Kafka作为一种高性能、分布式流处理平台&#xff0c;对于实时数据的处理至关重要。本文将深入讨论Kafka性能调优的关键策略和技术&#xff0c;通过丰富的示例代码为大家提供实际操作指南&#xff0c;以构建高吞吐、低延迟的数据流系统。 Broker 配置的优化 首先&#…

中断、异常和系统调用(2-1,2-2,2-3)

2-1 课堂练习2.1&#xff1a;外部中断 本实训分析 Linux 0.11 对外部中断的响应和处理过程。在每条指令执行的末尾&#xff0c;如果没有关中断&#xff0c;CPU 会检查是否收到了外部中断信号&#xff0c;如果有信号&#xff0c;则 CPU 就切换到核心态去执行对应的中断处理程序…

c# 字段和属性(get、set、init)

基本概念&#xff1a; “字段”就是类内成员变量&#xff0c;一般为了隐藏数据&#xff0c;保护数据&#xff0c;实现对外不可见&#xff0c;体现封装的思想&#xff0c;成员变量都声明为私有变量&#xff1b;“属性”是类内的一种成员&#xff0c;它是一种特殊的方法(方法的意…