SpringClound 微服务分布式Nacos学习笔记

一、基本概述

在实际项目中,选择哪种架构需要根据具体的需求、团队能力和技术栈等因素综合考虑。

单体架构(Monolithic Architecture)

        单体架构是一种传统的软件架构风格,将整个应用程序构建为一个单一的、不可分割的单元。在这种架构中,所有的功能模块(如用户管理、订单处理、支付等)都打包在一个大型的、统一的代码库中,并且部署为一个单独的进程。

微服务架构(Microservices Architecture)

        微服务架构是一种将复杂应用程序分解为一组小型、独立服务的架构风格。每个微服务都围绕特定的业务功能构建,运行在其独立的进程中,并通过轻量级的通信机制(通常是HTTP/RESTful API、消息队列等)协同工作。例如,一个电商系统可以被拆分为用户服务(处理用户注册、登录等功能)、订单服务(负责订单创建、查询等)、库存服务(管理商品库存)等多个微服务。

总结

  • 单体架构适用于小型或简单的应用程序,开发团队规模较小,且对系统的扩展性和灵活性要求不高。

  • 微服务架构适用于复杂、大型的应用程序,特别是需要高可扩展性、灵活性和快速迭代的场景。开发团队需要具备分布式系统的开发和运维能力。

一、单体架构(Monolithic Architecture)

(一)定义

单体架构是一种传统的软件架构风格,将整个应用程序构建为一个单一的、不可分割的单元。在这种架构中,所有的功能模块(如用户管理、订单处理、支付等)都打包在一个大型的、统一的代码库中,并且部署为一个单独的进程。

(二)特点

  1. 集中式开发

    单体架构的代码通常集中在一个大型的代码库中,所有功能模块共享相同的代码库。开发团队需要在同一个代码库中协作,进行功能开发、修改和维护。
  2. 统一部署

    整个应用程序作为一个整体进行部署。每次更新或修复任何功能模块时,都需要重新打包并部署整个应用程序。例如,如果只是修复了一个小的用户界面问题,也需要重新部署整个系统。
  3. 紧密耦合

    功能模块之间通常存在紧密的依赖关系。一个模块的变更可能会影响到其他模块,因此在修改代码时需要非常谨慎,以避免引入新的问题。
  4. 可扩展性有限

    单体架构的扩展通常是通过增加服务器的性能(如CPU、内存)来实现的,这种扩展方式称为垂直扩展。当系统负载增加时,垂直扩展的代价会越来越高,且存在硬件资源的瓶颈。

(三)优点

  1. 简单易理解

    对于小型或简单的应用程序,单体架构的结构相对简单,开发和部署过程也较为直观。开发人员可以快速上手,不需要复杂的架构设计和分布式系统的知识。
  2. 开发工具友好

    大多数开发工具(如IDE)对单体架构的支持较好,调试和测试也相对容易。开发人员可以在一个统一的环境中进行开发,不需要考虑跨服务的调试问题。
  3. 事务管理简单

    在单体架构中,事务管理相对简单,因为所有的功能模块都在同一个进程中运行,可以通过传统的数据库事务来保证数据的一致性。

(四)缺点

  1. 可维护性差

    随着应用程序的规模增大,代码库会变得庞大且复杂,开发和维护成本会急剧上升。新功能的添加或现有功能的修改可能会引入新的问题,影响整个系统的稳定性。
  2. 部署困难

    由于每次更新都需要重新部署整个应用程序,部署过程可能会变得繁琐且耗时。同时,频繁的部署也可能对系统的稳定性产生影响。
  3. 技术栈受限

    单体架构通常使用单一的技术栈,很难引入新的技术或框架。一旦选择了某种技术,后续很难进行技术的替换或升级。

二、微服务架构(Microservices Architecture)

(一)定义

微服务架构是一种将复杂应用程序分解为一组小型、独立服务的架构风格。每个微服务都围绕特定的业务功能构建,运行在其独立的进程中,并通过轻量级的通信机制(通常是HTTP/RESTful API、消息队列等)协同工作。

