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

在项目中同时使用SpringCloud和Dubbo,注册中心选用Eureka?

文章目录

  • 一、前置知识
    • 1、在Spring Boot中使用Dubbo?
      • 1)配置服务提供者
      • 2)配置服务消费者
    • 2、在Spring Boot中使用Eureka?
      • 1)Eureka服务
      • 2)Eureka客户端
  • 二、项目代码分析
    • 1、dubbo服务提供者
      • 1)启动类
      • 2)配置类
        • 标签过滤器
        • 提供者过滤器
    • 2、dubbo服务消费者/Controller
      • 1)启动类
      • 2)配置类
        • ConsumerFilter
        • TagRouterFilter
    • 3、Eureka服务端
      • 1)启动类
      • 2)配置类
    • 4、Eureka客户端
      • 1)启动类
      • 2)配置类
  • 三、总结
    • 思考题
      • 1、Dubbo可以使用的注册中心?
      • 2、Dubbo集成使用Eureka和Zookeeper有什么区别?
      • 3、服务A只注册到Eureka,Dubbo服务提供者B注册到Zookeeper,此时,服务A可以调用到B?
      • 4、对外提供API访问的服务同时注册到了Eureka和Zookeeper中,两个独立注册中心,需要同步机制来保证一致性?
      • 5、对外提供API访问的服务为什么要同时注册到了Eureka和Zookeeper?

一、前置知识

1、在Spring Boot中使用Dubbo?

需要配置服务提供者和服务消费者
引入Dubbo相关依赖:

<dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.8</version>
</dependency>

1)配置服务提供者

1、在配置文件中配置Dubbo的相关信息:

# Dubbo应用名称
dubbo.application.name=forlan-provider
# Dubbo注册中心地址
dubbo.registry.address=zookeeper://localhost:2181
# Dubbo服务协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

2、在服务提供者的启动类上添加@EnableDubbo注解:

@SpringBootApplication
@EnableDubbo
public class ForlanProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
}

3、编写服务提供者的接口和实现类:

public interface HelloService {String sayHello(String name);
}@Service
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "Hello, " + name + "!";}
}

2)配置服务消费者

1、在配置文件中配置Dubbo的相关信息:

# Dubbo应用名称
dubbo.application.name=forlan-consumer
# Dubbo注册中心地址
dubbo.registry.address=zookeeper://localhost:2181
# Dubbo服务协议
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

2、在服务消费者的启动类上添加@EnableDubbo注解:

@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}

3、编写服务消费者的代码:

@RestController
public class HelloController {@Referenceprivate HelloService helloService;@GetMapping("/hello")public String sayHello(@RequestParam String name) {return helloService.sayHello(name);}
}

2、在Spring Boot中使用Eureka?

需要配置Eureka服务器和客户端

1)Eureka服务

添加Eureka依赖:在您的pom.xml文件中添加以下依赖项:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

添加配置
什么都不配,Eureka服务的默认端口号是8761
配置Eureka服务器:在您的Spring Boot应用程序的主类上添加@EnableEurekaServer注解,以将应用程序标记为Eureka服务器

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

2)Eureka客户端

添加以下依赖项

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

添加配置

spring.application.name=forlan
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka

启用Eureka客户端:在您的Spring Boot应用程序的主类上添加@EnableDiscoveryClient注解,以将应用程序标记为Eureka客户端。例如:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient
public class ForlanApplication {public static void main(String[] args) {SpringApplication.run(ForlanApplication .class, args);}
}

完成上述配置后,您的Spring Boot应用程序将作为Eureka客户端注册到Eureka服务器,并可以通过Eureka服务器进行服务发现和负载均衡。

二、项目代码分析

1、dubbo服务提供者

1)启动类

@SpringBootApplication
@EnableDubbo
public class ForlanProviderApplication {public static void main(String[] args) {SpringApplication.run(ForlanProviderApplication.class, args);}
}

2)配置类

