SpringCloud学习笔记-2

news2025/6/7 14:10:34

说明:来源于网络,如有侵权请联系我删除

1.提问:如果注册中心宕机,远程调用还能成功吗

答:当微服务发起请求时,会向注册中心请求所有的微服务地址,然后在向指定的微服务地址发起请求。在设计实现时,如果每次都向注册中心发起请求,然后在调用微服务地址,这样浪费性能。这时会有一个实例缓存的东西来解决这一问题。当发起请求时,先从实例缓存中查找,如果有,就直接用里面的微服务地址调用。如果没有,就向注册中心发起请求,获取微服务地址,然后在放入实例缓存中,接着调用微服务地址,下次调用时,就直接从实例缓存中拿来用。同时实例缓存和注册中心也是有一个实时更新的同步机制。了解了这样的一个设计原理,那么这个问题就比较好回答了。

分两个情况,如果这个微服务地址没有访问过,那么需要向注册中心请求获取地址,这时如果注册中心宕机,那么是无法获取地址的,也就无法访问两天。如果这个地址被访问过,那么它就会被放在实例缓存里面,此时优先从实例缓存中拿地址,而并不需要从注册中心请求,这种情况,是可以正常访问这个微服务地址的。

2.Nacos配置中心

 nacos配置中心可以配置微服务的变量,同时支持不停机更新,很方便

按上图操作,即可实现nacos配置

1.启动nacos 

下载nacos后,进入bin目录,然后打开cmd,运行如下命令:

 D:\soft\nacos-server-2.4.3\nacos\bin>startup.cmd -m standalone

2.配置依赖

1)在services的pom文件中引入依赖

        <!--nacos配置中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>

 3.application.properties配置

 在order的application.properties里面配置如下:

spring.config.import=nacos:service-order.properties

  4.nacos页面配置数据集

在nacos页面配置列表里面点击创建配置

填入以下信息如下图,配置格式选择Properties

service-order.properties


order.timeout=30min
order.auto-confirm=7d

 右下角点击发布

5.代码中使用配置的信息

1)在order微服务中编写代码

    @Value("${order.timeout}")
    private String timeOut;
    @Value("${order.auto-confirm}")
    private String aotuConfirm;
   
    //获取配置
    @GetMapping("/getConfig")
    public String getConfig(){
        return "timeout: "+timeOut + "; auto-confirm" +aotuConfirm;

    }

 

2)重启服务,并在浏览器输入http://localhost:8000/getConfig 回车

可以看到已经成功引用了nacos配置的内容 

如果想在nacos中修改了配置内容后,不用重启微服务就可生效,可以加一个注解

@RefreshScope
@RefreshScope

@RestController
public class OrderController {
    @Value("${order.timeout}")
    private String timeOut;
    @Value("${order.auto-confirm}")
    private String aotuConfirm;
    @Autowired
    OrderService orderService;
    //创建订单
    @GetMapping("/create")
    public Order createOrder(@RequestParam("userId")Long userId,@RequestParam("productId")Long productId){
        Order order = orderService.createOrder(productId,userId);
        return order;
    }
    //获取配置
    @GetMapping("/getConfig")
    public String getConfig(){
        return "timeout: "+timeOut + "; auto-confirm" +aotuConfirm;

    }

}

可以修改下nacos中的数据验证,记得需要发布后才生效

3.Nacos配置中心自动刷新

当数据量很多的时候,上面的配置就不太方便了。可以使用如下方式:

 1)创建配置类

输入properties.OrderProperties,生成如下类

@Component
@ConfigurationProperties(prefix="order")
@Data
public class OrderProperties {
    String timeOut;
    String autoConfirm;

}

 其中注解@ConfigurationProperties 指定以order开头的变量。类里面的变量跟nacos里面配置的变量,需要符合驼峰命名。这样配置,可以实现自动刷新。

改造代码,应用上面的配置

//@RefreshScope

@RestController
public class OrderController {
/*    @Value("${order.timeout}")
    private String timeOut;
    @Value("${order.auto-confirm}")
    private String aotuConfirm;*/
    @Autowired
    OrderService orderService;
    @Autowired
    OrderProperties orderProperties;
    //创建订单
    @GetMapping("/create")
    public Order createOrder(@RequestParam("userId")Long userId,@RequestParam("productId")Long productId){
        Order order = orderService.createOrder(productId,userId);
        return order;
    }
    //获取配置
    @GetMapping("/getConfig")
    public String getConfig(){
        //return "timeout: "+timeOut + "; auto-confirm" +aotuConfirm;
        return "timeout: "+orderProperties.getTimeOut() + "; auto-confirm" +orderProperties.getAutoConfirm();

    }

}

 重启微服务程序,页面输入http://localhost:8000/getConfig回车,看到输出以下内容