(二)特点

  • 独立性

        独立开发:每个微服务可以由不同的团队独立开发,团队之间只需要通过定义好的接口进行协作。例如,用户服务团队和订单服务团队可以分别开发和维护自己的服务,而不需要相互干扰。

        独立部署:每个微服务可以独立部署,更新或扩展一个微服务不会影响到其他微服务。例如,当订单服务需要更新订单处理逻辑时,只需要重新部署订单服务相关的代码和配置。

        独立扩展:可以根据每个微服务的负载情况独立扩展。如果用户服务的访问量突然增加,可以单独增加用户服务的实例数量,而不需要对其他服务进行扩展。

  • 容错性

    单个微服务的故障不会导致整个系统崩溃。例如,如果库存服务暂时不可用,订单服务仍然可以正常接收订单,只是可能无法实时更新库存信息,但系统可以设计为在这种情况下记录订单并等待库存服务恢复后再处理库存更新。
  • 可维护性高

    由于每个微服务都相对独立,代码库较小,开发和维护成本相对较低。新功能的添加或现有功能的修改不会对整个系统产生太大的影响。

(三)优点

  1. 敏捷开发

    微服务架构支持敏捷开发,不同的团队可以并行开发不同的微服务,加快开发速度。同时,独立部署的特点也使得新功能可以快速上线。
  2. 可扩展性强

    微服务架构支持水平扩展,可以根据每个微服务的负载情况独立扩展。例如,通过增加微服务实例的数量来应对高并发场景。
  3. 技术灵活性

    开发团队可以自由选择最适合的技术栈来开发每个微服务,便于引入新技术和框架。
  4. 容错性好

    单个微服务的故障不会导致整个系统崩溃,系统的整体可用性更高。

(四)缺点

  1. 分布式系统复杂性

    微服务架构本质上是一个分布式系统,需要处理分布式事务、服务间通信、数据一致性等问题。例如,一个业务流程可能涉及多个微服务的调用,需要解决分布式事务问题。
  2. 部署和运维复杂

    微服务架构需要管理多个独立的服务,部署和运维的复杂度会增加。例如,需要管理每个微服务的配置、监控、日志等。
  3. 性能开销

    由于微服务之间通过网络通信(如HTTP/RESTful API、消息队列),可能会引入额外的性能开销。例如,服务间的调用延迟可能会比单体架构中的方法调用延迟更高。
  4. 数据一致性挑战

    微服务架构中,数据通常分散在不同的微服务中,需要解决数据一致性问题。例如,订单服务和库存服务可能分别存储订单信息和库存信息,需要通过分布式事务或事件驱动的方式来保证数据的一致性。

三、单体架构与微服务架构的对比

特点单体架构微服务架构
开发方式集中式开发,所有功能模块在同一个代码库中分布式开发,每个微服务独立开发
部署方式统一部署,更新需要重新部署整个应用程序独立部署,更新或扩展一个微服务不影响其他微服务
技术栈通常使用单一技术栈可以使用多种技术栈
可维护性小型应用简单,大型应用复杂且难以维护可维护性高,每个微服务相对独立
扩展性垂直扩展,受限于硬件资源水平扩展,可以根据负载独立扩展每个微服务
容错性一个模块的故障可能导致整个系统崩溃单个微服务的故障不会影响整个系统
事务管理传统数据库事务管理简单需要分布式事务管理
性能开销方法调用性能高,没有额外的网络通信开销服务间通信可能引入额外的性能开销
开发工具开发工具友好,调试和测试简单开发工具支持有限,调试和测试复杂
适用场景小型或简单的应用程序复杂、大型的应用程序,需要高可扩展性和灵活性

SpringClound

 官网地址:  Spring Cloud

SpringCloud是目前国内使用最广泛的微服务框架。集成了各种微服务功能组件,并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的开箱即用体验。

微服务拆分

原则:

微服务通信

当我们将微服务拆分后,各自的资源会存在独立管理的状态,当某个服务需要调用另一个服务的资源的时候。我们可以通过 网络通信 的方式,进行各自的资源交互。

Spring RestTemplate工具

Spring给我们提供了一个RestTemplate工具,可以方便的实现Http请求的发送。使用步骤如下:

1、注入RestTemplate到Spring容器
    @Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
2、简单的Get引用获取交换资源
@RequiredArgsConstructor
public class demoServiceImpl extends ServiceImpl<demoMapper, demo> implements IdemoService {private final RestTemplate restTemplate;private void demo(){//        2.1 . 利用 RestTemplate 发起 http 请求,得到 http 的响应ResponseEntity<List<ItemDTO>> response = restTemplate.exchange("http://localhost:8081/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},Map.of("ids", CollUtil.join(itemIds, ",")));//        2.2 . 解析响应if(!response.getStatusCode().is2xxSuccessful()){
//            响应失败,直接结束return ;}List<ItemDTO> items = response.getBody();if (CollUtils.isEmpty(items)) {return;}// 3.转为 id 到 item的mapMap<Long, ItemDTO> itemMap = items.stream().collect(Collectors.toMap(ItemDTO::getId, Function.identity()));// 4.写入vofor (CartVO v : vos) {ItemDTO item = itemMap.get(v.getItemId());if (item == null) {continue;}v.setNewPrice(item.getPrice());v.setStatus(item.getStatus());v.setStock(item.getStock());}}
}

服务治理-nacos

微服务远程通信问题

        当我们多个服务运行后,其中某个服务挂机,而我们写的请求URL写死了,导致获取不到资源。又亦或重启服务后,端口方面有变动,我们又得要从源码中更改,这是不理想的情况的。

注册中心原理

什么是注册中心