# Dubbo应用名
dubbo.application.name=forlan-provider
# 设置应用日志记录器,如Log4j、Logback和Java自带的JUL(Java Util Logging),来记录Dubbo框架的日志信息
dubbo.application.logger=slf4j
# 扫描注册com.forlan包下的所有服务接口
dubbo.scan.base-packages=com.msedu.study
# Dubbo协议名称
dubbo.protocol.name=dubbo
# Dubbo协议端口号
dubbo.protocol.port=20883
# Dubbo协议使用的线程池类型为fixed(固定大小线程池)
dubbo.protocol.threadpool=fixed
# Dubbo协议使用的线程数量为1000,表示同时处理的请求数量
dubbo.protocol.threads=1000
# Dubbo协议使用的线队列长度为2000,当线程数达到最大值时,新请求会被放入任务队列中等待处理
dubbo.protocol.queues=2000
# 服务提供者的标签,可以设置不同环境为不同标签
dubbo.provider.tag=v2.8
# apiVersionFilter 版本过滤器,保证tag延续
dubbo.provider.filter=apiVersionFilter,providerFilter
# Dubbo使用的注册中心为zookeeper,地址为zk-cs:2181
dubbo.registry.address=zookeeper://zk-cs:2181
# 指定额外的注册中心键和值
dubbo.registry.extra-keys=default.dubbo.tag
# 使用简化的注册中心实现来减少注册中心的复杂性和性能开销
dubbo.registry.simplified=true
# Dubbo不在启动时检查注册中心的可用性
dubbo.registry.check=false
# 在Dubbo中,注册中心可以按照不同的分组来进行管理和区分,这里指定注册中心的分组为 `formal` 
dubbo.registry.group=formal# 省略其它无关配置...
标签过滤器

添加过滤器传递dubbo.tag,用于标识和区分不同的服务

import org.apache.dubbo.rpc.Filter;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcContext;
import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.common.Constants;public class ApiVersionFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {String version = invocation.getAttachment("dubbo.tag");if (StringUtil.isNotEmpty(version)) {RpcContext.getContext().setAttachment("dubbo.tag", version);}Result result = invoker.invoke(invocation);return result;}}
提供者过滤器

在每个rpc被调用前执行特定逻辑,清空本地线程变量

import org.apache.dubbo.common.Constants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.Filter;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Invoker;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcException;@Activate(group = "provider",value = "providerFilter")
public class ProviderFilter implements Filter{@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {// 清空本地线程变量ThreadLocalUtil.clearThreadVarible();Result result = invoker.invoke(invocation);return result;}
}

2、dubbo服务消费者/Controller

1)启动类

@SpringBootApplication
@EnableDiscoveryClient
@EnableDubbo
public class ForlanRestApplication {public static void main(String[] args) {SpringApplication.run(ForlanRestApplication.class, args);}
}

@EnableDiscoveryClient的作用:服务注册到服务注册中心,并且能够发现其他注册的微服务实例
@EnableDubbo的作用:启用Dubbo服务,标识该类作为Dubbo服务的提供者或消费者

2)配置类

# Dubbo应用名
dubbo.application.name=forlan-consumer
# 设置应用日志记录器,如Log4jLogbackJava自带的JULJava Util Logging),来记录Dubbo框架的日志信息
dubbo.application.logger=slf4j
# 扫描注册com.forlan包下的所有服务接口
dubbo.scan.base-packages=com.forlan
# Dubbo协议名称
dubbo.protocol.name=dubbo
# Dubbo协议端口号
dubbo.protocol.port=20880
# 消费者在启动时是否检查服务提供者的可用性,false表示在调用服务时才检查
dubbo.consumer.check=false
# 消费者调用服务的超时时间,这里设置为50秒
dubbo.consumer.timeout=50000
# 消费者在服务调用失败时的重试次数,默认值为0,表示不进行重试
dubbo.consumer.retries=0
# 消费者使用的过滤器链
dubbo.consumer.filter=consumerFilter,-consumercontext,tagRouterFilter
# Dubbo使用的注册中心为zookeeper,地址为zk-cs:2181
dubbo.registry.address=zookeeper://zk-cs:2181
# 指定额外的注册中心键和值
dubbo.registry.extra-keys=default.dubbo.tag
# 使用简化的注册中心实现来减少注册中心的复杂性和性能开销
dubbo.registry.simplified=true
# Dubbo不在启动时检查注册中心的可用性
dubbo.registry.check=false
# 在Dubbo中,注册中心可以按照不同的分组来进行管理和区分,这里指定注册中心的分组为 `formal` 
dubbo.registry.group=formal
# 省略其它无关配置...
ConsumerFilter