nacos配置中修改两个变量,然后发布

 

 

 发布后,重新在浏览器刷新,返回值已改变

4.Nacos配置监听 

使用NacosConfigManager监听配置变化

假如说service-order.properties中有变量变化,立即发邮件

实现步骤:

1.项目启动时,监听配置文件变化

2.发生变化时拿到变化值

3.发送邮件

在启动类里面写。

代码如下:

  //项目启动时执行
    @Bean
    ApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager){
        return args->{
            System.out.println("=========");
            ConfigService configService = nacosConfigManager.getConfigService();
            configService.addListener("service-order.properties", "DEFAULT_GROUP", new Listener() {
                @Override
                public Executor getExecutor() {
                    return Executors.newFixedThreadPool(4);
                }

                @Override
                public void receiveConfigInfo(String configInfo) {
                    System.out.println("变化的信息为:"+configInfo);
                    //模拟邮件发送
                    System.out.println("邮件发送:"+configInfo+"变量发生变化请注意");
                }
            });

        };
    }

 

重启微服务,然后修改nacos中的变量

 

发布变量。查看服务台

可以看到成功监听到了。 

5.问题:假如nacos中配置的变量和项目里面的properties文件中的变量重合了,都有值,以哪个为准?

 根据上图可以知道,nacos开发的初衷就是便于统一管理变量,而且nacos属于导入的,因此假如nacos和项目本身的配置重合时,优先取nacos中的。而且如果nacos导入的properties有多个,假如配置如下:

spring.config.import=nacos:service-order.properties,nacos:common.properties

如果service-order.properties和common.properties中也有重合的变量,那谁先导入的就是优先使用的,也就是优先使用service-order.properties里面的变量。

6.nacos数据隔离

 当微服务运行时,需要区分是生产环境还是测试或者开发环境。因此,需要一个方案能区分运行环境(pro、dev、test)、微服务(order、product)、properties数据集(common.properties、database.properties)。nacos很好的解决了这个问题。

 将环境跟命名空间对应,微服务跟group分组对应,配置跟数据集对应,即可解决。

1)创建命名空间

 输入dev  dev  开发  如下图,确定

 

然后再创建prod生产和test测试环境。

 

 

 2)在命名空间中创建properties,其中group对应的是微服务,properties对应数据集

 

order.timeout=1min
order.auto-confirm=1h

然后发布

然后创建database.properties ,发布

order.db-url=order_dev

 此时dev环境已经建好了。

下面使用克隆创建test和prod环境的properties。

克隆好后,进入test命名空间,进行编辑,修改下变量的值,然后发布就可以了。

 

生产环境也调整下变量值然后发布

 

 上面我们配置好了order的properties,下面我们配置下product的。

配置好发布后,然后再克隆给其他环境

 

 

然后修改下变量的值

 

 

测试修改为32  生产修改为40 。至此变量配置已完成。

  3)在代码中加载变量

1.application.properties文件中的变量废弃

2.创建application.yml文件

输入application.yml

 

配置文件内容 

server:
  port: 8000
spring:
  application:
    name: service-order
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        namespace: dev
  config:
    import:
      - nacos:common.properties?group=order
      - nacos:database.properties?group=order

@Component
@ConfigurationProperties(prefix="order")
@Data
public class OrderProperties {
    String timeOut;
    String autoConfirm;
    String dbUrl;
}

 

@RestController
public class OrderController {
/*    @Value("${order.timeout}")
    private String timeOut;
    @Value("${order.auto-confirm}")
    private String aotuConfirm;*/
    @Autowired
    OrderService orderService;
    @Autowired
    OrderProperties orderProperties;
    //创建订单
    @GetMapping("/create")
    public Order createOrder(@RequestParam("userId")Long userId,@RequestParam("productId")Long productId){
        Order order = orderService.createOrder(productId,userId);
        return order;
    }
    //获取配置
    @GetMapping("/getConfig")
    public String getConfig(){
        //return "timeout: "+timeOut + "; auto-confirm" +aotuConfirm;
        return "timeout: "+orderProperties.getTimeOut() + "; auto-confirm" +orderProperties.getAutoConfirm()
                +"; dburl=" +orderProperties.getDbUrl();

    }

}

 重启项目,页面输入http://localhost:8000/getConfig

