当前位置: 首页 > news >正文

深入探讨dubbo组件的实践

目录

1、dubbo概述

1.1、介绍

1.2、RPC

1.3、区别

1.4、优点

2、dubbo分层

2.1、层级分类

1. Service 服务层(业务层)

2. Config 配置层

3. Proxy 服务代理层

4. Registry 注册中心层

5. Cluster 集群容错层

6. Monitor 监控层

7. Protocol 远程调用层

8. Exchange 信息交换层

9. Transport 网络传输层

10. Serialize 数据序列化层

2.2、各层协作关系

2.3、启动流程

2.4、线程模型

2.5、协议比较

2.6、总结

3、原理

4、dubbo 高级特性


前言

        随着系统的发展,服务越来越多,服务间依赖关系变得错踪复杂,基于访问压力实时管理集群容量,提高集群利用率。当某个服务挂掉之后,可以调用备用服务。甚至当同一个服务部署在不同的机器时该如何调用那一台机器上的服务呢?

如下图所示:

        基于以上的问题,dubbo组件越来越满足分布式系统的项目需要。


1、dubbo概述

1.1、介绍

  • Dubbo是阿里巴巴公司开源的一个高性能、轻量级的 Java RPC 框架。
  • 致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。、
  • 官网:http://dubbo.apache.org

        本质上是个远程服务调用的分布式框架。

1.2、RPC

RPC(Remote Procedure Call Protocol):远程服务调用

        两台服务器A、B,分别部署不同的应用a,b。当A服务器想要调用B服务器上应用b提供的函数或方法的时候,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义传达调用的数据。

        RPC是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。


        RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息到达为止。

        当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

如下图所示:

1.3、区别

        Dubbo是SOA时代的产物,它的关注点主要在于服务的调用,流量分发、流量监控和熔断。而Spring Cloud诞生于微服务架构时代,考虑的是微服务治理的方方面面。

如下图所示:

对比可知:   Dubbo定位服务治理、Spirng Cloud是一个生态。

1.4、优点

1.透明化的远程方法调用:

        就像调用本地方法一样调用远程方法,只需简单配置,没有任何API入侵。


2.软负载均衡及容错机制:

        可在内网替代F5等硬件负载均衡器,降低成本。


3.自动注册与发现:

        不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能平滑添加或删除服务提供者。


4.全Spring配置方式,透明化接入应用:

        对应用没有任何API侵入,只需用Spring加载Dubbo配置即可,Dubbo基于Spring的Schema扩展进行加载。

5.启动时检查

        Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,以便上线时,能及早发现问题,默认 check=“true”。


2、dubbo分层

        Dubbo 采用了清晰的分层架构设计,各层之间松耦合,使得系统具有高度的可扩展性和灵活性。

Dubbo 框架主要分为以下 10 层(从下至上),如下图所示:

2.1、层级分类

1. Service 服务层(业务层)

功能

  • 实际业务逻辑实现层

  • 包含业务接口和实现类

特点

  • 开发者编写的业务代码所在层

  • 通过配置暴露服务和引用服务

2. Config 配置层

功能

  • 对外配置接口

  • 管理 Dubbo 的各种配置(服务提供者配置、消费者配置等)

核心类

  • ServiceConfig - 服务提供者配置

  • ReferenceConfig - 服务消费者配置

  • ProtocolConfig - 协议配置

  • RegistryConfig - 注册中心配置

3. Proxy 服务代理层

功能

  • 生成服务接口的代理对象

  • 对消费者透明化远程调用

特点

  • 消费者调用的是本地代理对象

  • 代理对象负责将调用转发到远程服务

  • 支持 JDK 动态代理和 Javassist 字节码生成

4. Registry 注册中心层

功能

  • 服务注册与发现

  • 服务地址的注册与订阅

支持实现

  • Zookeeper

  • Nacos

  • Redis

  • Multicast

  • Simple(直连)

5. Cluster 集群容错层

功能

  • 将多个服务提供者组合为一个虚拟服务

  • 提供负载均衡和容错机制

核心特性

  • 负载均衡策略:随机、轮询、最少活跃调用等

  • 容错策略:失败自动切换、失败快速失败、失败安全等

  • 路由规则:条件路由、标签路由等

6. Monitor 监控层

功能

  • 统计服务调用次数和调用时间

  • 监控服务健康状况

实现方式

  • 通过 Filter 拦截调用

  • 数据可上报到各种监控系统

7. Protocol 远程调用层

功能

  • 封装 RPC 调用细节

  • 定义调用协议和序列化方式

