Java大师成长计划之第24天:Spring生态与微服务架构之分布式配置与API网关
📢 友情提示:
本文由银河易创AI(https://ai.eaigx.com)平台gpt-4-turbo模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。
在微服务架构中,如何管理多个微服务的配置以及如何统一管理所有微服务的请求路由是两个非常关键的问题。分布式配置管理和API网关是解决这些问题的核心技术。本文将深入探讨如何利用 Spring Cloud Config 实现分布式配置管理,以及如何通过 Spring Cloud Gateway 来实现统一的API网关功能。
一、分布式配置管理:Spring Cloud Config
在微服务架构中,随着服务数量的日益增加,每个服务都有自己的配置。这些配置可能包括数据库连接信息、消息队列设置、API 密钥等。在这种环境下,管理各个微服务的配置变得异常复杂。为了保持系统的灵活性和可维护性,分布式配置管理成为了不可或缺的一部分。Spring Cloud Config 是解决这一问题的有效方案,它为微服务提供了集中化的外部配置管理。接下来,我们将详细讨论 Spring Cloud Config 的工作原理、搭建步骤以及使用实例。
1.1 Spring Cloud Config 的工作原理
Spring Cloud Config 的设计理念是将应用程序的配置从应用程序代码中分离出来,以达到动态管理的目的。其主要构成包含两个部分:Config Server 和 Config Client。
1.1.1 Config Server
Config Server 是配置服务的核心部分,它负责理解配置存储的来源,并向各个微服务应用提供配置信息。通常,配置文件存储在 Git 仓库、SVN、文件系统等地方,Config Server 会定期从这些来源拉取最新的配置。
Config Server 的工作流程如下:
- 配置存储:配置文件可以存储在 Git 仓库的特定路径下,每个微服务的配置可以依据其服务名称和环境(如
dev
、test
、prod
)来管理。 - 配置访问:当某个微服务启动时,它会向 Config Server 发送请求,获取对应环境下的配置文件。
- 动态更新:微服务在运行中可以通过机制(例如 Spring Cloud的
@RefreshScope
注解)动态刷新配置,而无需重启服务。
1.1.2 Config Client
Config Client 是每一个微服务实例,负责与 Config Server 通信,获取所需的配置信息。Config Client 通过 HTTP 请求从 Config Server 中拉取配置信息,并将其加载到应用程序的上下文中。
Config Client 的工作流程包括:
- 注册服务:微服务在启动时会自动注册到 Config Server,告知服务名称和当前环境。
- 获取配置:微服务会根据自身的服务名称和环境变量向 Config Server 请求配置文件,并在成功后将这些配置加载到应用上下文中。
- 动态配置:微服务要实现动态配置,可以使用 Spring 提供的
@RefreshScope
注解,使配置在后续的请求中得到实时更新,确保应用按照最新配置运行。
1.2 Spring Cloud Config Server 的搭建
接下来,我们来具体看看如何搭建一个简单的 Spring Cloud Config Server,以便为微服务管理配置信息。
1.2.1 创建 Config Server 项目
-
使用 Spring Initializr
首先,通过 Spring Initializr 创建一个新的 Spring Boot 项目。从可选的依赖中选择 Spring Cloud Config Server。
-
添加 Maven 依赖
在生成的项目的
pom.xml
文件中,确保包含以下依赖:xml
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId> </dependency>
-
配置
application.yml
配置文件的
application.yml
将包括 Config Server 的基本设定,尤其是文件的存储方式。在此例中,我们可以使用 Git 作为配置文件的存储。yaml
server:port: 8888 # Config Server 的端口spring:cloud:config:server:git:uri: https://github.com/your-repository/config-repo # Git 仓库的地址clone-on-start: true # 启动时克隆配置search-paths: 'config' # 配置文件所在路径
1.2.2 启动 Config Server
-
配置启动类
在主启动类中添加
@EnableConfigServer
注解,启用 Config Server 功能。java
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer;@SpringBootApplication @EnableConfigServer // 开启 Config Server public class ConfigServerApplication {public static void main(String[] args) {SpringApplication.run(ConfigServerApplication.class, args); // 启动服务} }
-
运行 Config Server
启动 Config Server 并访问其端点。访问
http://localhost:8888
端口时,应该会看到服务列表及配置信息。
1.3 Spring Cloud Config Client 的配置
有了 Config Server 后,我们可以配置微服务客户端来从 Config Server 获取配置信息。
1.3.1 通过 Maven 配置 Config Client
-
添加依赖
在微服务项目的
pom.xml
中添加 Spring Cloud Config Client 的依赖:xml
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId> </dependency>
1.3.2 配置 application.yml
在 Config Client 中配置连接 Config Server 的信息,包括服务名称、Config Server 地址等:
yaml
spring:application:name: myapp # 微服务的名称cloud:config:uri: http://localhost:8888 # Config Server 的地址label: master # Git 仓库中的分支
1.3.3 使用动态配置
-
@RefreshScope
注解若要让微服务支持动态配置更新,需要在相关类(通常是控制器类)中使用
@RefreshScope
注解。这标识了该类支持实时刷新配置。java
import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;@RestController @RefreshScope // 使得该类支持动态更新 public class MyAppController {@Value("${myapp.greeting}") // 使用配置private String greeting;@GetMapping("/greeting")public String getGreeting() {return greeting; // 返回配置的内容} }
-
定义初始配置
在 Git 仓库中创建一个名为 myapp.yml
的配置文件,内容如下:
yaml
myapp:greeting: "Hello, Spring Cloud Config!" # 定义问候语
1.4 验证配置
-
启动微服务
启动微服务实例,访问
http://localhost:8080/greeting
端点,您应该能够看到从 Config Server 加载的配置内容。 -
动态刷新
当配置文件更新后,用户可以通过调用微服务的
/actuator/refresh
端点(需包含 Spring Boot Actuator 依赖)来刷新配置,通过@RefreshScope
注解实现实时更新。
1.5 总结
通过使用 Spring Cloud Config,微服务架构实现了分布式配置管理,将应用程序的配置信息集中存储和管理。Config Server 为各个微服务提供了动态和集中化的配置服务,显著简化了微服务的配置管理过程。通过动态配置及刷新机制,开发者可以有效地维护和更新各项配置,最大限度地减小系统运维的复杂性和出错率,将更多精力放在业务发展上。
二、API 网关:Spring Cloud Gateway
在微服务架构中,随着服务数量的不断增加,如何有效地管理服务间的流量,保证系统的高可用性、扩展性以及安全性,成为了一个亟待解决的问题。API 网关作为微服务架构的重要组成部分,它为所有客户端提供了统一的访问入口,并负责请求的路由、负载均衡、安全验证、限流等工作。Spring Cloud Gateway 是 Spring 团队开发的一个高效的 API 网关,基于 Spring WebFlux 构建,支持异步编程和响应式架构,能够处理高并发的请求。
2.1 Spring Cloud Gateway 的功能
Spring Cloud Gateway 提供了以下核心功能,这些功能可以帮助开发人员解决微服务架构中的许多复杂问题:
2.1.1 路由功能
API 网关的最基本功能是请求路由。Spring Cloud Gateway 可以根据请求的 URL、请求头、请求参数等信息,将请求路由到不同的微服务。Spring Cloud Gateway 提供了非常灵活的路由配置,允许开发者定义复杂的路由规则。
路由规则可以基于以下条件进行匹配:
- 请求路径(Path):根据请求的 URI 路径进行路由。
- 请求头(Headers):通过请求的头部信息来决定路由。
- 请求参数(Query Params):通过请求的查询参数来决定路由。
- HTTP 方法(Method):根据请求使用的 HTTP 方法(如 GET、POST)进行路由。
2.1.2 负载均衡
Spring Cloud Gateway 与 Spring Cloud的负载均衡工具(如 Ribbon)集成,能够根据负载均衡策略将请求转发到多个微服务实例中,从而有效提升系统的可用性和性能。通过负载均衡,API 网关可以动态选择负载较小的服务实例进行请求转发,避免单个服务实例的过载。
2.1.3 过滤器功能
Spring Cloud Gateway 提供了请求和响应的过滤器机制。过滤器是 API 网关中非常强大的功能,能够在请求路由的过程中进行处理。例如,可以在请求到达服务之前对请求进行验证、日志记录、限流等操作,也可以在响应返回给客户端之前对响应进行修改。
Spring Cloud Gateway 提供了以下几种类型的过滤器:
- 前置过滤器(Pre-filters):在请求被转发到后端微服务之前进行处理。常见的应用场景包括请求鉴权、日志记录、IP 黑名单等。
- 后置过滤器(Post-filters):在请求从微服务返回并返回给客户端之前进行处理。常见的应用场景包括响应压缩、响应头处理等。
- 全局过滤器(Global filters):与前置和后置过滤器不同,全局过滤器会在每个路由请求中生效,可以用于对所有请求进行统一处理。
2.1.4 安全和鉴权
API 网关通常作为所有客户端访问微服务的唯一入口,因此它需要对请求进行安全验证和鉴权。Spring Cloud Gateway 支持与常见的认证机制(如 OAuth 2.0、JWT)集成,从而实现对请求的身份验证和授权。
- JWT 认证:API 网关可以在请求中检查 JWT Token,确保请求的合法性。如果验证通过,则将请求转发给目标微服务;如果验证失败,则返回相应的错误信息。
- OAuth 2.0 认证:Spring Cloud Gateway 与 Spring Security 配合使用,支持 OAuth 2.0 的认证流程,保证只有授权的用户才能访问微服务资源。
2.1.5 限流与熔断
Spring Cloud Gateway 内置了限流和熔断功能,可以有效保护后端服务免受流量冲击,避免服务过载。
- 限流:API 网关可以设置请求的最大访问频率,超出频率的请求会被拒绝。可以基于请求的 IP 地址、路径、HTTP 方法等进行限流控制。
- 熔断:当后端服务不可用或响应时间过长时,API 网关可以启用熔断机制,快速返回失败响应,避免继续请求已不可用的服务。
2.1.6 动态路由
Spring Cloud Gateway 支持动态路由,即可以在运行时动态修改路由规则,而不需要重启服务。这对于需要灵活调整路由规则的场景(如 A/B 测试、蓝绿部署等)非常有用。
通过 Spring Cloud Config 或其他配置管理工具,Spring Cloud Gateway 可以在不重启网关的情况下实时获取配置更新,并自动更新路由规则。
2.2 Spring Cloud Gateway 的搭建
为了更好地理解 Spring Cloud Gateway 的使用,下面我们将展示如何搭建一个简单的 API 网关。
2.2.1 创建 Spring Boot 项目
首先,使用 Spring Initializr 创建一个新的 Spring Boot 项目,并选择以下依赖:
- Spring Cloud Gateway:API 网关的核心功能。
- Eureka Discovery Client(可选):如果我们想要使用 Eureka 注册中心进行服务发现。
- Spring Boot Actuator(可选):用于暴露健康检查、度量等端点。
在项目的 pom.xml
中,应该包含以下依赖:
xml
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.2.2 配置路由规则
在 application.yml
中配置 Spring Cloud Gateway 的路由规则。例如,下面的配置将所有访问 /api/**
的请求转发到 http://localhost:8081
的服务上。
yaml
spring:cloud:gateway:routes:- id: api_routeuri: http://localhost:8081 # 目标微服务的 URIpredicates:- Path=/api/** # 路由条件,根据路径匹配filters:- AddRequestHeader=X-Request-Foo, Bar # 为请求添加自定义请求头
2.2.3 启动网关服务
创建主启动类:
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication
@EnableDiscoveryClient // 启用 Eureka 客户端(如果使用 Eureka 注册中心)
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}
2.2.4 运行网关服务
启动网关应用程序后,网关将监听在默认的 8080 端口。访问 http://localhost:8080/api/**
路径时,所有的请求都会被路由到配置的目标微服务(例如 http://localhost:8081
)。
2.3 配置过滤器和限流
Spring Cloud Gateway 提供了多种过滤器,可以用于请求的前后处理。常见的过滤器使用场景包括日志记录、认证、限流等。
2.3.1 配置限流
Spring Cloud Gateway 提供了内置的限流功能,可以对请求进行流量控制。例如,下面的配置实现了基于 IP 地址的限流:
yaml
spring:cloud:gateway:routes:- id: api_routeuri: http://localhost:8081predicates:- Path=/api/** filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10 # 每秒生成 10 个请求redis-rate-limiter.burstCapacity: 20 # 最大容忍的请求数
2.3.2 配置认证过滤器
Spring Cloud Gateway 可以与 Spring Security 配合使用,实现请求的认证功能。例如,下面的配置为请求添加了 JWT 验证过滤器:
yaml
spring:cloud:gateway:routes:- id: api_routeuri: http://localhost:8081predicates:- Path=/api/**filters:- name: JwtAuthenticationFilterargs:auth-server: http://auth-server # 认证服务器的地址
2.4 总结
Spring Cloud Gateway 是构建微服务架构中 API 网关的一个强大工具,提供了灵活的路由、负载均衡、安全认证、限流和熔断等功能。它不仅能够简化微服务的服务间通信,还能有效保护微服务免受恶意流量和过载请求的影响。通过 Spring Cloud Gateway,开发者可以轻松管理服务之间的请求流量、验证身份、监控请求等操作,从而保证微服务系统的高可用性、性能和安全性。
三、总结
在微服务架构中,分布式配置管理和 API 网关是两个非常重要的组件。通过 Spring Cloud Config,我们可以集中管理微服务的配置信息,避免手动修改每个服务的配置文件,确保配置的一致性和动态刷新。与此同时,Spring Cloud Gateway 提供了统一的 API 网关功能,能够处理请求的路由、负载均衡、安全认证、限流等任务,有效简化了服务间的通信和治理工作。
相关文章:
Java大师成长计划之第24天:Spring生态与微服务架构之分布式配置与API网关
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4-turbo模型辅助创作完成,旨在提供灵感参考与技术分享,文中关键数据、代码与结论建议通过官方渠道验证。 在微服务架构中,如何管理…...
Spring Security vs Shiro vs Sa-Token
一句话总结: Spring Security:大公司专业保安队,功能全面但配置复杂Shiro:轻便灵活的安保工具包,上手简单但功能有限Sa-Token:国产智能门禁系统,开箱即用,代码极简 对比表格&#x…...
MongoTemplate 基础使用帮助手册
前言 MongoDB 是一种流行的 NoSQL 数据库,适合存储大量的非结构化数据。MongoTemplate 是 Spring Data MongoDB 中的一个核心组件,它提供了一组丰富的 API 来与 MongoDB 进行交互。它封装了许多常见的数据库操作,使开发者能够轻松执行 CRUD 操…...
CCIE与HCIE哪个考试难度更大?
CCIE(思科认证互联网专家)与HCIE(华为认证ICT专家)的考试难度差异体现在技术体系、实验要求及评分标准。2023年全球数据显示,CCIE通过率约25%,HCIE通过率32%,但通过率不能完全反映实际挑战。 C…...
子查询对多层join优化记录
需求背景 查询某个用户是否具有某个角色 表 CREATE TABLE mdm_platform_role_user (ID bigint NOT NULL AUTO_INCREMENT,ROLE_ID varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,USER_ID varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci …...
容器编排利器-k8s入门指南
Kubernetes(K8s)入门指南:容器编排利器 什么是 Kubernetes? Kubernetes(常简称为K8s)是一个开源的容器编排平台,由 Google 开源并交由云原生计算基金会(CNCF)管理。它可以帮助我们自动化部署、扩展和管理容器化应用程序。 为什么需要 Kubernetes? 在微服务架构盛行的今…...
MyBatis—动态 SQL
MyBatis—动态 SQL 一、动态 SQL 的核心作用 动态 SQL 主要解决以下问题: 灵活性:根据不同的输入参数生成不同的 SQL 语句(如条件查询、批量操作)。 可维护性:减少重复代码,通过标签化逻辑提高 SQL 可读…...
解决“VMware另一个程序已锁定文件的一部分,进程无法访问“
问题描述 打开VMware里的虚拟机时,弹出"另一个程序已锁定文件的一部分,进程无法访问"如图所示: 这是VM虚拟机的保护机制。虚拟机运行时,为防止数据被篡改,会将所运行的文件保护起来。当虚拟机崩溃或者强制…...
如何创建一个不可变类
写在前面 如果对象在构造后无法更改,则该对象是不可变的。不可变对象不会以任何方式暴露其他对象来修改其状态; 对象的字段仅在构造函数内初始化一次,并且永远不会再次更改。 1.不可变类的用法 如今,每个软件应用程序的*“必备”规范都是分…...
outbox架构解说
Outbox 模式是一种用于实现数据一致性的架构模式,特别是在微服务架构中。 它确保在处理事务时,数据的原子性和最终一致性。 Outbox 模式的详细解说: 1. 概念与背景 背景:在微服务架构中,一个操作可能涉及多个服务&…...
PT2020 20触控I2C输出IC
1.产品概述 ● PT2020是一款电容式触摸控制ASIC,支持20通道触摸输入,I2C键值输出。可通过I2C调节灵敏度以及功能设置。算法带有走线自补偿功能,具有高抗干扰、宽工作电压范围的突出优势。适用于小家电,智能门锁等消费类…...
【GAN网络入门系列】一,手写字MINST图片生成
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 博主简介:努力学习的22级本科生一枚 🌟;探索AI算法,C,go语言的世界;在迷茫中寻找光芒…...
数据备份与恢复方案
数据备份与恢复方案 一.背景 为确保公司信息安全,防止关键数据丢失,应对突发事件,特制定全面的数据备份与恢复方案。该方案将对公司的各类文件资料进行分级管理,并针对不同级别的数据设定相应的备份策略和恢复流程。 二…...
Go的单测gomock及覆盖率命令
安装gomock: go get github.com/golang/mock/gomockgo get github.com/golang/mock/mockgen 使用 mockgen 生成 mock 代码: 参考 mockgen -sourceservice/user.go -destinationservice/mocks/mock_user_service.go -packagemocks go test -coverprofilecoverage.out…...
淘宝商家层级存在流量上限怎么办,如何突破流量上限?
在淘宝平台运营中,许多商家都会遇到一个共同难题:随着店铺层级的提升,流量增长却逐渐触及天花板。这种现象背后隐藏着平台复杂的流量分配机制,但并非无法破解。 一、流量上限的底层逻辑 淘宝根据商家层级(1-7层&…...
【linux】Web服务—搭建nginx+ssl的加密认证web服务器
准备工作 步骤: 一、 新建存储网站数据文件的目录 二、创建一个该目录下的默认页面,index.html 三、使用算法进行加密 四、制作证书 五、编辑配置文件,可以选择修改主配置文件,但是不建议 原因如下: 自定义一个配置文…...
MySQL MCP 使用案例
## 概述 MySQL MCP(MySQL Multi-Channel Protocol)是MySQL的多通道协议实现,提供了高效的数据库连接池和负载均衡功能。本文档将介绍MySQL MCP的基本使用方法和常见案例。 ## 环境准备 ### 安装MySQL MCP bash pip install mysql-mcp ### 基…...
C#中UI线程的切换与后台线程的使用
文章速览 UI线程切换示例 后台线程使用示例 两者对比适用场景Application.Current.Dispatcher.InvokeTask.Factory.StartNew 执行同步性Application.Current.Dispatcher.InvokeTask.Factory.StartNew 一个赞,专属于你的足迹! UI线程切换 在WPF应用程序…...
实验-实现向量点积-RISC-V(计算机组成原理)
目录 一、实验内容 二、实验步骤 三、源代码 四、实现效果 五、实验环境 六、实验小结与思考 一、实验内容 首先,我们用一个简单的“向量点积”运算作为热身。你将拿到一个不完整的汇编代码“task2-向量点积”,我们的目标是按照C语言描述的功能&a…...
【软考 霍夫曼编码的文档压缩比】
霍夫曼编码的文档压缩比计算基于字符频率的最优编码分配,以下是详细步骤及相关案例: 一、压缩比计算公式 [ \text{压缩比} \frac{\text{压缩前总比特数}}{\text{压缩后总比特数 编码表存储开销}} ] 通常以 比率(如 3:1) 或 百分…...
skywalking使用教程
skywalking使用教程 一、介绍 skywalking 1.1 概念 skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking 是观察性分析平台和应用性能管理系统,提供分布…...
Tor推出Oniux新工具:为Linux应用提供网络流量匿名化
Tor项目近日发布了名为Oniux的新型命令行工具,该工具可将任何Linux应用程序的网络流量安全地路由至Tor网络,实现匿名化连接。 基于Linux命名空间的隔离技术 与依赖用户空间技巧的torsocks等传统方法不同,Oniux利用Linux命名空间(…...
LLaMA-Factory微调大模型Qwen2.5
1、开始ModelScope社区GPU环境 训练或微调模型都是非常耗费算力的。如果电脑的配置不高,可使用一些云服务器来做这项工作。如ModelScope(魔搭)社区的GPU环境,目前提供36小时免费运算,足够微调一个大模型了。 注册ModelScope(魔搭)社区账号(可能还要注册或认证阿里云账号)…...
docker(四)使用篇二:docker 镜像
在上一章中,我们介绍了 docker 镜像仓库,本文就来介绍 docker 镜像。 一、什么是镜像 docker 镜像本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。 我们可以把…...
算法练习:19.JZ29 顺时针打印矩阵
错误原因 总体思路有,但不够清晰,一直在边调试边完善。这方面就养成更好的构思习惯,以及涨涨经验吧。 分析: 思路:找规律 两个坑: 一次循环的后半段是倒着遍历的是矩阵不是方阵,要考虑行列…...
如何使用 Solana Yellowstone gRPC 重新连接和重放插槽
Yellowstone gRPC 是一个功能强大、可用于生产环境且经过实战检验的工具,用于流式传输实时的 Solana 数据。但在实际条件下,网络中断或服务器重启可能导致连接中断。如果没有适当的重连策略,你的应用程序可能会错过区块链的关键更新。 为了防…...
踩坑:uiautomatorviewer.bat 打不开
错误信息 运行 sdk\tools\bin\uiautomatorviewer.bat 报错 -Djava.ext.dirs..\lib\x86_64;..\lib is not supported. Use -classpath instead. Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. 原因 java版…...
天能股份SAP系统整合实战:如何用8个月实现零业务中断的集团化管理升级
目录 天能股份SAP系统整合案例:技术驱动集团化管理的破局之路 一、企业背景:新能源巨头的数字化挑战 二、项目难点:制造业的特殊攻坚战 1. 生产连续性刚性需求 2. 数据整合三重障碍 3. 资源限制下的技术突围 三、解决方案:S…...
oracle主备切换参考
主备正常切换操作参考:RAC两节点->单机 (rac和单机的操作区别:就是关闭其它节点,剩一个节点操作即可) 1.主库准备 检查状态 SQL> select inst_id,database_role,OPEN_MODE from gv$database; INST_ID DATA…...
PHP 与 面向对象编程(OOP)
PHP 是一种支持面向对象编程(OOP)的多范式语言,但其面向对象特性是逐步演进而非原生设计。以下是关键分析: 1. PHP 对面向对象编程的支持 核心 OOP 特性: 类和对象: PHP 支持通过 class 关键字定义类&…...
预测模型开发与评估:基于机器学习的数据分析实践
在当今数据驱动的时代,预测模型已成为各行各业决策制定的核心工具。本文将分享我在COMP5310课程项目中开发预测模型的经验,探讨从数据清洗到模型优化的完整过程,并提供详细的技术实现代码。 ## 研究问题与数据集 ### 研究问题 我们的研究聚焦…...
2026《数据结构》考研复习笔记四(绪论)
绪论 前言时间复杂度分析 前言 由于先前笔者花费约一周时间将王道《数据结构》知识点大致过了一遍,圈画下来疑难知识点,有了大致的知识框架,现在的任务就是将知识点逐个理解透彻,并将leetcode刷题与课后刷题相结合。因此此后的过…...
2025-5-16Vue3快速上手
1、reactive创建 对象类型的响应式数据 (1) (2)reactive包裹的对象类型数据是Proxy对象类型 2、ref 创建对象类型的响应式数据 (1)使用js修改ref的数据时依然要加.value (2)ref的底层是用reactive做响应式数据的,因为…...
Lua中使用module时踩过的坑
在lua中设置某个全局对象(假如对象名为LDataUser)为nil时, LDataUser并不会变成nil, 但在有些情况下设置LDataUser nil时却真变成了nil,然后会导致后续再使用LDataUser时会抛nil异常, 后来发现是使用module搞的鬼,下面看看豆包AI给的解释,还…...
WinSCP用户管理FTP详解
1、下载winscp 官方下载地址:https://winscp.net/eng/index.php 2、登录ftp 3、桌面快捷键 4、首页介绍 5、文件搜索 模糊查询,关键字两边必须加’ * ‘号 6、编码报错 报错原因:使用’936(ANS/OEM-简体中尉GBK)’编…...
python基础语法(三-中)
基础语法3: 2.列表与元组: <1>.列表、元组是什么? 都用来存储数据,但是两者有区别,列表可变,元组不可变。 <2>.创建列表: 创建列表有两种方式: [1].a 【】&#x…...
NLP双雄争霸:GPT与BERT的生成-理解博弈——从技术分野到产业融合的深度解码
NLP双雄争霸:GPT与BERT的生成-理解博弈——从技术分野到产业融合的深度解码 前言: 在自然语言处理(NLP)的版图上,GPT与BERT如双子星般照亮了智能时代的语言星空。一个是凭借千亿参数横扫生成任务的“文本造物主”&…...
JS手写代码篇---手写 instanceof 方法
2、手写 instanceof 方法 instancecof用于检测一个对象是否是某个构造函数的实例。它通常用于检查对象的类型,尤其是在处理继承关系时。 eg: const arr [1,2,3,4,5]console.log(arr instanceof Array); // trueconsole.log(arr instanceof Object); // true那这是…...
浮点数截断法:四舍五入的精确模拟
理论解释: 1. 目标 假设 a 3.14159,我们想四舍五入到 小数点后两位(即 3.14 或 3.15)。 2. 步骤拆解 (1) a * 100 把 a 放大 100 倍,让小数点后两位变成整数部分: 3.14159 * 100 314.159 (2) 0.5 关…...
c++ 类的语法3
测试下默认构造函数。demo1: void testClass3() {class Demo { // 没显示提供默认构造函数,会有默认构造函数。public:int x; // 普通成员变量,可默认构造};Demo demo1;//cout << "demo1.x: " << demo1.x << en…...
EasyExcel导出excel再转PDF转图片详解
封装EasyExcel导出工具类 相关的依赖自己网上搜索加上,这里不在阐述 Slf4j Service public class AgentExcelUtils {public String syncDynamicHeadWrite(String fileName,String sheetName,List<List<String>> headList,List<?> data) throws…...
【知识产权出版社-注册安全分析报告-无验证方式导致安全隐患】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…...
Oc语言学习 —— 重点内容总结与拓展(上)
隐藏和封装 有四种访问控制符:private(当前类访问权限),package(与映像访问权限相同),protect(子类访问权限),public(公共访问权限)。 访问控制符 1.private(当前类访问权限) 成员变量只能在当前类的内部…...
全面且深度学习c++类和对象(上)
文章目录 过程和对象类的引入,类的定义类的访问限定符及封装类的访问限定符封装 类的实例化类大小内存对齐规则: this指针this特性 过程和对象 C语言面向过程设计,c面向对象设计, 举例:洗衣服 C语言:放衣服…...
QML元素 - RectangularGlow
QML 的 RectangularGlow 是 Qt Quick Effects 模块中专门为矩形元素设计的外发光效果,适用于为卡片、按钮、面板等矩形或圆角矩形添加柔和的边缘光晕,相比通用 Glow 更高效且支持圆角匹配。以下是详细使用技巧和优化指南: 1. 基本用法 impor…...
GraphPad Prism项目的管理
《2025新书现货 GraphPad Prism图表可视化与统计数据分析(视频教学版)雍杨 康巧昆 清华大学出版社教材书籍 9787302686460 GraphPadPrism图表可视化 无规格》【摘要 书评 试读】- 京东图书 GraphPad Prism统计数据分析_夏天又到了的博客-CSDN博客 项目…...
uniapp自定义日历计划写法(vue2)
文章目录 uniapp自定义日历计划写法(vue2)1、效果2、实现源码前言:我们有时候需要实现的日历找不到相应的插件的时候,往往需要手动去写一个日历,以下就是我遇到这样的问题时,手搓出来的一个解决方案,希望可以帮助到更多的人。创作不易,请多多支持uniapp自定义日历计划写…...
差分探头为什么要选择使用屏蔽双绞线
市面上很多各种品牌的差分探头,其使用的线缆都使用了屏蔽双绞线(STP),这主要是因为在测试过程中因高压线路周围强电场或磁场在信号线与地线间感应出共模电压而产生的电磁耦合效应会对测试结果产生干扰,而屏蔽双绞线可以…...
Qt—用SQLite实现简单的注册登录界面
1.实现目标 本次实现通过SQLite制作一个简易的登录窗口,当点击注册按钮时,登录窗口会消失,会出现一个新的注册界面;完成注册或退出注册时,注册窗口会消失,重新出现登录窗口。注册过的用户信息会出现在SQLi…...
Visual Studio旧版直链
[Visual Studio 2019 社区版](https://aka.ms/vs/16/release/vs_community.exe) [Visual Studio 2019 专业版](https://aka.ms/vs/16/release/vs_professional.exe) [Visual Studio 2019 企业版](https://aka.ms/vs/16…...