返回成功数值。 

修改yml文件中的启动变量为test

 

重启服务,页面刷新后得到如下结果,变量生效

 

同理修改为prod也会得到对应结果

 

 但是如上yml配置有问题,如果每个环境加载的properties不一样,这种方式就不行了。做如下修改:

server:
  port: 8000
spring:
  profiles:
    active: prod
  application:
    name: service-order
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848
      config:
        import-check:
          enabled: false
        namespace: ${spring.profiles.active:dev}
---
spring:
  config:
    import:
      - nacos:common.properties?group=order
      - nacos:database.properties?group=order
    activate:
      on-profile: dev
---
spring:
  config:
    import:
      - nacos:common.properties?group=order
      - nacos:database.properties?group=order
      - nacos:haha.properties?group=order
    activate:
      on-profile: test
---
spring:
  config:
    import:
      - nacos:common.properties?group=order
      - nacos:database.properties?group=order
      - nacos:haahaa.properties?group=order
    activate:
      on-profile: prod

 

这样每次修改下active的值即可区分不同的环境变量 

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

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

相关文章

从混乱到秩序:探索管理系统如何彻底改变工作流程

内容摘要 在许多企业与组织中&#xff0c;工作流程混乱是阻碍发展的“绊脚石”。员工们常常被繁琐的步骤、模糊的职责和沟通不畅等问题搞得焦头烂额&#xff0c;工作效率低下&#xff0c;错误频发。而与之形成鲜明对比的是&#xff0c;一些引入了先进管理系统的团队&#xff0…

最新研究揭示云端大语言模型防护机制的成效与缺陷

一项全面新研究揭露了主流云端大语言模型&#xff08;LLM&#xff09;平台安全机制存在重大漏洞与不一致性&#xff0c;对当前人工智能安全基础设施现状敲响警钟。该研究评估了三大领先生成式AI平台的内容过滤和提示注入防御效果&#xff0c;揭示了安全措施在阻止有害内容生成与…

HTML5+CSS3+JS小实例:具有粘性重力的磨砂玻璃导航栏

实例:具有粘性重力的磨砂玻璃导航栏 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width…

Python爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…

Webpack的基本使用 - babel

Mode配置 Mode配置选项可以告知Webpack使用相应模式的内置优化 默认值是production&#xff08;什么都不设置的情况下&#xff09; 可选值有&#xff1a;none | development | production; 这几个选项有什么区别呢&#xff1f; 认识source-map 我们的代码通常运行在浏览器…

链游技术破壁:NFT资产确权与Play-to-Earn经济模型实战

链游技术破壁&#xff1a;NFT资产确权与Play-to-Earn经济模型实战 ——从「投机泡沫」到「可持续生态」的技术重构 一、NFT确权技术革新&#xff1a;从链上存证到动态赋权 跨链确权架构 全链互操作协议&#xff1a;采用LayerZero协议实现以太坊装备与Solana土地的跨链组合&…

为什么HDI叠孔比错孔设计难生产

摘要&#xff1a;本文深入探讨了HDI&#xff08;高密度互连&#xff09;技术中叠孔与错孔设计在生产难度上的差异。通过对两种设计在对位精度、制程复杂性、可靠性挑战等方面进行详细分析&#xff0c;阐述了叠孔设计在生产过程中面临的一系列难题&#xff0c;旨在为HDI产品的设…

数据分析实战2(Tableau)

1、Tableau功能 数据赋能&#xff08;让业务一线也可以轻松使用最新数据&#xff09; 分析师可以直接将数据看板发布到线上自动更新看板自由下载数据线上修改图表邮箱发送数据设置数据预警 数据探索&#xff08;通过统计分析和数据可视化&#xff0c;从数据发现问题&#xf…

游戏开发中的CI/CD优化案例:知名游戏公司Gearbox使用TeamCity简化CI/CD流程

案例背景 关于Gearbox&#xff1a; Gearbox 是一家美国电子游戏公司&#xff0c;总部位于德克萨斯州弗里斯科&#xff0c;靠近达拉斯。Gearbox 成立于1999年&#xff0c;推出过多款史上最具代表性的视频游戏&#xff0c;包括《半衰期》、《战火兄弟连》以及《无主之地》。 团队…