        在分布式系统中,服务会有很多实例,这些实例分布在不同的机器上。注册中心就像是一个“服务中心”,它记录了所有服务实例的信息,包括服务名称、实例的地址(IP和端口)等。当一个服务(客户端)需要调用另一个服务(服务提供者)时,它会先去注册中心查询服务提供者的地址,然后才能进行通信。

Nacos 注册中心

Nacos是目前国内企业中占比最多的注册中心组件。它是阿里巴巴的产品,目前已经加入SpringCloud Alibaba中。(官网:Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网)

Nacos搭建步骤

1、配置MySQL表

我们基于Docker来部署Nacos的注册中心,首先我们要准备MySQL数据库表,用来存储Nacos的数据。官方Nacos-SQL表(mysql-schema.sql)

这里注意执行脚本前,自定义一个自己的数据库,同时添加用户信息(密码:nacos)

CREATE DATABASE nacos;
USE nacos;
-- 最后添加用户信息
INSERT INTO users (username, password, enabled) VALUES ('nacos', '$2a$10$EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu', TRUE);
INSERT INTO roles (username, role) VALUES ('nacos', 'ROLE_ADMIN');
2、dockers部署
  • 拉取镜像
docker pull nacos/nacos-server:v2.5.1-slim
  • 通过 SSL 执行生成随机base64的 NACOS_AUTH_TOKEN
openssl rand -base64 32
  • 一键命令创建并启动镜像(系统参数 | Nacos 官网)
docker run -d \
--name nacos \
-e MODE=standalone \
-e PREFER_HOST_MODE=hostname \
-e NACOS_AUTH_ENABLE=true \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=localhost \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e MYSQL_SERVICE_PASSWORD=123456 \
-e MYSQL_SERVICE_DB_PARAM='characterEncoding=utf8&connectTimeout=10000&socketTimeout=30000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai' \
-e NACOS_AUTH_ENABLE=true \
-e NACOS_AUTH_TOKEN='eZCEZeAxiQvbsTJMtc518ocS4vtiEwBTDqGVvk3FPww=' \
-e NACOS_AUTH_TOKEN_EXPIRE_SECONDS=18000 \
-e NACOS_AUTH_IDENTITY_KEY=nacos \
-e NACOS_AUTH_IDENTITY_VALUE=123456 \
-p 8848:8848 \
-p 9848:9848 \
-p 9849:9849 \
nacos/nacos-server:v2.5.1-slim

启动成功后,通过 logs 可以看到

访问  http://localhost:8848/nacos/,就进入到需要登录的页面。

根据我们配置的MySQL默认账号密码都为:Nacos。登录即可看到页面

服务注册

1、引入依赖

父工程:

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

子工程:

<!--nacos 服务注册发现-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、配置 yaml 文件
spring:cloud:nacos:discovery:server-addr: localhost:8848username: nacospassword: nacos

3、启动服务

可以看到服务注册成功。

服务发现

@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;private void DemoItems(){//       根据服务名称获取服务的实例列表List<ServiceInstance> instances = discoveryClient.getInstances("item-service");if(CollUtils.isEmpty(instances)){
//       没有可用的服务,直接结束return ;}//        使用 cn.hutool.core.util.RandomUtil; 工具包随机获取一个实例ServiceInstance serviceInstance = instances.get(RandomUtil.randomInt(instances.size()));
//        获取服务的 URI : http://localhost:8081URI uri = serviceInstance.getUri();//        2.1 . 利用 RestTemplate 发起 http 请求,得到 http 的响应ResponseEntity<List<ItemDTO>> response = restTemplate.exchange(uri + "/items?ids={ids}",HttpMethod.GET,null,new ParameterizedTypeReference<List<ItemDTO>>() {},Map.of("ids", CollUtil.join(itemIds, ",")));//        2.2 . 解析响应if(!response.getStatusCode().is2xxSuccessful()){
//            响应失败,直接结束return ;}List<ItemDTO> items = response.getBody();
}

通过测试可以发现,实现了负载均衡。

OpenFeign

Openfeign是一个声明式的http客户端,是SpringCloud在Eureka公司开源的Feign基础上改造而来。官方地址: https://github.com/openFeign/feign
其作用就是基于SpringMVC的常见注解,帮我们优雅的实现http请求的发送。

快速入门

微服务通信刨析

引入依赖
  <!--openFeign--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><!--负载均衡器--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
通过@EnableFeignClients注解,启用OpenFeign功能
@EnableFeignClients        // 开启 openFeign 请求工具
@MapperScan("com.angindem.mapper")
@SpringBootApplication
public class CartApplication {public static void main(String[] args) {SpringApplication.run(CartApplication.class, args);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
编写FeignClient
package com.angindem.clien;
import com.angindem.domain.dto.ItemDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Collection;
import java.util.List;
@FeignClient("item-service")
public interface ItemClient {@GetMapping("/items")List<ItemDTO> queryItemByIds(@RequestParam("ids") Collection<Long> ids);
}
调用
@Autowired
private ItemClient itemClient;
private void DemoItems(){List<ItemDTO> items = response.getBody();
}

连接池

OpenFeign对Http请求做了优雅的伪装,不过其底层发起http请求,依赖于其它的框架。这些框架可以自己选择,包括以下三种:

  • HttpURLconnection:默认实现,不支持连接池
  • Apache HttpClient:支持连接池
  • OKHttp:支持连接池

具体源码可以参考FeignBlockingLoadBalancerClient类中的delegate成员变量。

引入依赖

这里使用 OKhttp

<!--OK http 的依赖 -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId>
</dependency>
启动连接池

yaml配置

feign:okhttp:enabled: true

最佳实践

方案一:

优点:

  • 模块化:每个服务模块独立开发、部署和扩展,便于维护和升级。

  • 解耦:服务之间通过定义好的接口进行通信,降低了耦合度。

  • 可扩展性:可以根据需要独立扩展各个服务模块,提高系统的可扩展性。

  • 灵活性:可以根据业务需求灵活组合不同的服务模块,实现复杂的业务逻辑。

缺点:

  • 复杂性

    • 管理多个服务增加了系统的复杂性。

    • 需要额外的工具和服务来管理服务间的通信和数据一致性。

这种微服务架构适用于大型分布式系统,可以提高系统的可维护性、可扩展性和灵活性。

方案二:

优点:

  •     集中化API管理

        hm-api作为API网关,统一管理对外的API接口,简化了客户端与后端服务的交互。

  •     解耦:

        服务之间通过API网关进行通信,降低了服务之间的直接依赖,提高了系统的灵活性和可维护性。

缺点:

  •     复杂性增加:

        引入API网关增加了系统的复杂性,需要额外的配置和管理。