获取公共参数(accessToken、requestUUID),从本地线程取,设置到dubbo接口上下文中

import com.msedu.common.utils.ThreadUtil;
import org.apache.dubbo.common.Constants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;@Activate(group = "consumer",value = "consumerFilter")
public class ConsumerFilter implements Filter{@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {Result result = null;try {// 调用dubbo接口前存入上下文参数String accessToken = (String) ThreadUtil.get("accessToken");String requestUUID = (String) ThreadUtil.get("requestUUID");RpcContext.getContext().setAttachment("accessToken", accessToken);RpcContext.getContext().setAttachment("requestUUID", requestUUID);result = invoker.invoke(invocation);}catch(Exception e) {throw e;}return result;}}
TagRouterFilter

项目中配置了-consumercontext,表示移除默认的ConsumerContextFilter,用TagRouterFilter替换,之所以要替换,是因为dubbo自带的过滤器会在调用完成之后清理掉Attachments,由于我们需要在Attachments中保留dubbo.tag,否则无法找到对应的服务,这就是TagRouterFilter的作用,其实就是保留了tag路由,RpcContext.getContext().setAttachment(“dubbo.tag”, invocation.getAttachment(“dubbo.tag”))

@Activate(group = "consumer", order = -10000)
public class TagRouterFilter implements Filter {@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {RpcContext.getContext().setInvoker(invoker).setInvocation(invocation).setLocalAddress(NetUtils.getLocalHost(), 0).setRemoteAddress(invoker.getUrl().getHost(), invoker.getUrl().getPort());if (invocation instanceof RpcInvocation) {((RpcInvocation) invocation).setInvoker(invoker);}try {RpcContext.removeServerContext();return invoker.invoke(invocation);} finally {RpcContext.getContext().clearAttachments();}}@Overridepublic Result onResponse(Result result, Invoker<?> invoker, Invocation invocation) {RpcContext.getServerContext().setAttachments(result.getAttachments());//保留tag路由RpcContext.getContext().setAttachment("dubbo.tag", invocation.getAttachment("dubbo.tag"));return result;}}

在Dubbo中,AbstractRouter是一个抽象类,用于实现路由策略。它的作用是根据一定的规则,决定将请求路由到哪个服务提供者。具体的路由策略可以通过继承AbstractRouter类并实现其中的方法来自定义。Dubbo提供了多种内置的路由策略,如基于标签、基于权重等。通过配置AbstractRouter的实现类,可以灵活地控制服务的路由行为。

3、Eureka服务端

1)启动类

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

2)配置类

# 客户端是否注册到eureka,默认true,这里为false
eureka.client.register-with-eureka=false
# 是否从Eureka服务器获取注册信息,如果单节点,不需要同步其他节点数据,用false
eureka.client.fetch-registry=false
# true:实例以IP的形式注册;false:实例以主机名的形式注册
eureka.instance.preferIpAddress=true
# 客户端注册到的Eureka服务器地址
eureka.client.serviceUrl.defaultZone=http://localhost:8300/eureka/
#Eureka服务器中用于清理过期实例的驱逐间隔时间,默认5000ms
eureka.server.evictionIntervalTimerInMs=5000
#  Eureka服务器更新响应缓存的时间间隔,服务器本地会缓存一份,确保响应性能,但又需要确保是最新的,需要定期拉取
eureka.server.responseCacheUpdateIntervalMs=5000 
# Eureka服务器是否使用只读响应缓存,false表示可以对缓存修改,一般建议false
eureka.server.use-read-only-response-cache=false
# Eureka服务器是否启用自我保护机制,默认true
eureka.server.enable-self-preservation=false

4、Eureka客户端

1)启动类

其实已经作为dubbo的消费者,一样的启动类

2)配置类

#eureka地址
eureka.client.serviceUrl.defaultZone=http://localhost:8300/eureka/
# 服务示例的版本号
eureka.instance.metadata-map.version=v2.8
# true:实例以IP的形式注册;false:实例以主机名的形式注册
eureka.instance.preferIpAddress=true
# Eureka客户端发送心跳保持租约的时间间隔,默认30s,这里设置为3s,即每3秒发送一次续约
eureka.instance.leaseRenewalIntervalInSeconds=3
# Eureka客户端租约到期时间,默认90s,这里设置为10s,即服务器10s内没收到心跳,则认为该实例不可用
eureka.instance.leaseExpirationDurationInSeconds=10
# true:客户端会从服务注册中心获取并缓存服务注册表的信息;false:仅使用本地缓存的信息,客户端默认为true
eureka.client.fetchRegistry=true
# 客户端获取服务注册表的间隔时间,即刷新本地缓存时间间隔,默认30s
eureka.client.registryFetchIntervalSeconds=5

一般的话,eureka.instance.leaseExpirationDurationInSeconds设置为eureka.instance.leaseRenewalIntervalInSeconds的两倍或更多,以确保在网络故障或其他问题时仍能保持可用

三、总结

在项目中,SpringCloud和Dubbo配置使用,其实还是注册到两个注册中心。