支持协议

  • dubbo(默认)

  • hessian

  • http

  • rmi

  • webservice

  • thrift

  • grpc(Dubbo 3+)

默认使用的端口号:

8. Exchange 信息交换层

功能

  • 封装请求-响应模式

  • 同步转异步

核心概念

  • Request/Response 模型

  • Exchanger

  • ExchangeChannel

9. Transport 网络传输层

功能

  • 抽象网络传输的统一接口

  • 定义数据传输的模型

核心抽象

  • Endpoint - 通信端点

  • Channel - 通信通道

  • ChannelHandler - 通道处理器

  • Client/Server - 客户端/服务端

实现方式

  • 基于 Netty(默认)

  • Mina

  • Grizzly

10. Serialize 数据序列化层

功能

  • 将对象转换为字节流进行网络传输

  • 将字节流反序列化为对象

支持协议

  • Hessian2(默认)

  • Java 原生序列化

  • JSON

  • Kryo

  • FST

  • Protobuf(Dubbo 3+)

2.2、各层协作关系

  1. 服务层通过 Config 层进行配置

  2. Proxy 层生成代理对象

  3. 调用时经过 Cluster 层进行路由和负载均衡

  4. Protocol 层封装调用信息

  5. Exchange 层处理请求/响应交互

  6. Transport 层进行网络传输

  7. Serialize 层处理数据序列化

  8. 通过 Registry 层发现服务地址

  9. Monitor 层监控整个调用过程

        这种分层设计使得 Dubbo 各层可以独立扩展和替换,例如可以替换序列化方式而不影响其他层,或者更换注册中心而不需要修改业务代码。

        下面我将通过一个完整的 Spring Boot 整合 Dubbo 的示例项目,详细介绍 Dubbo 的每一层在实际项目中的应用。

项目结构

dubbo-springboot-demo
├── api (服务接口模块)
├── provider (服务提供者)
└── consumer (服务消费者)

1. Service 服务层(业务层)

位置:api 模块中定义接口,provider 模块中实现

// api模块 - GreetingService.java
public interface GreetingService {String sayHello(String name);
}// provider模块 - GreetingServiceImpl.java
@Service // Dubbo的@Service注解,不是Spring的
public class GreetingServiceImpl implements GreetingService {@Overridepublic String sayHello(String name) {return "Hello, " + name + " from Dubbo provider!";}
}

Spring Boot 整合配置

# provider的application.yml
dubbo:application:name: dubbo-springboot-providerprotocol:name: dubboport: 20880registry:address: zookeeper://127.0.0.1:2181scan:base-packages: com.example.provider.service # 扫描Dubbo服务

2. Config 配置层

Spring Boot 自动配置
Dubbo 提供了 dubbo-spring-boot-starter,自动完成配置层的初始化

// 自动配置类 DubboAutoConfiguration
@Configuration
@EnableConfigurationProperties(DubboConfigurationProperties.class)
@ConditionalOnProperty(prefix = "dubbo", name = "enabled", matchIfMissing = true)
public class DubboAutoConfiguration {@Beanpublic ApplicationConfig applicationConfig() {// 从application.yml读取dubbo.application配置}@Beanpublic ProtocolConfig protocolConfig() {// 从application.yml读取dubbo.protocol配置}// 其他配置Bean...
}

3. Proxy 服务代理层

消费者端自动创建代理

// consumer模块 - ConsumerController.java
@RestController
public class ConsumerController {@Reference // Dubbo的@Reference注解注入代理private GreetingService greetingService;@GetMapping("/hello")public String hello(String name) {return greetingService.sayHello(name);}
}

代理创建过程

  1. ReferenceAnnotationBeanPostProcessor 处理 @Reference 注解

  2. 创建 ReferenceConfig 实例

  3. 通过 ProxyFactory 创建代理对象

4. Registry 注册中心层

Zookeeper 注册中心配置

# 公共配置application.yml
dubbo:registry:address: zookeeper://127.0.0.1:2181timeout: 3000

注册中心交互

  • 服务提供者启动时注册服务

  • 服务消费者启动时订阅服务

  • 注册中心通知消费者服务变更

5. Cluster 集群容错层

配置负载均衡和容错策略

// 消费者端配置
@Reference(loadbalance = "roundrobin", // 轮询负载均衡cluster = "failover",       // 失败自动切换retries = 2                // 重试2次
)
private GreetingService greetingService;

Dubbo 内置策略

  • 负载均衡:random, roundrobin, leastactive

