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

news2024/11/24 11:03:28

目录

  • 前言
  • 阅读对象
  • 阅读导航
  • 前置知识
  • 笔记正文
    • 一、下载安装
    • 二、项目整合
      • 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,看看整合哪一种。

学习总结

感谢

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

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

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

相关文章

Leetcode刷题笔记题解(C++):LCR 121. 寻找目标值 - 二维数组

思路&#xff1a;从左小角或者右上角开始遍历&#xff0c;假设右上角开始遍历&#xff0c;如果当前值大于目标值则列-1&#xff1b;如果当前值小于目标值则行1&#xff0c;以此遍历来查找目标值&#xff1b;注意col和row的选取 class Solution { public:bool findTargetIn2DPl…

测试文档---消息驿站

文章目录 项目背景测试计划服务器模块设计测试用例进行单元测试/黑盒测试 客户端模块设计测试用例进行单元测试/黑盒测试 转发规则模块设计测试用例进行单元测试/黑盒测试 测试总结 项目背景 在高并发量的情况下&#xff0c;针对某一台服务器的访问量激增就可能导致该服务器“…

关于最长上升子序列的动态规划问题的优化算法(二分搜索)

最长递增子序列 暴力解法&#xff1a; 思路&#xff1a;使用动态规划的思想&#xff0c;判断当前元素之前的所有元素&#xff0c;如果比当前元素小&#xff0c;则修改当前元素的最长递增子序列&#xff08;需判断是否需要修改&#xff09;。 时间复杂度&#xff1a;O(n^2) im…

leetcode做题笔记1466. 重新规划路线

n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以改变交通拥堵的状况。 路…

C#winform根据选择的Excel文件在数据库中创建数据表

C#winform根据选择的Excel文件在数据库中创建数据表 需求&#xff1a;根据选择的Excel文件在数据库中创建数据表&#xff1b;可以实现特殊字段&#xff08;比如字段中含有数字、下划线、特殊字符等&#xff09;以及表名创建 C#实现 using System; using System.Data; using S…

运维05:自动化

人工运维时代 运维人员早期需要维护众多的机器&#xff0c;因此需要执行很多重复的劳动&#xff0c;很多机器需要同时部署相同的服务或者是执行相同的命令&#xff0c;还得反复地登录不同的机器&#xff0c;执行重复的动作 自动化运维时代 早期运维人员会结合ssh免密登录&…

Shell数组函数:数组——数组和循环(二)

for脚本快速定义数组 [rootlocalhost ~]# vim for12.sh #脚本编辑 #!/bin/bash for a in cat /etc/hosts do hosts[o]$a donefor i in ${!hosts[]} do echo "$i : ${hosts[$a]}" done[rootlocalhost ~]# vim for12.sh #执行脚本区别 &#xff1a;for的空格分割…

漏洞复现-某教育视频云平台前台某接口文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

【每日一题】—— D. Divide and Equalize(Codeforces Round 903 (Div. 3))(数学、数论)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

代码随想录二刷 | 栈与队列 | 前 k 个高频元素

代码随想录二刷 &#xff5c; 栈与队列 &#xff5c; 前 k 个高频元素 题目描述解题思路 & 代码实现 题目描述 347.前k个高频元素 给你一个整数数组 nums 和一个整数 k &#xff0c;请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nu…

[node] Node.js的Web 模块

[node] Node.js的Web 模块 什么是 Web 服务器&#xff1f;Web的应用架构http使用方式使用 Node 创建 Web 服务器使用 Node 创建 Web 客户端 什么是 Web 服务器&#xff1f; Web服务器一般指网站服务器&#xff0c;是指驻留于因特网上某种类型计算机的程序&#xff0c;Web服务器…

http与apache

目录 1.http相关概念 2.http请求的完整过程 3.访问浏览器背后的原理过程 4.动态页面与静态页面区别 静态页面&#xff1a; 动态页面&#xff1a; 5.http协议版本 6.http请求方法 7.HTTP协议报文格式 8.http响应状态码 1xx&#xff1a;提示信息 2xx&#xff1a;成功…

『TypeScript』深入理解变量声明、函数定义、类与接口及泛型

&#x1f4e3;读完这篇文章里你能收获到 了解TypeScript变量声明与类型注解掌握TypeScript函数与方法的使用掌握TypeScript类与接口的使用掌握TypeScript泛型的应用 文章目录 一、变量声明与类型注解1. 变量声明2. 类型注解3. 类型推断 二、函数与方法定义1. 函数定义2. 方法定…

学习Opencv(蝴蝶书/C++)相关1——4.图形和大型数组类型

文章目录 1. 多维度数组和多通道数组区别2. NAryMatIterator详解2.1 介绍2.2 dispatch和SIMD(OpenCV和numpy)2.2.1 OpenCV的2.2.2 numpy的2.2.3 OpenCV文档搜索2.3 调用指令集对代码进行优化2.4 NAryMatIterator理解2.4.1 plane和连续2.4.2 构造函数和迭代2.5 NAryMatIterato…

Cisco Packet Tracer配置命令——交换机篇

交换机VLAN配置 在简单的网络环境中&#xff0c;当交换机配置完端口后&#xff0c;即可直接应用&#xff0c;但若在复杂或规模较大的网络环境中&#xff0c;一般还要进行VLAN的规划&#xff0c;因此在交换机上还需进行 VLAN 的配置。交换机的VLAN配置工作主要有VLAN的建立与删…

CAN总线协议编程实例

1. can.h #ifndef __CAN_H #define __CAN_H#include "./SYSTEM/sys/sys.h"/******************************************************************************************/ /* CAN 引脚 定义 */#define CAN_RX_GPIO_PORT GPIOA #define CAN_RX_GPI…

超大规模集成电路设计----FPGA时序模型及FSM的设计(八)

本文仅供学习&#xff0c;不作任何商业用途&#xff0c;严禁转载。绝大部分资料来自----数字集成电路——电路、系统与设计(第二版)及中国科学院段成华教授PPT 超大规模集成电路设计----RTL级设计之FSM&#xff08;八&#xff09; 7.1 CPLD的时序模型7.1.1 XPLA3 时序模型7.1.…

算法___

文章目录 算法两数之和 算法 两数之和 题目如下图&#xff1a; 我的答案如下图&#xff1a; 我采用的是最笨的思路&#xff0c;直接暴力的两次循环&#xff0c;第一次外循环是取数组的第一个元素&#xff0c;然后内循环会遍历数组后面除第一个的所有元素&#xff0c;然后和…

煤矿电力监控系统

煤矿电力监控系统是一种用于煤矿电力系统的监控解决方案。该系统在重点煤矿的矿井变电站、主运输、主通风、主排水、主副提升等重要设备上加装智能用电融合终端&#xff0c;实时监测煤矿重要设备的电流、电压、负载等主要数据变化。为管理人员提供实时监测、报表管理、告警中心…

初始类与对象

初始类与对象 实验介绍 本课程是进一步对类与对象的深入认识&#xff0c;如何定义并实例化一个类&#xff0c;介绍如何使用 C 标准库 string 类等。 知识点 认识类与对象内联函数string 类类的定义与实例化 认识类与对象 官方定义 类&#xff1a;在面向对象编程中是一种…