  • Eureka

网关和对外提供API访问的服务都注册到Eureka,主要是为了方便网关进行路由,网关可以从Eureka获取服务的注册信息,包括服务的主机和端口等信息。这样,网关就可以根据需要将请求路由到相应的服务实例上,实现请求的转发和负载均衡。同时,通过Eureka的服务发现机制,网关可以动态地获取服务实例的变化,以便及时更新路由规则。这种方式可以提高系统的灵活性和可扩展性,使网关能够自动适应服务实例的变化。

  • Zookeeper

相关service服务提供者和对外提供API访问的服务注册到Zookeeper,一方作为Dubbo服务提供者,一方作为Dubbo服务消费者,通过dubbo进行调用

总的来说,就是对外提供API访问的的服务,和网关一起注册到Eureka,方便网关路由,并且这些服务也作为Dubbo消费者,注册到Zookeeper,同时相关服务提供者注册到Zookeeper即可,两者通过Dubbo进行调用。

思考题

1、Dubbo可以使用的注册中心?

默认使用的是Zookeeper作为注册中心,还可以使用Eureka、Nacos作为注册中心。

2、Dubbo集成使用Eureka和Zookeeper有什么区别?

区别在于注册中心的选择和配置方式

  • 当集成Eureka时,注册中心使用的是Eureka,而集成Zookeeper时,注册中心使用的是Zookeeper
  • Eureka是基于RESTful的服务注册与发现组件,适用于微服务架构,而Zookeeper是一个分布式协调服务,适用于分布式系统

3、服务A只注册到Eureka,Dubbo服务提供者B注册到Zookeeper,此时,服务A可以调用到B?

可以,但需要在服务A中手动指定服务B的地址信息。如果想通过dubbo调用,是不可以的,因为服务A只注册到Eureka,而Dubbo默认使用的是Zookeeper作为注册中心,所以服务A无法通过Dubbo直接调用到服务B,那么服务A需要将自己注册到Zookeeper作为Dubbo的注册中心,才能拉取到服务注册列表,进行dubbo调用。

4、对外提供API访问的服务同时注册到了Eureka和Zookeeper中,两个独立注册中心,需要同步机制来保证一致性?

Eureka的心跳间隔默认为30秒,项目中设置为3s;而Zookeeper的心跳间隔为两倍的tickTime,默认情况下tickTime为2000毫秒(2秒),所以心跳间隔为4秒。两者的心跳间隔不一致,会导致服务状态出现短暂的不一致,可以调整心跳间隔保持一致,也可以需要使用同步处理机制。
具体方案有:

  1. 通过监听器机制:在服务注册时,可以注册监听器用于监听Eureka和Zookeeper中的服务变化。当服务状态发生变化时,监听器可以接收到通知,并更新另一个注册中心中的服务状态。
  2. 通过定时任务:定时任务可以周期性地检查Eureka和Zookeeper中的服务状态,如果发现状态不一致,则进行相应的同步操作。
  3. 通过事件驱动:当服务状态变化时,Eureka和Zookeeper可以发布事件通知其他服务节点,其他节点通过接收事件来进行状态同步。
  4. 双向注册中心同步:在服务注册或状态变更时,同时将变更信息同步到两个注册中心中,保证双方的服务状态一致性。

5、对外提供API访问的服务为什么要同时注册到了Eureka和Zookeeper?