Linux --TCP协议实现简单的网络通信(中英翻译)

一、什么是TCP协议 1.1 、TCP是传输层的协议&#xff0c;TCP需要连接&#xff0c;TCP是一种可靠性传输协议&#xff0c;TCP是面向字节流的传输协议&#xff1b; 二、TCPserver端的搭建 2.1、我们最终好实现的效果是 客户端在任何时候都能连接到服务端&#xff0c;然后向服务…

LlamaIndex 工作流简介以及基础工作流

什么是工作流&#xff1f; 工作流是一种由事件驱动、基于步骤的应用程序执行流程控制方式。 你的应用程序被划分为多个称为“步骤&#xff08;Steps&#xff09;”的部分&#xff0c;这些步骤由“事件&#xff08;Events&#xff09;”触发&#xff0c;并且它们自身也会发出事…

如何利用Elastic Stack(ELK)进行安全日志分析

在以下文章中&#xff0c;我将解释如何使用Elastic Stack&#xff08;ELK&#xff09;进行安全日志分析&#xff0c;以提高安全性和监控网络活动。ELK是一个功能强大的开源日志管理和分析平台&#xff0c;由Elasticsearch、Logstash和Kibana组成&#xff0c;适用于各种用例&…

创客匠人:以 AI 利器赋能创始人 IP 打造,加速知识变现新路径

在知识付费与个人 IP 崛起的时代&#xff0c;创客匠人作为行业领先的技术服务商&#xff0c;正通过 AI 工具重构创始人 IP 打造与知识变现的生态。其推出的三大 AI 利器 ——AI 销售信、免训数字人、AI 智能客服&#xff0c;精准解决 IP 运营中的核心痛点。 以 AI 销售信为例&…

Opencv中的copyto函数

一.OpenCV中copyto函数详解 copyto&#xff08;&#xff09;是 OpenCV 中用于图像复制和融合的核心函数&#xff0c;支持灵活的数据复制和掩模&#xff08;Mask&#xff09;操作&#xff0c;其功能和使用方法如下&#xff1a; 1. 核心功能 基础复制&#xff1a;将源图像&…

基于深度强化学习的Scrapy-Redis分布式爬虫动态调度策略研究

在大数据时代&#xff0c;网络数据的采集与分析变得至关重要&#xff0c;分布式爬虫作为高效获取海量数据的工具&#xff0c;被广泛应用于各类场景。然而&#xff0c;传统的爬虫调度策略在面对复杂多变的网络环境和动态的抓取需求时&#xff0c;往往存在效率低下、资源浪费等问…

在 Ubuntu 24.04 LTS 上安装 Jenkins 并配置全局工具(Git、JDK、Maven)

在 Ubuntu 24.04 LTS 上安装 Jenkins 并配置全局工具(Git、JDK、Maven) Jenkins 是一款开源的持续集成和持续交付(CI/CD)工具,在 DevOps 实践中有着广泛的应用。本文将手把手带你在 Ubuntu 24.04 LTS 系统中完成 Jenkins 的安装,并配置所需的全局工具:Git、JDK 和 Maven…

防爆型断链保护器的应用场景有哪些?

​ ​防爆型断链保护器是一种用于防止链条断裂导致设备损坏或安全事故的装置&#xff0c;尤其适用于存在爆炸风险的工业环境。以下是其主要应用场景&#xff1a; ​ ​1.石油化工行业 在石油化工厂、炼油厂等场所&#xff0c;防爆型断链保护器可用于保护输送设备&#xf…

OPenCV CUDA模块光流------高效地执行光流估计的类BroxOpticalFlow

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::BroxOpticalFlow 是 OpenCV CUDA 模块中实现Brox光流算法的类。该类用于在 GPU 上高效地计算两帧图像之间的稠密光流&#xff08;Dens…

K8S认证|CKS题库+答案| 3. 默认网络策略

目录 3. 默认网络策略 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、官网找模板 3&#xff09;、按照题目要求创建networkpolicy 4&#xff09;、应用networkpolicy 5&#xff09;、检查策略 3. 默认网络策略…

Linux编程:1、文件编程

一、Linux 文件编程与 C 语言文件编程的区别 特性C 语言 I/O 库函数Linux 文件编程&#xff08;系统调用&#xff09;实现层面用户空间&#xff08;glibc 库&#xff09;内核空间&#xff08;系统调用&#xff09;跨平台性跨平台&#xff08;Windows/Linux&#xff09;仅限 Li…