  • 集群容错:failover, failfast, failsafe

6. Protocol 远程调用层

多协议支持配置

dubbo:protocols:dubbo:name: dubboport: 20880rest:name: restport: 8081server: tomcat

协议选择

@Reference(protocol = "dubbo") // 指定使用dubbo协议
private GreetingService greetingService;

7. Exchange & Transport 网络通信层

Netty 配置

dubbo:provider:dispatcher: allthreadpool: fixedthreads: 200iothreads: 4

通信过程

  1. 消费者通过代理发起调用

  2. 经过 Exchange 层封装请求/响应模型

  3. Transport 层通过 Netty 进行网络传输

8. Serialize 序列化层

配置序列化方式

dubbo:protocol:serialization: hessian2 # 默认hessian2

支持的其他序列化

  • kryo

  • fst

  • json

  • nativejava

9. Monitor 监控层

监控中心配置

dubbo:monitor:protocol: registry

监控数据收集

  • 调用次数

  • 调用时间

  • 成功/失败次数

2.3、启动流程

  1. 服务提供者启动

    • 扫描 @Service 注解的服务

    • 通过 Protocol 层暴露服务

    • 向 Registry 层注册服务

  2. 服务消费者启动

    • 创建 @Reference 注解的代理

    • 通过 Registry 层订阅服务

    • 建立与提供者的网络连接

  3. 服务调用过程

    • 消费者调用代理方法

    • Cluster 层选择提供者

    • 通过 Exchange 和 Transport 层发送请求

    • 提供者处理请求并返回响应

    • Monitor 层记录调用数据

2.4、线程模型


  Dubbo默认的底层网络通讯使用的是Netty,服务提供方NettyServer使用两级线程池,其中EventLoopGroup(boss)主要用来接受客户端的链接请求,并把接受的请求分发给EventLoopGroup(worker) 来处理,boss和worker线程组我们称之为IO线程。

如下图所示:


  

        如果事件处理的逻辑能迅速完成,并且不会发起新的IO请求,比如只是在内存中记个标识,则直接在IO线程上处理更快,因为减少了线程池调度。


  但如果事件处理逻辑较慢,或者需要发起新的IO请求,比如需要查询数据库,则必须派发到线程池,否则IO线程阻塞,将导致不能接收其它请求。

需要通过不同的派发策略和不同的线程池配置的组合来应对不同的场景:

	<dubbo:protocol name="dubbo" dispatcher="all" threadpool="fixed" threads="100" />

根据请求的消息类被IO线程处理还是被业务线程池处理。

Dubbo提供了下面几种线程模型:

  all:所有消息都派发到线程池,包括请求、响应、连接事件、断开事件、心跳等。
  direct:所有消息都不派发到线程池,全部在IO线程上直接执行。
  message:只有请求响应消息派发到线程池,其它连接断开事件、心跳等消息,直接在IO线程上执行。
  execution:只请求消息派发到线程池,不含响应,响应和其它连接断开事件,心跳等消息,直接在IO线程上执行。
  connection:在IO线程上,将连接断开事件放入队列,有序逐个执行,其它消息派发到线程池。

Dubbo提供的线程池策略,扩展接口ThreadPool的SPI实现有如下几种:

  fixed:固定大小线程池,启动时建立线程,不关闭,一直持有(缺省)。
  cached:缓存线程池,空闲一分钟自动删除,需要时重建。
  limited:可伸缩线程池,但池中的线程数只会增长不会收缩。只增长不收缩的目的是为了避免收缩时突然来了大流量引起的性能问题。

2.5、协议比较


dubbo(默认)

  单一长连接和NIO异步通讯,适合大并发小数据量的服务调用,以及消费者远大于提供者。


  Dubbo协议适用常见:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者(并发量很高),尽量不要用Dubbo协议传输大文件或超大字符串。

如下图所示:


  为了要支持高并发场景,一般是服务提供者就几台机器,但是服务消费者有上百台,可能每天调用量达到上亿次!此时用长连接是最合适的,就是跟每个服务消费者维持一个长连接就可以,可能总共就 100 个连接。然后后面直接基于长连接 NIO 异步通信,可以支撑高并发请求。

        长连接,就是建立连接过后可以持续发送请求,无须再建立连接。

Dubbo允许配置多协议,在不同服务上支持不不同协议或者同一服务上同时支持多种协议。

2.6、总结

通过上面的介绍,可以概括为三层。

        通过 Spring Boot 整合 Dubbo,我们可以清晰地看到 Dubbo 各层是如何协同工作的,同时 Spring Boot 的自动配置大大简化了 Dubbo 的配置和使用。


3、原理

1、节点

如下图所示:

节点角色说明:

  • Provider:暴露服务的服务提供方
  • Container:服务运行容器
  • Consumer:调用远程服务的服务消费方
  • Registry:服务注册与发现的注册中心
  • Monitor:统计服务的调用次数和调用时间的监控中心

2.工作过程(Dubbo服务启动,调用,暴露消费的过程):

如下图所示:

1、服务容器负责启动,加载,运行服务提供者。


2、服务提供者在启动时,向注册中心注册自己提供的服务。


3、服务消费者在启动时,向注册中心订阅自己所需的服务。


4、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者(注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外。注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者。

5、注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表。)。


6、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。


7、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。


4、dubbo 高级特性

根据dubbo的分层架构可知,每层都有对应的特性。


1.序列化
dubbo 内部已经将序列化和反序列化的过程内部封装了
我们只需要在定义pojo类时实现Serializable接口即可
一般会定义一个公共的pojo模块,让生产者和消费者都依赖该模块。


2.地址缓存
假如注册中心挂了,服务是否可以正常访问?

可以,因为dubbo服务消费者在第一次调用时,会将服务提供方地址缓存到本地,以后在调用则不会访问注册中心。
当服务提供者地址发生变化时,注册中心会通知服务消费者。

3.超时与重试

  • 服务消费者在调用服务提供者的时候发生了阻塞、等待的情形,这个时候,服务消费者会一直等待下去。
  • 在某个峰值时刻,大量的请求都在同时请求服务消费者,会造成线程的大量堆积,势必会造成雪崩。

解决办法:
(1)设置超时和重试机制
dubbo 利用超时机制来解决这个问题,设置一个超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。
使用timeout属性配置超时时间,默认值1000,单位毫秒。
设置了超时时间,在这个时间段内,无法完成服务访问,则自动断开连接。
如果出现网络抖动,则这一次请求就会失败。
Dubbo 提供重试机制来避免类似问题的发生。
通过 retries 属性来设置重试次数。默认为 2 次。

4.多版本

  • 灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
  • dubbo 中使用version 属性来设置和调用同一个接口的不同版本

可以控制服务使用范围

(1)代码如下

其实就是在服务生产者的service注解和服务消费者的Reference注解上加version属性,并确保值相同,才能访问的到。

5.负载均衡

负载均衡策略(4种):

  • Random :按权重随机,默认值。按权重设置随机概率。
  • RoundRobin :按权重轮询。
  • LeastActive:最少活跃调用数,相同活跃数的随机。
  • ConsistentHash:一致性 Hash,相同参数的请求总是发到同一提供者。

5.集群容错
集群容错模式:

Failover Cluster:失败重试。默认值。当出现失败,重试其它服务器 ,默认重试2次,使用 retries 配置。一般用于读操作
Failfast Cluster :快速失败,只发起一次调用,失败立即报错。通常用于写操作。
Failsafe Cluster :失败安全,出现异常时,直接忽略。返回一个空结果。
Failback Cluster :失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster :并行调用多个服务器,只要一个成功即返回。
Broadcast Cluster :广播调用所有提供者,逐个调用,任意一台报错则报错。

1.2.6.1 RPC需要解决的问题


通讯问题:

        主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。


寻址问题:

        A服务器上的应用怎么告诉底层的RPC框架,如何连接到B服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么,这样才能完成调用。比如基于Web服务协议栈的RPC,就要提供一个endpoint URI,或者是从UDDI服务上查找。如果是RMI调用的话,还需要一个RMI Registry来注册服务的地址。


序列化 与 反序列化:

        当A服务器上的应用发起远程过程调用时,方法的参数需要通过底层的网络协议如TCP传递到B服务器,由于网络协议是基于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送给B服务器。
同理,B服务器接收参数要将参数反序列化。B服务器应用调用自己的方法处理后返回的结果也要序列化给A服务器,A服务器接收也要经过反序列化的过程。


参考文章:

1、Dubbo详解,用心看这一篇文章就够了【重点】-CSDN博客

2、Dubbo(从入门到掌握)看完这一篇就够了-CSDN博客

相关文章:

深入探讨dubbo组件的实践

目录 1、dubbo概述 1.1、介绍 1.2、RPC 1.3、区别 1.4、优点 2、dubbo分层 2.1、层级分类 1. Service 服务层&#xff08;业务层&#xff09; 2. Config 配置层 3. Proxy 服务代理层 4. Registry 注册中心层 5. Cluster 集群容错层 6. Monitor 监控层 7. Protoco…...

2.1 微积分基本想法

总结性表达 微积分的核心思想在于用简单图形逼近复杂形状的面积。牛顿与莱布尼茨通过"以直代曲"的突破性思路&#xff0c;将曲线围成的面积分解为无限个矩形之和&#xff0c;形成两大核心工具&#xff1a; 极限思想&#xff1a;通过无限细分矩形底边&#xff08;Δ…...

学习threejs,使用Physijs物理引擎,加载各种几何体网格对象

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...

Excel分组计算求和的两种实现方案

文章目录 背景样例数据方案一、函数求和实现步骤 方案二、数据透视表实现步骤 背景 在Excel文档中&#xff0c;经常会进行数据的求和计算&#xff0c;可使用不同的方式实现&#xff0c;记录下来&#xff0c;方便备查。 样例数据 已有商品销量信息&#xff0c;包含销售日期、…...

nestjs[一文学懂如何在nestjs中对npm功能包封装]

问题描述 NPM&#xff08;Node Package Manager&#xff09;是Node.js的包管理工具&#xff0c;它允许开发者轻松地分享、安装和管理依赖包&#xff0c;促进了代码的复用性和项目协作。而npm插件库将是nodejs开发中不可缺失的重要组成因素。 在nestjs中&#xff0c;官方已经给…...

PHP 连接和使用 Kafka 的指南

首先说明&#xff0c;我的是系统版本是&#xff1a;Ubuntu 22.04.3&#xff0c;下面是详细步骤 ###### PHP 连接和使用 Kafka 的指南 ###### # 安装依赖 sudo apt-get install -y librdkafka-dev # 安装必要的依赖 # 对于 Ubuntu/Debian sudo apt-get update sudo apt-get in…...

# 07_Elastic Stack 从入门到实践(七)---1

07_Elastic Stack 从入门到实践(七)—1 一、Filebeat入门之读取 Nginx 日志文件 1、首先启动 Elasticsearch 集群 和 Nginx 服务,打开GoogleChrome 浏览器,点击 elasticsearch-head 插件,连接Elasticsearch 集群 服务器。 # 查看网卡名 $ ip addr# 修改网卡配置,改为…...

CSS-PureCss样式开发

CSS-PureCss样式开发 1-开发说明 1-引入Pure.css2-直接拷贝代码 2-参考网址 purecss中文网 3-代码模板 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"wid…...

学习笔记:Conda 环境共享

1. 环境共享的重要性 环境共享是协作项目中非常实用的功能&#xff0c;它能确保整个项目的协作人员都使用相同的软件包&#xff0c;并保证这些包的版本正确。这可以避免因环境配置不同而导致的“在我的机器上可以运行”之类的问题。 2. 导出当前环境配置 如果需要将当前的 C…...

蓝牙AVDTP协议概述

1.AVDTP 概念 AVDTP 即 AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL&#xff08;音视频分配传输协 议&#xff09;&#xff0c;主要负责 A/V stream 的协商、建立及传输程序&#xff0c;还指定了设备之前传输 A/V stream 的消息格式. AVDTP 的传输机制和消息格式是以 RTP 为基…...

Java面试终极篇:Sentinel+Seata+Kafka Streams高并发架构实战

面试官&#xff1a;张总&#xff08;严肃脸&#xff09; 程序员&#xff1a;小王&#xff08;紧张冒冷汗&#xff09; 第一轮&#xff1a;分布式基础 张总&#xff1a;说说Spring Cloud Alibaba的Sentinel和Nacos的区别&#xff1f; 小王&#xff1a;&#xff08;结巴&#…...

提权相关记录

Windows potato本地提权 常见potato提权&#xff1a;BadPotato、EfsPotato、SweetPotato、JuicyPotato0、PrintNotifyPotato、RottenPotato 提权前置条件&#xff1a;拥有SeImpersonatePrivilege或SeAssignPrimaryTokenPrivilege权限其中一个。 可以通过命令whoami /priv或whoa…...

信息化、数字化、数智化之间的区别和联系

在如今这个信息技术飞速发展的时代&#xff0c;我们常常会听到“信息化”、“数字化”和“数智化”这三个术语。对于大多数人来说&#xff0c;这些词汇听起来既高深又晦涩&#xff0c;但其实它们和我们的生活、工作密切相关。如果你能理解它们的概念与区别&#xff0c;你不仅能…...

制造业IT管理方法论:柔性变更与数据治理的融合实践

1. 引言 随着工业4.0时代的深入发展&#xff0c;信息技术&#xff08;IT&#xff09;与运营技术&#xff08;OT&#xff09;的融合日益紧密&#xff0c;对制造企业的IT管理提出了前所未有的挑战与机遇。传统的IT管理框架&#xff0c;如ITIL&#xff08;信息技术基础架构库&…...

深入了解 gmx_RRCS:计算原理、操作步骤及输出文件解析

前段时间&#xff0c;我写了一篇介绍gmx_RRCS的推文&#xff0c;之后有不少人希望我能再出一个更详细的版本&#xff0c;尤其是对gmx_RRCS输出文件含义进行解读。大家的反馈我都看到了&#xff0c;所以准备再写一篇&#xff0c;仔细讲讲输出文件里各项内容是什么意思&#xff0…...

MySQL 8.0 OCP 1Z0-908 题目解析(1)

题目001 Choose two. User fwuserlocalhost is registered with the SQL Enterprise Firewall and has been granted privileges for the sakila database. Examine these commands that you executed and the results: mysql> SELECT MODE FROM INFORMATION_SCHEMA.SQL…...

【漫话机器学习系列】254.假设空间(Hypothesis Space)

假设空间&#xff08;Hypothesis Space&#xff09;详解&#xff1a;理解模型选择的核心概念 在机器学习、深度学习、统计建模等领域&#xff0c;我们常常会听到一个专业术语——假设空间&#xff08;Hypothesis Space&#xff09;。假设空间的理解&#xff0c;直接关系到模型…...

【Game】Powerful——Hero Trial(11)

文章目录 1、阵容推荐2、第一章 绝望之境3、第二章 万剑之殇4、第三章 自然之力5、第四章 1、阵容推荐 我一般都是&#xff0c;三物理&#xff0c;一封&#xff0c;一辅助&#xff0c;或者双物理一法系&#xff0c; 物理优先单攻的&#xff0c;比如天策、五庄、天魔&#xff0…...

Java MVC

在软件开发中&#xff0c;MVC&#xff08;Model-View-Controller&#xff09;是一种常用的设计模式&#xff0c;它将应用程序分为三个核心部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。这…...

单片机Day10

对向流水 #include <REGX51.H> typedef unsigned int u16; typedef unsigned char u8; #define led P2 void delay_10us(u16 t) { while(t--); } void main() { while(1) { P20x7e; delay_10us(50000); P20xbd; delay_10us(50000); P20xdb; delay_10us(50000); P20xe7; …...

大语言模型训练的两个阶段

先说结论&#xff1a;第一阶段在云平台训练至收敛 第二阶段本地GPU微调 一、阶段划分的核心逻辑 阶段目标资源特点典型耗时占比成本敏感度预训练获取通用表征能力需要大规模分布式计算70-90%高&#xff08;追求每美元算力&#xff09;微调适配特定任务需要领域数据安全/低延迟…...

ACL访问控制列表:access-list 10 permit 192.168.10.1

ACL访问控制列表 标准ACL语法 1. 创建ACL access-list <编号> <动作> <源IP> <通配符掩码> // 编号范围 1-99 // 动作&#xff1a;permit 允许 、 deny 拒绝2. 示例 //允许192.168.1.0/24g整个网络,0.0.0.255 反掩码 access-list 10 permit 192.1…...

高粘度、强腐蚀介质解决方案:V型气动带手动活塞式开关调节球阀的五大核心优势-耀圣控制

高粘度、强腐蚀介质解决方案&#xff1a;V型气动带手动活塞式开关调节球阀的五大核心优势 在石油化工、污水处理、锂电材料等工业场景中&#xff0c;含有颗粒的高粘度介质、料浆及强腐蚀性流体对阀门的性能提出了极高要求。传统球阀易因介质沉积、腐蚀或卡阻导致失效&#xff…...

后端开发面试高频50个问题,简单解答

以下是后端开发面试中常见的50个高频问题及其详细解答&#xff0c;涵盖了语言基础、数据库、网络、操作系统、设计模式等多个方面&#xff1a; 编程语言基础 Java 中的 final 关键字有什么作用&#xff1f; final 可以修饰类、方法和变量。修饰类时&#xff0c;类不能被继承&am…...

LayerNorm vs RMSNorm 技术对比

1. 核心概念 LayerNorm (层归一化) 思想&#xff1a;对单个样本的所有特征维度进行归一化目标&#xff1a;使每个样本的特征分布 μ 0 \mu0 μ0&#xff0c; σ 1 \sigma1 σ1特点&#xff1a;同时调整均值和方差 RMSNorm (均方根归一化) 思想&#xff1a;基于均方根的简…...

基于SpringBoot的校园周边美食探索及分享平台【附源码+数据库+文档下载】

一、项目简介 本项目是一个基于 SpringBoot Vue 的校园周边美食探索与分享平台&#xff0c;专为在校大学生开发&#xff0c;集美食推荐、好友互动、收藏分享于一体。 通过平台&#xff0c;用户可以探索学校周边的美食店铺、发布美食鉴赏、添加好友进行交流分享。同时&#x…...

开启WSL的镜像网络模式

开启WSL的镜像网络模式 前提 Windows主机系统版本高于Windows 11 22H2。WLS版本>2.0。 可输入wsl --version查看当前系统wsl版本。 修改设置 图形界面修改 在开始菜单中搜索&#xff1a;wsl settings&#xff0c;结果如下图所示&#xff1a; 点击“打开”&#xff0…...

传导发射中的模拟手

“模拟手”是按照国际 EMC 标准&#xff08;如 CISPR 16-1-2, CISPR 22, GB/T 9254 等&#xff09;中规定的&#xff0c;用于 测试带有接地金属外壳或信号线接口设备在接地或金属表面触摸时的传导发射性能。有些设备在“无触摸”时能通过传导发射&#xff0c;但一旦接地或接手&…...

Femap许可使用统计与分析

在电磁仿真领域&#xff0c;Femap作为一款高效且功能强大的工具&#xff0c;广泛应用于各种复杂场景。随着企业规模的扩大和团队协作的加强&#xff0c;如何有效地管理和利用Femap许可证资源成为了关注的焦点。本文将向您介绍Femap许可使用统计与分析的重要性&#xff0c;以及如…...

接口自动化测试设计思路--设计实战

课程&#xff1a;B站大学 记录python学习&#xff0c;直到学会基本的爬虫&#xff0c;使用python搭建接口自动化测试就算学会了&#xff0c;在进阶webui自动化&#xff0c;app自动化 接口自动化测试设计思路 如何进行接口自动化测试设计思路&#xff1f;1. 背景2. 设计目标3. 框…...

华为FAT AP配置 真机

FAT AP 的主要特点 特性说明独立工作不需要AC&#xff08;无线控制器&#xff09;&#xff0c;自己处理认证、加密、漫游等功能。内置完整功能支持SSID、安全策略&#xff08;WPA/WPA2&#xff09;、VLAN、QoS、DHCP等。适合小型网络适用于家庭、小企业、分支机构等少量AP的场…...

Node.js中那些常用的进程通信方式

文章目录 1 什么是子进程?2 核心方法详解2.1 `child_process.spawn(command, [args], [options])`2.2 `child_process.exec(command, [options], callback)`2.3 `child_process.execFile(file, [args], [options], callback)`2.4 `child_process.fork(modulePath, [args], [op…...

spring中的@PropertySource注解详解

一、核心功能与作用 PropertySource是Spring框架中用于加载外部配置文件的核心注解&#xff0c;主要作用是将属性文件&#xff08;如.properties、.yml&#xff09;的键值对加载到Spring的Environment环境中&#xff0c;实现配置与代码的解耦。其核心价值包括&#xff1a; 外部…...

软件设计师-错题笔记-系统开发与运行

1. 解析&#xff1a; A&#xff1a;模块是结构图的基本成分之一&#xff0c;用矩形表示 B&#xff1a;调用表示模块之间的调用关系&#xff0c;通过箭头等符号在结构图中体现 C&#xff1a;数据用于表示模块之间的传递的信息&#xff0c;在结构图中会涉及数据的流向等表示 …...

豆瓣电影Top250数据工程实践:从爬虫到智能存储的技术演进(含完整代码)

目录 引言:当豆瓣榜单遇见大数据技术 项目文档 1.1 选题背景 1.2 项目目标 2. 项目概述 2.1 系统架构设计 2.2 技术选型 2.3 项目环境搭建 2.3.1 基础环境准备 2.3.2 爬虫环境配置 2.3.3 Docker安装ES连接Kibana 安装IK插件 2.3.4 vscode依赖服务安装 3. 核心模…...

【Dv3Admin】工具数据验证配置文件解析

在 Django Rest Framework (DRF) 中&#xff0c;数据验证是确保系统安全和稳定运行的核心部分。dvadmin/utils/validator.py 提供了定制化的验证器&#xff0c;扩展了 DRF 默认的验证功能&#xff0c;帮助开发者在处理字段唯一性验证、数据查询等方面更为高效和安全。 本文详细…...

ExcelJS库的使用

ExcelJS 安装 npm install exceljs新的功能! Merged fix: styles rendering in case when “numFmt” is present in conditional formatting rules (resolves #1814) #1815. Many thanks to andreykrupskii for this contribution!Merged inlineStr cell type support #15…...

主从架构:技术原理与实现

一.简单介绍分布式锁的复习 今天在一个分布式锁的视频讲解中&#xff0c;提到了主从架构&#xff0c;所以有了这篇文章。 当然我们可以先说说分布式锁&#xff0c;可以使用redis的setnxlua脚本实现&#xff0c;或者也可以用redission实现&#xff0c;或者看门狗机制。 由看门…...

8天Python从入门到精通【itheima】-1~5

目录 1节&#xff1a; 1.Python的优势&#xff1a; 2.Python的独具优势的特点&#xff1a; 2节-初识Python&#xff1a; 1.Python的起源 2.Python广泛的适用面&#xff1a; 3节-什么是编程语言&#xff1a; 1.编程语言的作用&#xff1a; 2.编程语言的好处&#xff1a;…...

JVM之垃圾回收器

部分内容来源&#xff1a;JavaGuide&#xff0c;二哥Java 垃圾回收器快速复习 JDK 8: Parallel Scavenge&#xff08;新生代&#xff09; Parallel Old&#xff08;老年代&#xff09; JDK8: Serial Serial Old JDK 9 ~ JDK22: G1 新生代&#xff1a;标记-复制算法 老年代&…...

【K8S学习之生命周期钩子】详细了解 postStart 和 preStop 生命周期钩子

0. 参考 Kubernetes容器生命周期 —— 钩子函数详解&#xff08;postStart、preStop&#xff09; - 人艰不拆_zmc - 博客园详解Kubernetes Pod优雅退出 - 人艰不拆_zmc - 博客园 1. Kubernetes 生命周期钩子概述 在 Kubernetes 中&#xff0c;生命周期钩子&#xff08;Lifec…...

深度强化学习有什么学习建议吗?

什么是强化学习&#xff1f; 广泛地讲&#xff0c;强化学习是机器通过与环境交互来实现目标的一种计算方法。机器和环境的一 轮交互是指&#xff0c;机器在环境的一个状态下做一个动作决策&#xff0c;把这个动作作用到环境当中&#xff0c;这个环 境发生相应的改变并且将相应…...

Flutter - UIKit开发相关指南 - 控制器,主题,表单

环境 Flutter 3.29 macOS Sequoia 15.4.1 Xcode 16.3 控制器(ViewControllers) 在UIKit中,通过ViewController控制数据在视图上展现,多个ViewController组合在一起构建复杂的用户界面。在Flutter中,因为所有都是Widget,所以ViewController相关的功能也由Widget来承担。 生命周…...

嵌入式软件开发常见warning之 warning: implicit declaration of function

文章目录 &#x1f9e9; 1. C 编译流程回顾&#xff08;背景&#xff09;&#x1f4cd; 2. 出现 warning 的具体阶段&#xff1a;**编译阶段&#xff08;Compilation&#xff09;**&#x1f9ec; 2.1 词法分析&#xff08;Lexical Analysis&#xff09;&#x1f332; 2.2 语法分…...

AI赋能安全生产,推进数智化转型的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。用…...

(六)毛子整洁架构(测试)

文章目录 项目地址一、 项目地址 教程作者&#xff1a;教程地址&#xff1a; 代码仓库地址&#xff1a; 所用到的框架和插件&#xff1a; dbt airflow一、...

Vue3 Echarts 3D饼图(3D环形图)实现讲解附带源码

文章目录 前言一、准备工作1. 所需工具2. 引入依赖方式一&#xff1a;CDN 快速引入方式二&#xff1a;npm 本地安装&#xff08;推荐&#xff09; 二、实现原理解析三、echarts-gl 3D插件 使用回顾grid3D 常用通用属性&#xff1a;series 常用通用属性&#xff1a;surface&…...

Java大师成长计划之第20天:Spring Framework基础

&#x1f4e2; 友情提示&#xff1a; 本文由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;平台gpt-4o-mini模型辅助创作完成&#xff0c;旨在提供灵感参考与技术分享&#xff0c;文中关键数据、代码与结论建议通过官方渠道验证。 在Java开发领域&#xff0c;Spring …...

WebSocket集成方案对比

​ WebSocket集成方案对比与实战 架构选型全景图 #mermaid-svg-BEuyOkkoP6cFygI0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-BEuyOkkoP6cFygI0 .error-icon{fill:#552222;}#mermaid-svg-BEuyOkkoP6cFygI0 .er…...

新能源汽车电池加热技术:传统膜加热 vs. 脉冲自加热

在新能源汽车的普及过程中&#xff0c;低温环境下的电池性能一直是影响用户体验的关键问题。当温度低于0C时&#xff0c;锂电池的内阻增大&#xff0c;充放电效率下降&#xff0c;续航缩短&#xff0c;甚至可能因低温充电导致电池损坏。 引言&#xff1a;电池低温性能衰减机理 …...