  • 兼容性问题:为了保持兼容性,同时注册到两个注册中心,以便能够被不同的组件发现和调用
  • 弹性和高可用性要求:如果其中一个注册中心出现故障或不可用,另一个注册中心仍然可以正常工作,确保系统的稳定性
  • 跨平台支持:支持跨不同平台或技术栈的服务发现和调用

相关文章:

在项目中同时使用SpringCloud和Dubbo,注册中心选用Eureka?

文章目录 一、前置知识1、在Spring Boot中使用Dubbo&#xff1f;1&#xff09;配置服务提供者2&#xff09;配置服务消费者 2、在Spring Boot中使用Eureka&#xff1f;1&#xff09;Eureka服务2&#xff09;Eureka客户端 二、项目代码分析1、dubbo服务提供者1&#xff09;启动类…...

蓝凌EIS智慧协同平台saveImg接口任意文件上传漏洞复现 [附POC]

文章目录 蓝凌EIS智慧协同平台saveImg接口任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 蓝凌EIS智慧协同平台saveImg接口任意文件上传漏洞复现 [附POC] 0x01 前言 免责声明&…...

【好书推荐】《用户画像:平台构建与业务实践》

作者简介&#xff1a; 懒大王敲代码&#xff0c;正在学习嵌入式方向有关课程stm32&#xff0c;网络编程&#xff0c;数据结构,C/C等 哈喽&#xff01;各位铁汁们大家好啊&#xff0c;今天给大家推荐的的是机械工业出版社的 《用户画像&#xff1a;平台构建与业务实践》这本书&a…...

JavaScript进阶 第二天笔记

JavaScript 进阶 - 第2天 了解面向对象编程的基础概念及构造函数的作用&#xff0c;体会 JavaScript 一切皆对象的语言特征&#xff0c;掌握常见的对象属性和方法的使用。 了解面向对象编程中的一般概念能够基于构造函数创建对象理解 JavaScript 中一切皆对象的语言特征理解引用…...

AUTOSAR AP 硬核知识点梳理(2)— 架构详解

一 AUTOSAR 平台逻辑体系结构 图示逻辑体系结构描述了平台是如何组成的,有哪些模块,模块之间的接口是如何工作的。 经典平台具有分层的软件体系结构。定义明确的抽象层,每个抽象层都有精确定义的角色和接口。 对于应用程序,我们需要考虑使用的软件组件,希望它们是可重用的…...

k8s-----23、Taint和Toleration、污点和容忍

1、使用场景 生产环境部署规则 1、master节点不允许部署其他类型的pod节点 2、新增node节点需要经过测试才可投入使用&#xff0c;才允许pod部署在该节点 3、维护/升级node节点时&#xff0c;需要将节点上的pod提前进行迁移 4、特殊节点&#xff1a;比如这个节点是SSD/GPU类型…...

全面解析优化企业Microsoft 365网络的加速方案

您的员工是否有因为Microsoft 365频繁掉线、卡顿、无法登录而向IT部门抱怨过&#xff1f; 很多时候企业会以为是自身网络带宽不足才导致访问失败&#xff0c;但是在采取增加带宽的方案后&#xff0c;办公文档协同打开仍旧很慢&#xff0c;文件分享依旧需要等待较长的时间&…...

Xilinx MicroBlaze定时器中断无法返回主函数问题解决

最近在使用Xilinx 7系列FPGA XC7A100T时&#xff0c;运行MicroBlaze软核处理器&#xff0c;添加了AXI TIMER IP核&#xff0c;并使能定时器溢出中断&#xff0c;发现定时器触发中断后&#xff0c;无法返回主函数的问题&#xff0c;最后发现修改编译器优化等级就正常了。 FPGA型…...

Spark SQL概述与基本操作

目录 一、Spark SQL概述 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特点 &#xff08;3&#xff09;Spark SQL与Hive异同 &#xff08;4&#xff09;Spark的数据抽象 二、Spark Session对象执行环境构建 (1)Spark Session对象 &#xff08;2&#xff09;代码演…...

KDChart3.0编译过程-使用QT5.15及QT6.x编译

文章目录 参考原文一、下载KDChart源文件二、下载安装CMake三、编译Qt5.15.0 编译Qt6.x 编译使用Qt6.X编译的直接看这最快 四、使用测试方法一&#xff1a;测试方法二&#xff1a; 参考原文 记录我的KDChart3.0编译过程 系统&#xff1a;win11&#xff0c;Qt5.15 &#xff0c;编…...

一、PHP环境搭建[phpstorm]

一、安装 1.php编写工具 地址&#xff1a;https://www.jetbrains.com/phpstorm/download/#sectionwindows 图示&#xff1a; 2.php环境 解释&#xff1a;建议使用phpstudy进行安装&#xff0c;安装较为简单 链接&#xff1a;https://www.xp.cn/ 图示&#xff1a; 二、第…...

光影之梦2:动画渲染前后对比,揭示视觉艺术的惊人转变!

动画渲染是影视艺术中不可或缺的一环&#xff0c;它赋予了角色和场景鲜活的生命。渲染过程中的光影、色彩、材质等元素&#xff0c;像是画家的调色板&#xff0c;将平淡无奇的线条和形状转化为充满韵味与情感的画面。动画角色仿佛拥有了自己的灵魂&#xff0c;无论是一颦一笑&a…...

pytorch_lightning:Validation sanity check: 0%| | 0/2 [00:00<?, ?it/s]

在使用Lighting架构辅助训练时&#xff0c;对于出现的下述情况的原因&#xff1a; 解释&#xff1a; 注意到“ Validation sanity check ”。这是因为Lightning在开始训练之前进行了两批验证。这是一种单元测试&#xff0c;以确保如果你在验证循环中有一个bug&#xff0c;你不…...

2、Linux权限理解

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 前言 Linux权限的概念 1.文件访问者的分(人) 2.文件类型和访问权限(事物属性) 3.文件权限值的表示方法 4.文件访问权限的相关设置方法 file指令 目录的权限 粘滞位 关于权限的总结 前言 在开始Linux权限理…...

Linux 通过 sed 命令过滤指定日期的日志文件并输出到新文件

sed -n /2023-10-18T09:00:00/,/2023-10-18 12:00:00/p mysql_slow.log > out.log...

景联文科技:针对敏感数据的安全转录服务,护航信息安全

针对数据的安全转录服务&#xff0c;主要是为了确保数据在转录过程中的安全性和隐私保护。这些服务通常会采用一系列严格的安全措施&#xff0c;如数据加密、访问控制、数据脱敏等&#xff0c;以确保敏感数据不会被泄露或滥用。 景联文科技提供特定的数据转录服务&#xff0c;以…...

Excel宏(VBA)自动化标准流程代码

自动化流程 我们对一个报表进行自动化改造会经历的固定流程&#xff0c;这里称为“流水线”&#xff0c;通常包含以下流程&#xff1a; 打开一个表格选择打开的表格选择表格中的Sheet选择Sheet中的单元格区域 &#xff08;有时候需要按条件筛选&#xff09;复制某个区域 粘贴…...

vue vue3开发 vue2和vue3的选择

现在vue新建项目&#xff0c;官方给出的命令是 npm create vuelatest项目默认vue3&#xff0c;他是不支持IE11 如果想支持IE11用下面方法&#xff0c;项目vue2.7.7 npm create vuelegacy他们的打包工具默认vite&#xff0c;不是webpack。老手要注意生成的项目中的示例组件使…...

华为OD 数列描述(100分)【java】A卷+B卷

华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应往年部分考题以及新出的题目。 我将持续更新最新题目 我精选了一部分题目免费分享给大家,可前往夸克网盘转存,请点击以下链接进入: 我用夸克网盘分享了「华为OD题库J…...

μCOS-Ⅲ中断管理,这样理解非常简单!

μCOS-Ⅲ中断管理&#xff0c;这样理解非常简单&#xff01; 文章目录 μCOS-Ⅲ中断管理&#xff0c;这样理解非常简单&#xff01;前言一、中断源与中断优先级二、μCOS-Ⅲ的中断管理方式三、中断屏蔽与中断控制1、μCOS-Ⅲ中断开关2、μCOS-Ⅲ中断屏蔽应用——临界区4、μCOS…...

TDengine 集群容错与灾备

简介 为了防止数据丢失、误删操作&#xff0c;TDengine 提供全面的数据备份、恢复、容错、异地数据实时同步等功能&#xff0c;以保证数据存储的安全。本节简要说明 TDengine 中的容错与灾备。 容错 TDengine 支持 WAL 机制&#xff0c;实现数据的容错能力&#xff0c;保证数…...

MongoDB(七) - MongoDB副本集安装与配置

文章目录 前言一、下载MongoDB1. 下载MongoDB2. 上传安装包3. 创建相关目录 二、安装配置MongoDB1. 解压MongoDB安装包2. 重命名MongoDB文件夹名称3. 修改配置文件4. 分发MongoDB文件夹5. 配置环境变量6. 启动副本集7. 进入MongoDB客户端8. 初始化副本集8.1 初始化副本集8.2 添…...

鸿蒙OSUniApp离线优先数据同步实战:打造无缝衔接的鸿蒙应用体验#三方框架 #Uniapp

UniApp离线优先数据同步实战&#xff1a;打造无缝衔接的鸿蒙应用体验 最近在开发一个面向鸿蒙生态的UniApp应用时&#xff0c;遇到了一个有趣的挑战&#xff1a;如何在网络不稳定的情况下保证数据的实时性和可用性。经过一番探索和实践&#xff0c;我们最终实现了一套行之有效…...

基于大模型的数据库MCP Server设计与实现

基于大模型的数据库MCP Server设计与实现 引言 随着大语言模型(LLM, Large Language Model)能力的不断提升,AI Agent(智能体)正在从简单的对话问答,向更复杂的自动化任务执行和业务流程管理演进。在企业和开发者的实际需求中,数据库操作是最常见、最核心的场景之一。如…...

MMRL: Multi-Modal Representation Learning for Vision-Language Models(多模态表示学习)

摘要 预训练的VLMs,对于跨任务的迁移学习至关重要&#xff0c;然而&#xff0c;在few-shot数据集上微调会导致过拟合&#xff0c;降低在新任务上的性能。为解决这个问题&#xff0c;提出一种新的多模态表征学习框架&#xff08;MMRL&#xff09;,该框架引入了一个共享、可学习…...

力扣刷题(第四十四天)

灵感来源 - 保持更新&#xff0c;努力学习 - python脚本学习 删除重复的电子邮箱 解题思路 这个问题要求我们删除表中所有重复的电子邮箱&#xff0c;只保留每个唯一电子邮箱对应的最小id记录。解决这个问题的关键在于识别出哪些记录是重复的&#xff0c;并确定需要删除的…...

跨平台猫咪桌宠 BongoCat v0.4.0 绿色版

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://pan.xunlei.com/s/VORWH1a7lPhdwvon6DJgKvrNA1?pwdcw2h# 【​本章下载二】&#xff1a;https://pan.quark.cn/s/c3ac86f4e296 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…...

深入理解享元模式:用Java实现高效对象共享

享元模式&#xff08;Flyweight&#xff09;的核心思想是对象复用&#xff0c;通过共享技术减少内存占用&#xff0c;就像"共享单车"一样让多个调用者共享同一组细粒度对象。 什么是享元模式&#xff1f; 享元模式是一种结构型设计模式&#xff0c;它通过共享技术有…...

python常用库-pandas、Hugging Face的datasets库(大模型之JSONL(JSON Lines))

文章目录 python常用库pandas、Hugging Face的datasets库&#xff08;大模型之JSONL&#xff08;JSON Lines&#xff09;&#xff09;背景什么是JSONL&#xff08;JSON Lines&#xff09;通过pandas读取和保存JSONL文件pandas读取和保存JSONL文件 Hugging Face的datasets库Hugg…...

Python编程基础(二)| 列表简介

引言&#xff1a;很久没有写 Python 了&#xff0c;有一点生疏。这是学习《Python 编程&#xff1a;从入门到实践&#xff08;第3版&#xff09;》的课后练习记录&#xff0c;主要目的是快速回顾基础知识。 练习1&#xff1a; 姓名 将一些朋友的姓名存储在一个列表中&#xf…...