  •     性能开销:

        API网关可能会引入额外的网络延迟,影响系统性能。

  •     单点故障:

        如果API网关设计不当,可能会成为系统的单点故障,影响整体可用性。

        总的来说,引入API网关可以带来许多好处,如集中化管理、解耦,但也需要注意其带来的复杂性和性能开销。在设计和实施API网关时,需要权衡这些因素,确保系统的稳定性和可维护性。

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

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

相关文章

WebRTC服务器Coturn服务器用户管理和安全性

1、概述 Coturn服务器对用户管理和安全方面也做了很多的措施&#xff0c;以下会介绍到用户方面的设置 1.1、相关术语 1.1.1 realm 在 coturn 服务器中&#xff0c;域&#xff08;realm&#xff09;是一种逻辑上的分组概念&#xff0c;用于对不同的用户群体、应用或者服务进行区…

基于opencv和PaddleOCR识别身份证信息

1、安装组件 pip install --upgrade paddlepaddle paddleocr 2、完整code import cv2 import numpy as np from paddleocr import PaddleOCR# 初始化 PaddleOCR use_angle_clsTrue, lang"ch", det_db_thresh0.1, det_db_box_thresh0.5)def preprocess_image(image…

【6】GD32 高级通信外设 CAN、USBD

高级通信外设&#xff1a;CAN、USBD CAN CAN简介、主要功能与相关API回环模式收发发送特定ID的数据帧实验CAN数据帧的接收实验使用过滤器接收特定的数据帧 USBD USB通信简介USBD设备固件库架构、分层文件与库函数说明USBD模拟键盘应用USBD虚拟串口应用USBD模拟U盘应用

【LLM+Code】Windsurf Agent 模式PromptTools详细解读

一、前言 https://windsurf.com/ https://windsurf.com/blog/why-we-built-windsurf https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools/tree/main/Windsurf 二、System Prompt 相比于cursor和claude code&#xff0c; windsurf的system prompt非常长&am…

安全性测试常规测试点全解析:从基础到高级的实战指南

引言 安全性测试是保障软件系统免受恶意攻击的核心环节,其目标是识别系统在设计、开发、部署过程中存在的安全漏洞。本文将围绕12大常规安全测试点展开,结合具体测试方法、示例代码及防范建议,帮助读者构建完整的安全测试体系。 一、认证与授权测试 1. 认证机制测试 测试…

OpenCV 图形API(55)颜色空间转换-----将图像从 RGB 色彩空间转换为 I420 格式函数RGB2I420()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 RGB 色彩空间转换为 I420 色彩空间。 该函数将输入图像从 RGB 色彩空间转换为 I420。R、G 和 B 通道值的常规范围是 0 到 255。 输出图…

Pycharm(十六)面向对象进阶

一、继承 概述&#xff1a; 实际开发中&#xff0c;我们发现很多类中的步分内容是相似的&#xff0c;或者相同的&#xff0c;每次写很麻烦&#xff0c;针对这种情况&#xff0c; 我们可以把这些相似&#xff08;相同的&#xff09;部分抽取出来&#xff0c;单独地放到1个类中&…

Codeforces Round 1020 (Div. 3)(题解ABCDEF)

A. Dr. TC 有n次翻转&#xff0c;从1到n&#xff0c;0->1,1->0&#xff0c;每次统计1的数量&#xff0c;设cnt1是字符串1的数量&#xff0c;n次就是n*cnt1&#xff0c; 但每个1都会被翻转一次减去一个cnt1,再统计cnt0&#xff0c;每个被翻转一次,答案就是(n-1)*cnt1cnt0…

HTML字符实体和转义字符串

HTML字符实体和转义字符串用于处理特殊字符&#xff0c;确保它们在不同上下文中正确显示或解析。以下是详细总结&#xff1a; HTML字符实体&#xff08;Character Entities&#xff09; ‌定义‌&#xff1a;用于在HTML中表示保留字符或不可见字符&#xff0c;避免与HTML语法…

FreeRTOS菜鸟入门(六)·移植FreeRTOS到STM32

目录 1. 获取裸机工程模版 2. 下载 FreeRTOS V9.0.0 源码 3. FreeRTOS文件夹内容简介 3.1 FreeRTOS文件夹 3.1.1 Demo文件夹 3.1.2 License 文件夹 3.1.3 Source 文件夹 3.2 FreeRTOS-Plus 文件夹 4. 往裸机工程添加 FreeRTOS 源码 5. 拷贝 FreeRTOSConfig…

通过 Tailwind CSS 自定义样式 实现深色模式切换

创建vite项目或者vue-cli配置大同小异 1、当前环境 Vue.js 3.5nuxtjs/tailwindcss 6.13.1nuxt3.15.4node18 这里主要依赖是tailwindcss 因为当前项目是使用nuxt开发。 2、配置颜色模式 在assets/css下创建main.css * {padding: 0;margin: 0;box-sizing: border-box; }[dat…

PWNOS:2.0(vulnhub靶机)

文章目录 靶机地址主机发现、端口扫描web渗透目录探测漏洞利用权限提升 解密工具地址总结 靶机地址 https://download.vulnhub.com/pwnos/pWnOS_v2.0.7z 这里如果是windows系统直接使用vmware或者virtubox打开可以使用,如果是mac系统需再去做一个配置&#xff0c;比较麻烦 这里…

Gartner魔力象限(Gartner Magic Quadrant)

Gartner魔力象限&#xff08;Gartner Magic Quadrant&#xff09;是由全球领先的研究和咨询公司Gartner发布的市场研究报告&#xff0c;广泛应用于IT行业&#xff0c;尤其是在技术供应商评估中。它以图形化的方式展示了不同技术领域中各个供应商的市场表现&#xff0c;帮助企业…

信创时代开发工具选择指南:国产替代背景下的技术生态与实践路径

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…

人口老龄化丨AI健康小屋如何实现防病于未然​

随着全球老龄化加剧&#xff0c;“银发浪潮” 对医疗资源、养老护理和健康管理提出了严峻挑战。 由此智绅科技应运而生&#xff0c;七彩喜智慧养老系统构筑居家养老安全网。 AI 健康小屋作为银发科技的创新载体&#xff0c;通过智能化健康监测、精准化风险预警、便捷化医疗衔…

【金仓数据库征文】金仓数据库:开启未来技术脑洞,探索数据库无限可能

我的个人主页 我的专栏&#xff1a; 人工智能领域、java-数据结构、Javase、C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01; 点赞&#x1f44d;收藏❤ 目录 引言&#xff1a;数据库进化的下一站 —— 未来科技的无限可能金仓数据库简介&#xff1a;国…

#什么是爬虫?——从技术原理到现实应用的全面解析 VI

什么是爬虫?——从技术原理到现实应用的全面解析 V 二十六、异构数据采集技术突破 26.1 PDF文本与表格提取 import pdfplumber import pandas as pddef extract_pdf_data(pdf_path):"""从PDF中提取文本和表格数据:param pdf_path: PDF文件路径:return: 包含…

关于Spring Boot构建项目的相关知识

一 前端框架 1 VUE框架 1.1 简介 Vue是一款流行的JavaScript框架&#xff0c;用于构建用户界面和单页面应用程序。它的设计初衷是为了简化Web开发过程&#xff0c;使开发者能够快速构建交互性强、响应速度快的Web应用。 1.2 优点 简单易用&am…

PPO 强化学习机械臂 IK 训练过程可视化利器 Tensorboard

视频讲解&#xff1a; PPO 强化学习机械臂 IK 训练过程可视化利器 Tensorboard PPO 强化学习过程中&#xff0c;设置了verbose会显示数据&#xff0c;但还是不够直观&#xff0c;这里上一个可视化利器&#xff0c;Tensorboard&#xff0c;实际上stable baselines3中已经有了这部…

UE5的 Modify Curve 蓝图节点

In Unreal Engine’s Animation Blueprints, the Modify Curve node lets you drive and alter any named Animation Curve on your character at runtime. The Apply Mode setting on that node controls how the “new” value you feed in (via the added curve‐input pin)…