技术周总结2024.06.03~06.09(K8S HikariCP数据库连接池)
文章目录
- 一、06.05 周三
- 1.1) 问题01: 容器领域,Docker与 K8S的区别和联系
- Docker
- 主要功能和特点:
- 使用场景:
- Kubernetes (K8S)
- 主要功能和特点:
- 使用场景:
- 联系和区别
- 联系:
- 区别:
- 结合使用
- 总结
- 二、06.08 周六
- 2.1)问题01:软件工程中的模块结构图,层次图和HIPO图分别是什么
- 模块结构图
- 层次图
- HIPO图
- 结论
- 2.2) 问题02: K8S的知识点脑图是怎样的?
- Kubernetes (K8S) 知识点脑图
- 示例脑图结构图:
- 2.3) 问题03 详细介绍HikariCP数据库连接池
- HikariCP 的特点
- 主要配置参数
- 使用示例
- 引入 Maven 依赖
- 配置和初始化 HikariCP
- 配置示例(外部配置文件)
- `hikari.properties`
- 加载配置文件
- HikariCP 与其他连接池的比较
- HikariCP vs. C3P0
- HikariCP vs. Apache DBCP
- 总结
- 2.4)问题04:软件工程中的CORBA是什么
- CORBA的主要特点
- CORBA的主要组件
- CORBA的工作流程
- CORBA的优缺点
- 结论
- 2.5)问题05:CORBA中的 Servant 是什么
- Servant的作用
- Servant的工作原理
- Servant的类型
- Servant和POA(Portable Object Adapter)
- 示例:完整代码
- 结论
- 2.6)问题06: 详细介绍下 J2EE 应用系统
- J2EE体系结构
- J2EE主要组件和技术
- J2EE应用服务器
- J2EE应用开发步骤
- J2EE的优缺点
一、06.05 周三
1.1) 问题01: 容器领域,Docker与 K8S的区别和联系
Docker 和 Kubernetes(K8S)都是现代 DevOps 和容器化应用程序的重要技术,但它们在体系结构、功能和使用场景上有显著的区别,同时又紧密相关。
Docker
Docker 是一个开源平台,用于开发、发布和运行应用程序。它使得应用程序可以在一个虚拟化的容器环境中运行,从而实现更高的资源利用率和更快的部署速度。
主要功能和特点:
- 容器化:Docker 允许将应用程序及其依赖项打包到一个容器镜像中。容器可以在任何支持 Docker 的平台上运行,确保环境的一致性。
- 镜像:Docker 镜像是一个轻量级、独立的可执行包,包含运行应用程序所需的一切,包括代码、运行时、库和配置文件。
- 容器:Docker 容器是镜像的运行实例,它们是独立的、可移植的、和可隔离的运行环境。
- Docker Hub:这是一个公共的云注册表,用于存储和分发 Docker 镜像。
- 便捷的构建和部署:通过 Dockerfile,可以定义和自动化镜像的构建过程。
使用场景:
- 单一应用程序的容器化和部署。
- 本地开发环境的搭建和一致性维护。
- 简单的容器编排和管理。
Kubernetes (K8S)
Kubernetes 是一个开源的容器编排平台,用于自动化容器化应用程序的部署、扩展和管理。它解决了在大规模分布式系统中运行和管理容器的问题。
主要功能和特点:
- 自动化部署和管理:自动化应用程序的部署、更新和管理,确保高可用性和无缝扩展。
- 负载均衡:自动分配和调整负载,确保应用程序的高性能和高可用性。
- 服务发现和负载均衡:自动为容器提供 DNS 名称或 IP 地址,并将流量分配给健康的容器。
- 自愈能力:自动监控应用程序,并在出现故障时重新启动失败的容器或重新调度它们。
- 水平扩展:根据需求自动扩展或缩减容器的数量。
- 命名空间:支持多租户和资源隔离。
- 配置管理和密钥管理:轻松管理应用程序的配置和敏感信息。
使用场景:
- 大规模分布式应用程序的管理和编排。
- 微服务架构的部署和管理。
- 动态扩展和负载均衡的场景。
联系和区别
联系:
- 容器化基础:Kubernetes 依赖于容器技术来运行应用程序,Docker 是最常用的容器引擎之一,因此 Kubernetes 经常和 Docker 一起使用。
- 镜像管理:Kubernetes 使用 Docker 镜像来部署和运行应用程序,这些镜像可以存储在 Docker Hub 或其他容器注册表中。
- 集成和生态系统:许多 DevOps 工具和平台(如 CI/CD 管道)同时支持 Docker 和 Kubernetes,通过容器化和编排实现自动化和持续交付。
区别:
-
层次不同:
- Docker 是一个容器化平台,专注于将应用程序打包成容器并运行这些容器。
- Kubernetes 是一个容器编排平台,专注于管理大规模的容器化应用程序,包括部署、扩展和自动化管理。
-
功能范围:
- Docker 提供了创建、分发和运行容器的基本功能,主要用于单个主机上的容器管理。
- Kubernetes 提供了全面的容器编排功能,适用于跨多个主机和数据中心的容器管理。
-
组件和架构:
- Docker 主要包括 Docker Engine、Docker CLI 和 Docker Hub 等组件。
- Kubernetes 由多个组件组成,包括 API 服务器、调度器、控制器管理器、etcd、kubelet 和 kube-proxy 等。
结合使用
在实际使用中,Docker 和 Kubernetes 常常结合使用。典型的流程如下:
- 开发和打包:开发人员使用 Docker 将应用程序及其依赖项打包成容器镜像。
- 存储和分发:将容器镜像推送到 Docker Hub 或其他容器注册表。
- 部署和管理:使用 Kubernetes 从注册表中拉取镜像,并在集群中部署和管理这些容器,利用 Kubernetes 的编排能力实现自动化部署、扩展和管理。
总结
Docker 和 Kubernetes 是现代容器化和编排的两个重要技术。Docker 专注于容器化技术,提供了创建、运行和分发容器的功能;Kubernetes 专注于容器编排,提供了大规模管理容器化应用程序的功能。两者结合使用,可以实现从开发到生产环境的自动化和高效管理。
二、06.08 周六
2.1)问题01:软件工程中的模块结构图,层次图和HIPO图分别是什么
在软件工程中,模块结构图、层次图和HIPO图是三种不同的图形化工具,用于表示系统的结构、层次和功能。它们各自有不同的侧重点和用途,帮助开发人员和设计人员更好地理解和设计系统。
模块结构图
定义:
模块结构图(Module Structure Diagram)是一种用来表示系统模块及其相互关系的图形工具。它显示了系统是如何被分解成多个模块的,以及这些模块之间的调用关系或依赖关系。
用途:
- 展示系统的模块化设计,帮助理解各模块的职责和相互关系。
- 支持模块的独立开发和维护。
组成要素:
- 模块:通常用矩形表示,每个矩形代表一个模块。
- 连接线:表示模块之间的调用或依赖关系,通常用箭头指示调用方向。
示例:
+-----------+ +-----------+
| 模块A |------>| 模块B |
+-----------+ +-----------+| |v v
+-----------+ +-----------+
| 模块C | | 模块D |
+-----------+ +-----------+
层次图
定义:
层次图(Hierarchy Chart)是一种显示系统或程序中各模块的层次关系的图形工具。它展示了模块的分层结构和上下级关系。
用途:
- 显示系统的层次结构,帮助理解模块之间的控制关系和层次划分。
- 用于系统设计和文档编制。
组成要素:
- 节点:表示系统中的各个模块。
- 连接线:表示父子关系,父节点控制或调用子节点。
示例:
+-----------+| 主模块 |+-----------+/ \/ \
+-----------+ +-----------+
| 子模块1 | | 子模块2 |
+-----------+ +-----------+/ \
+-----+ +-----+
| 子模块1.1 | | 子模块1.2 |
+-----+ +-----+
HIPO图
定义:
HIPO图(Hierarchy plus Input-Process-Output),即层次加输入-处理-输出图,是一种用于描述系统功能的图形工具。它结合了层次图和流程图的特点,用于全面描述系统的层次结构及各功能模块的输入、处理和输出。
用途:
- 提供系统的全面视图,展示各功能模块的层次结构和详细的功能描述。
- 用于系统分析、设计和文档编制。
组成要素:
- 层次图部分:表示系统的层次结构和模块之间的控制关系。
- IPO图部分:描述每个模块的输入、处理和输出。
示例:
层次图部分+-----------+| 主模块 |+-----------+/ \/ \
+-----------+ +-----------+
| 子模块1 | | 子模块2 |
+-----------+ +-----------+IPO图部分
+-----------------------+
| 模块:子模块1 |
| 输入:输入1 |
| 处理:处理1,处理2 |
| 输出:输出1 |
+-----------------------+
结论
- 模块结构图:主要用于展示系统的模块化设计,强调模块之间的调用或依赖关系。
- 层次图:用于表示系统或程序的层次关系,强调模块之间的控制关系和层次划分。
- HIPO图:结合层次图和输入-处理-输出图,提供系统的全面视图,详细描述系统的层次结构及各功能模块的操作细节。
这些图形工具在软件工程中具有重要作用,通过直观的图形化表示,帮助开发人员和设计人员更好地理解、设计和管理复杂的系统。
2.2) 问题02: K8S的知识点脑图是怎样的?
当然,我可以帮你列出一个 Kubernetes (K8S) 知识点的结构性脑图。下面是一个示例的文本描述形式的脑图,你可以根据这个结构使用任何脑图软件(如 XMind、MindMeister 等)来创建实际的可视化脑图。
Kubernetes (K8S) 知识点脑图
-
基础概念
- Kubernetes 简介
- 容器编排
- Kubernetes 架构
-
核心组件
- API Server
- etcd
- Scheduler
- Controller Manager
- Kubelet
- Kube-proxy
-
基本对象
- Pod
- 单容器 Pod
- 多容器 Pod
- ReplicaSet
- Deployment
- Service
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
- ConfigMap
- Secret
- Volume
- EmptyDir
- HostPath
- PersistentVolume (PV)
- PersistentVolumeClaim (PVC)
- Namespace
- Pod
-
高级对象
- StatefulSet
- DaemonSet
- Job
- CronJob
- Ingress
- NetworkPolicy
-
配置和管理
- Kubeconfig
- Kubectl 命令
- 基本操作
- 资源管理
- 日志查看
- 调试
- Helm
- Helm Chart
- Helm Repositories
-
部署和发布
- 滚动更新
- 蓝绿部署
- 金丝雀发布
-
监控和日志
- 集群监控
- Prometheus
- Grafana
- 日志管理
- Elasticsearch
- Fluentd
- Kibana (EFK Stack)
- 集群监控
-
网络
- CNI 插件
- Flannel
- Calico
- Weave
- Service Mesh
- Istio
- Linkerd
- CNI 插件
-
安全
- 身份认证
- 授权
- 网络策略
- Pod 安全策略 (PodSecurityPolicy)
- 秘钥管理
-
存储
- 静态和动态存储
- StorageClass
- 持久化存储方案
-
集群管理
- 集群安装
- kubeadm
- Kops
- Minikube
- 节点管理
- 资源配额
- 集群伸缩
- Horizontal Pod Autoscaler (HPA)
- Vertical Pod Autoscaler (VPA)
- Cluster Autoscaler
- 集群安装
-
云原生生态
- CNCF 项目
- Operator 模式
- 服务目录 (Service Catalog)
- 函数即服务 (FaaS)
- OpenFaaS
- Knative
示例脑图结构图:
Kubernetes
|
|-- 基础概念
| |-- Kubernetes 简介
| |-- 容器编排
| `-- Kubernetes 架构
|
|-- 核心组件
| |-- API Server
| |-- etcd
| |-- Scheduler
| |-- Controller Manager
| |-- Kubelet
| `-- Kube-proxy
|
|-- 基本对象
| |-- Pod
| | |-- 单容器 Pod
| | `-- 多容器 Pod
| |-- ReplicaSet
| |-- Deployment
| |-- Service
| | |-- ClusterIP
| | |-- NodePort
| | |-- LoadBalancer
| | `-- ExternalName
| |-- ConfigMap
| |-- Secret
| |-- Volume
| | |-- EmptyDir
| | |-- HostPath
| | |-- PersistentVolume (PV)
| | `-- PersistentVolumeClaim (PVC)
| `-- Namespace
|
|-- 高级对象
| |-- StatefulSet
| |-- DaemonSet
| |-- Job
| |-- CronJob
| |-- Ingress
| `-- NetworkPolicy
|
|-- 配置和管理
| |-- Kubeconfig
| |-- Kubectl 命令
| | |-- 基本操作
| | |-- 资源管理
| | |-- 日志查看
| | `-- 调试
| `-- Helm
| |-- Helm Chart
| `-- Helm Repositories
|
|-- 部署和发布
| |-- 滚动更新
| |-- 蓝绿部署
| `-- 金丝雀发布
|
|-- 监控和日志
| |-- 集群监控
| | |-- Prometheus
| | `-- Grafana
| `-- 日志管理
| |-- Elasticsearch
| |-- Fluentd
| `-- Kibana (EFK Stack)
|
|-- 网络
| |-- CNI 插件
| | |-- Flannel
| | |-- Calico
| | `-- Weave
| `-- Service Mesh
| |-- Istio
| `-- Linkerd
|
|-- 安全
| |-- 身份认证
| |-- 授权
| |-- 网络策略
| |-- Pod 安全策略 (PodSecurityPolicy)
| `-- 秘钥管理
|
|-- 存储
| |-- 静态和动态存储
| |-- StorageClass
| `-- 持久化存储方案
|
|-- 集群管理
| |-- 集群安装
| | |-- kubeadm
| | |-- Kops
| | `-- Minikube
| |-- 节点管理
| |-- 资源配额
| `-- 集群伸缩
| |-- Horizontal Pod Autoscaler (HPA)
| |-- Vertical Pod Autoscaler (VPA)
| `-- Cluster Autoscaler
|
`-- 云原生生态|-- CNCF 项目|-- Operator 模式|-- 服务目录 (Service Catalog)`-- 函数即服务 (FaaS)|-- OpenFaaS`-- Knative
这个脑图包含了 Kubernetes 的主要知识点,可以帮助你全面理解和掌握 Kubernetes 的概念、组件和功能。你可以使用这个结构在脑图软件中创建一个可视化的脑图,以便更直观地进行学习和记忆。
2.3) 问题03 详细介绍HikariCP数据库连接池
HikariCP 是一个高性能的 JDBC 数据库连接池,广泛用于 Java 应用程序中。它以速度和可靠性著称,旨在提供高效的数据库连接管理。下面是对 HikariCP 的详细介绍,包括其特点、配置、使用示例和与其他连接池的比较。
HikariCP 的特点
- 高性能:HikariCP 被设计为快速、轻量级的连接池。它使用直接字节缓冲和内存布局优化等技术,极大地提高了性能。
- 低延迟:HikariCP 优化了连接获取的速度和响应时间,确保低延迟和高吞吐量。
- 连接泄漏检测:HikariCP 提供了连接泄漏检测机制,可以帮助开发人员及时发现和处理连接泄漏问题。
- 自定义连接测试:支持配置自定义的连接测试查询,以确保连接池中的连接是有效的。
- 弹性配置:HikariCP 提供了丰富的配置选项,允许开发人员根据应用需求调整连接池行为。
- 可靠性:HikariCP 经过大量测试和验证,保证了其稳定性和可靠性。
主要配置参数
HikariCP 提供了许多配置参数,以下是一些常用的参数:
jdbcUrl
:数据库的 JDBC URL。username
:数据库用户名。password
:数据库密码。dataSourceClassName
:数据源类的名称。maximumPoolSize
:连接池中允许的最大连接数。minimumIdle
:连接池中保持的最小空闲连接数。connectionTimeout
:获取连接的最大等待时间。idleTimeout
:空闲连接的最大存活时间。maxLifetime
:连接的最大存活时间。connectionTestQuery
:自定义的连接测试查询。
使用示例
下面是一个使用 HikariCP 的简单示例:
引入 Maven 依赖
首先,在 Maven 项目中添加 HikariCP 的依赖:
<dependency><groupId>com.zaxxer</groupId><artifactId>HikariCP</artifactId><version>5.0.1</version>
</dependency>
配置和初始化 HikariCP
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;import javax.sql.DataSource;public class HikariCPExample {public static void main(String[] args) {HikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/mydatabase");config.setUsername("myuser");config.setPassword("mypassword");config.setMaximumPoolSize(10);config.setMinimumIdle(5);config.setConnectionTimeout(30000); // 30 secondsconfig.setIdleTimeout(600000); // 10 minutesconfig.setMaxLifetime(1800000); // 30 minutesDataSource dataSource = new HikariDataSource(config);try (Connection conn = dataSource.getConnection()) {// Use the connection to interact with the database} catch (SQLException e) {e.printStackTrace();}}
}
配置示例(外部配置文件)
你也可以使用外部配置文件来配置 HikariCP:
hikari.properties
dataSourceClassName=com.mysql.cj.jdbc.MysqlDataSource
dataSource.url=jdbc:mysql://localhost:3306/mydatabase
dataSource.user=myuser
dataSource.password=mypassword
maximumPoolSize=10
minimumIdle=5
connectionTimeout=30000
idleTimeout=600000
maxLifetime=1800000
加载配置文件
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;import javax.sql.DataSource;public class HikariCPExample {public static void main(String[] args) {HikariConfig config = new HikariConfig("/path/to/hikari.properties");DataSource dataSource = new HikariDataSource(config);try (Connection conn = dataSource.getConnection()) {// Use the connection to interact with the database} catch (SQLException e) {e.printStackTrace();}}
}
HikariCP 与其他连接池的比较
- 性能:HikariCP 通常被认为是市场上最快的 JDBC 连接池,尤其是在高并发和大规模应用程序中。
- 配置简便:与其他连接池相比,HikariCP 的配置更加简便,提供了合理的默认值,使得即使在不进行大量配置的情况下也能很好地工作。
- 轻量级:HikariCP 轻量级且依赖较少,适合资源有限的环境。
HikariCP vs. C3P0
- 性能:HikariCP 的性能通常优于 C3P0,特别是在高并发场景下。
- 配置和使用:HikariCP 配置更简单,默认值更优化,C3P0 配置相对复杂一些。
HikariCP vs. Apache DBCP
- 性能:HikariCP 的性能优于 Apache DBCP,在高并发和低延迟需求场景中表现尤为明显。
- 稳定性和可靠性:HikariCP 被认为比 DBCP 更加稳定和可靠,特别是在处理高负载时。
总结
HikariCP 是一个高性能、低延迟的 JDBC 连接池,适用于各种规模的 Java 应用程序。其简单的配置和高效的连接管理,使其成为许多开发人员的首选。无论是单机环境还是大规模分布式系统,HikariCP 都能提供出色的性能和可靠性。
2.4)问题04:软件工程中的CORBA是什么
CORBA(Common Object Request Broker Architecture,通用对象请求代理架构)是一种由OMG(Object Management Group,对象管理组织)制定的标准,用于支持分布式对象系统的互操作性。CORBA允许不同语言、不同平台上的应用程序进行通信和协作,从而构建复杂的分布式系统。
CORBA的主要特点
-
语言独立性:
- 支持多种编程语言,如C++、Java、Python等,通过使用IDL(Interface Definition Language,接口定义语言)来定义接口,使得不同语言的组件可以互操作。
-
平台独立性:
- 支持多种操作系统和硬件平台,使得应用程序可以在异构环境中运行。
-
对象请求代理(ORB,Object Request Broker):
- ORB是CORBA的核心组件,负责处理客户端和服务器端对象之间的通信和请求转发。ORB使得客户端可以透明地调用远程对象的方法,就像调用本地对象的方法一样。
-
接口定义语言(IDL):
- IDL用于定义分布式对象的接口,独立于具体的编程语言。通过IDL编译器将IDL文件转换成特定语言的代码,使得不同语言的组件可以相互调用。
-
动态调用接口(DII,Dynamic Invocation Interface):
- 允许客户端在运行时动态地构建和调用请求,而不需要在编译时知道对象的接口。
-
动态类型接口(DII,Dynamic Skeleton Interface):
- 允许服务器端在运行时处理请求,而不需要在编译时知道对象的接口。
-
可移植性:
- CORBA的标准化接口和协议确保了应用程序的可移植性,使得同一个应用程序可以在不同的ORB实现之间运行。
CORBA的主要组件
-
客户端:
- 发起请求调用远程对象的方法。
-
服务器:
- 提供对象的实现,并处理来自客户端的请求。
-
对象请求代理(ORB):
- 负责将请求从客户端传递到服务器,并将响应返回给客户端。
-
IDL编译器:
- 将IDL文件编译生成特定语言的客户端存根和服务器骨架代码。
-
接口仓库(Interface Repository):
- 存储IDL接口的元数据信息,支持客户端和服务器在运行时查询接口信息。
-
实现仓库(Implementation Repository):
- 存储服务器对象的实现信息,管理对象的激活和生命周期。
CORBA的工作流程
-
定义接口:
- 使用IDL定义远程对象的接口,并通过IDL编译器生成特定语言的客户端存根和服务器骨架代码。
-
实现对象:
- 在服务器端实现IDL接口定义的对象方法。
-
部署和注册对象:
- 将对象部署到服务器上,并通过实现仓库注册对象的实现。
-
客户端调用:
- 客户端使用生成的存根代码,通过ORB发起远程方法调用。
-
ORB处理:
- ORB接收客户端请求,查找对应的服务器对象,并将请求转发给服务器。
-
服务器响应:
- 服务器对象处理请求,并通过ORB将结果返回给客户端。
CORBA的优缺点
优点:
- 互操作性:支持不同语言和平台之间的互操作,构建异构分布式系统。
- 标准化:由OMG制定的标准,确保了不同ORB实现之间的兼容性。
- 透明性:客户端调用远程对象的方法时,无需关注底层的网络通信细节。
缺点:
- 复杂性:CORBA的实现和配置较为复杂,学习曲线较陡。
- 性能:由于增加了中间层和标准化协议,可能会对性能产生一定影响。
- 市场接受度:尽管CORBA在一些特定领域(如电信和金融)得到了应用,但在现代分布式系统中,较新的技术(如Web服务、微服务架构和gRPC)逐渐占据了主导地位。
结论
CORBA是一种强大的分布式对象技术,提供了语言和平台独立性,支持复杂的分布式系统开发。尽管随着技术的发展,CORBA的应用范围有所减少,但它在一些特定领域仍然具有重要作用,特别是在需要跨语言、跨平台互操作的复杂系统中。
在CORBA(Common Object Request Broker Architecture)中,Servant是服务器端实现CORBA对象的方法和属性的实体。Servant是负责实际处理客户端请求的对象,它实现了由IDL(Interface Definition Language)定义的接口。
2.5)问题05:CORBA中的 Servant 是什么
Servant的作用
-
实现IDL接口:
- Servant是一个具体的类或对象,它实现了通过IDL定义的接口。IDL接口描述了CORBA对象的行为,而Servant提供了这些行为的具体实现。
-
处理客户端请求:
- 当客户端调用远程对象的方法时,请求被转发到对应的Servant。Servant负责处理这个请求,执行相应的操作,并返回结果。
Servant的工作原理
-
IDL接口定义:
- 使用IDL定义远程对象的接口。IDL接口定义了对象的操作(方法)、属性以及数据类型。
interface Example {void sayHello(); };
-
生成存根和骨架代码:
- 使用IDL编译器将IDL接口编译成特定编程语言的客户端存根(Stub)和服务器骨架(Skeleton)代码。
Example_stub.java Example_skeleton.java
-
实现Servant:
- 在服务器端创建一个类,实现IDL接口,并编写具体的方法逻辑。这个类就是Servant。
public class ExampleImpl extends Example_skeleton {public void sayHello() {System.out.println("Hello from Servant!");} }
-
注册Servant:
- 将Servant实例注册到ORB(Object Request Broker),使其能够处理客户端请求。
ORB orb = ORB.init(args, null); POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate();ExampleImpl exampleImpl = new ExampleImpl(); rootpoa.servant_to_reference(exampleImpl);
-
处理请求:
- ORB接收客户端请求,通过Skeleton调用对应的Servant方法,Servant执行操作并返回结果。
orb.run();
Servant的类型
-
单一Servant(Single Servant):
- 每个Servant实例只处理一个CORBA对象的请求。这种方式适用于需要独立管理每个对象状态的场景。
-
共享Servant(Shared Servant):
- 一个Servant实例可以处理多个CORBA对象的请求。这种方式适用于多个对象共享同一个实现逻辑的场景。
Servant和POA(Portable Object Adapter)
POA(Portable Object Adapter)是CORBA中管理Servant的组件,它负责将客户端请求转发给适当的Servant。POA提供了一种灵活的方式来管理Servant的生命周期和请求调度。
- POA的主要功能:
- 激活和停用Servant:控制Servant的激活和停用。
- 对象引用管理:为每个CORBA对象生成唯一的引用,并将其与对应的Servant关联。
- 请求调度:接收客户端请求并将其调度给相应的Servant处理。
示例:完整代码
以下是一个完整的示例,展示了如何定义IDL接口、实现Servant,并在服务器端注册和运行Servant。
1. IDL接口定义:
module example {interface Example {void sayHello();};
};
2. 生成存根和骨架代码:
idltojava example.idl
3. 实现Servant:
import example.ExamplePOA;public class ExampleImpl extends ExamplePOA {public void sayHello() {System.out.println("Hello from Servant!");}
}
4. 注册和运行Servant:
import org.omg.CORBA.*;
import org.omg.PortableServer.*;public class Server {public static void main(String[] args) {try {// 初始化ORBORB orb = ORB.init(args, null);// 获取RootPOA引用并激活POAManagerPOA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));rootpoa.the_POAManager().activate();// 创建Servant实例并注册到ORBExampleImpl exampleImpl = new ExampleImpl();org.omg.CORBA.Object ref = rootpoa.servant_to_reference(exampleImpl);example.Example href = example.ExampleHelper.narrow(ref);// 将对象引用绑定到命名服务org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);String name = "Example";NameComponent[] path = ncRef.to_name(name);ncRef.rebind(path, href);System.out.println("Server ready and waiting ...");// 运行ORB,等待客户端请求orb.run();} catch (Exception e) {e.printStackTrace();}}
}
结论
在CORBA架构中,Servant是服务器端实现CORBA对象行为的具体实体。它负责处理客户端请求,实现由IDL定义的接口。通过使用POA管理Servant,CORBA提供了一种灵活且强大的机制来构建分布式对象系统,支持跨语言、跨平台的互操作性。
2.6)问题06: 详细介绍下 J2EE 应用系统
J2EE(Java 2 Platform, Enterprise Edition)是一个由Sun Microsystems(现属于Oracle)开发的Java平台,专门用于构建和部署企业级应用。J2EE提供了一套标准和API,用于支持分布式、多层次的Web应用开发。
J2EE体系结构
J2EE体系结构通常被描述为一个多层架构,包括以下几个主要层次:
-
客户端层:
- 包括各种客户端应用,如Web浏览器、桌面应用程序和移动设备。
- 通过HTTP、HTTPS或其他协议与Web层通信。
-
Web层:
- 处理客户端请求,生成响应页面。
- 主要技术包括Servlet、JSP(JavaServer Pages)和JSF(JavaServer Faces)。
- 运行在Web服务器或应用服务器中。
-
业务逻辑层(EJB层):
- 包含企业级业务逻辑和处理。
- 主要技术包括EJB(Enterprise JavaBeans)。
- 提供事务管理、安全性、并发控制等企业级服务。
-
持久层:
- 负责与数据库和其他持久化存储系统交互。
- 主要技术包括JPA(Java Persistence API)和JDBC(Java Database Connectivity)。
-
资源层:
- 包含数据库、消息队列、目录服务等企业资源。
- 通过J2EE连接器和资源适配器访问。
J2EE主要组件和技术
-
Servlet:
- 用于处理HTTP请求和响应。
- 适合生成动态网页内容,管理会话和用户输入。
-
JSP(JavaServer Pages):
- 基于Servlet技术,允许在HTML中嵌入Java代码。
- 适合页面视图的生成和表示层逻辑。
-
JSF(JavaServer Faces):
- 基于组件的Web框架,用于构建用户界面。
- 提供丰富的UI组件和事件处理机制。
-
EJB(Enterprise JavaBeans):
- 提供分布式、多层次的企业级应用开发框架。
- 包含会话Bean(Session Bean)、实体Bean(Entity Bean)和消息驱动Bean(Message-Driven Bean)。
-
JPA(Java Persistence API):
- 提供对象关系映射(ORM)功能,简化数据库操作。
- 允许开发者使用对象模型来操作关系数据库。
-
JMS(Java Message Service):
- 提供消息传递机制,实现异步通信。
- 适用于构建松耦合的分布式系统。
-
JTA(Java Transaction API):
- 提供事务管理功能,确保数据操作的一致性和完整性。
- 支持分布式事务管理。
-
JNDI(Java Naming and Directory Interface):
- 提供目录服务访问接口,支持资源和对象的查找和绑定。
J2EE应用服务器
J2EE应用服务器是实现和运行J2EE标准的服务器平台,提供各种企业级服务和管理功能。常见的J2EE应用服务器包括:
- Apache Tomcat:开源的Servlet和JSP容器,不完全实现J2EE标准。
- JBoss EAP(WildFly):开源的J2EE应用服务器,全面实现J2EE标准。
- WebSphere Application Server:IBM提供的商业J2EE应用服务器。
- Oracle WebLogic Server:Oracle提供的商业J2EE应用服务器。
J2EE应用开发步骤
-
需求分析和设计:
- 分析系统需求,设计系统架构和各层次组件。
- 定义业务逻辑、数据模型和用户界面。
-
开发:
- 编写Servlet、JSP、EJB等组件,实现业务逻辑和持久层。
- 使用IDE(如Eclipse、IntelliJ IDEA)进行代码开发和调试。
-
部署:
- 将应用组件打包成WAR(Web Application Archive)或EAR(Enterprise Archive)文件。
- 部署到J2EE应用服务器中。
-
测试:
- 进行单元测试、集成测试和系统测试,确保应用的正确性和性能。
- 使用测试框架(如JUnit、Mockito)进行自动化测试。
-
维护和更新:
- 持续监控和维护系统,修复BUG和性能优化。
- 定期更新和扩展系统功能。
J2EE的优缺点
优点:
- 标准化:提供一套完整的标准,确保不同厂商实现的兼容性。
- 可扩展性:支持分布式、多层次架构,适合大规模企业应用。
- 丰富的API:提供丰富的API和服务,简化企业级开发。
- **安全性
相关文章:
技术周总结2024.06.03~06.09(K8S HikariCP数据库连接池)
文章目录 一、06.05 周三1.1) 问题01: 容器领域,Docker与 K8S的区别和联系Docker主要功能和特点:使用场景: Kubernetes (K8S)主要功能和特点:使用场景: 联系和区别联系:区别: 结合使用总结 二、…...
【JavaScript】了解 Sass:现代 CSS 的强大预处理器
我已经从你的 全世界路过 像一颗流星 划过命运 的天空 很多话忍住了 不能说出口 珍藏在 我的心中 只留下一些回忆 🎵 牛奶咖啡《从你的全世界路过》 在前端开发领域,CSS 是必不可少的样式表语言。然而,随着项目复杂度的…...

下载安装Thonny并烧录MicroPython固件至ESP32
Thonny介绍 一、Thonny的基本特点 面向初学者:Thonny的设计初衷是为了帮助Python初学者更轻松、更快速地入门编程。它提供了直观易懂的用户界面和丰富的功能,降低了编程的门槛。轻量级:作为一款轻量级的IDE,Thonny不会占用过多的…...

YOLOv5改进 | 主干网络 | 将主干网络替换为轻量化的ShuffleNetv2【原理 + 完整代码】
💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 目标检测是计算机视觉中一个重要的下游任务。对于边缘盒子的计算平台来说,一个大型模型很难实现实时检测的要求。基于一系列消融…...
LeetCode:字母异位词分组
文章收录于LeetCode专栏 LeetCode地址 字母异位词分组 题目 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。所有输入均为小写字母,且不考虑答案输出的顺序。 示例1: 输入: strs [“…...

技术与业务的完美融合:大数据BI如何真正提升业务价值
数据分析有一点经典案例 沃尔玛的啤酒和尿布案例 开始做BI的时候,大家肯定都看过书,那么一定也看过一个经典的案例,就是沃尔玛的啤酒和尿布的案例。这个案例确实很经典,但其实是一个失败的案例。为什么这么说呢?很明显…...

计网复习资料
一、选择题(每题2分,共40分) 1. Internet 网络本质上属于( )网络。 A.电路交换 B.报文交换 C.分组交换 D.虚电路 2.在 OSI 参考模型中,自下而上第一个提供端到端服务的是( )。 A.数据链路层 B.传输…...
华为策略流控
以下脚本仅做参考,具体IP地址和接口请按照现场实际情况写入。 [Huawei]acl 3001 [Huawei-acl-adv-3001]rule permit ip source 192.168.1.10 0.0.0.0 destination 192.168.2.10 0.0.0.0 //匹配需要做测试的源和目标地址 [Huawei-acl-adv-3001]rule permit ip sour…...

刷代码随想录有感(98):动态规划——爬楼梯
题干: 代码: class Solution { public:int climbStairs(int n) {if(n 1)return 1;if(n 2)return 2;vector<int>dp(n 1);dp[0] 0;dp[1] 1;dp[2] 2;for(int i 3; i < n; i){dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }; 其实就是斐波…...

零基础入门篇①⑦ Python可变序列类型--集合
Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏限时一个月(5.8~6.8)重…...

基于NodeJs 的Vue安装和创建项目
基于NodeJs 的Vue安装和创建项目 一、Node.js的下载与安装 下载地址: https://nodejs.org/en/download/prebuilt-installer 安装完之后,启动 cmd命令行,验证 Node.js 是否安装成功 二、配置npm的全局模块的存放路径以及缓存的路径 注&…...

【简单介绍下DALL-E2,什么是DALL-E2?】
🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…...

springboot+mqtt使用总结
1.软件的选型 1.1.使用免费版EMQX 1.1.1.下载 百度搜索的目前是会打开官网,这里提供下免费版的使用链接EMQX使用手册 文档很详细,这里不再记录了。 1.2.使用rabbitmq rabbitmq一般做消息队列用,作为mqtt用我没有找到详细资料,…...

搭建自己的组件库<2>dialog 组件
目录 设置title 插槽显示 控制宽高 关闭对话框 transition实现动画 引入深度选择器 同样创建组件dialogue.vue后全局注册 dialogue模版: <template><!-- 对话框的遮罩 --><div class"miao-dialog_wrapper"><!-- 真的对话框 …...

less学习笔记
一、什么是less? Less是CSS预处理语言,可以使用变量、嵌套、运算等,便于维护项目CSS样式代码。 二、less安装 使用npm包管理工具,全局安装less包 npm install -g lessless安装好的同时,lessc也安装好了 通过 lessc -…...

基于关键词自动采集抖音视频排名及互动数据(点赞、评论、收藏)
在当今的社交媒体时代,抖音作为一个热门短视频平台,吸引了大量用户和内容创作者。对于研究和分析抖音上的热门视频及其互动数据(如点赞、评论、收藏等),自动化的数据采集工具显得尤为重要。本项目旨在开发一个基于关键…...
selenium中switch_to.window切换窗口的用法
打开百度多个窗口,遍历切换每个窗口,切到【百度地图】就停止。 使用了driver.switch_to.window() 来切换, 参数是handle值 from selenium import webdriver import time# 创建浏览器驱动对象 from selenium.webdrive…...

【nerf】nvidia-smi
当cmd下nvidia -smi不能使用时候 沿着以下路径打开cmd,再输入,可以查看cuda版本 然后查看电脑安装的...

测试工具fio
一、安装部署 fio是一款优秀的磁盘IO测试工具,在Linux中比较常用于测试磁盘IO 其下载地址:https://brick.kernel.dk/snaps/fio-2.1.10.tar.gz 或者登录其官网:http://freshmeat.sourceforge.net/projects/fio/ 进行下载。 tar -zxvf fio-…...

详解 Flink 的状态管理
一、Flink 状态介绍 1. 流处理的无状态和有状态 无状态的流处理:根据每一次当前输入的数据直接转换输出结果的过程,在处理中只需要观察每个输入的独立事件。例如, 将一个字符串类型的数据拆分开作为元组输出或将每个输入的数值加 1 后输出。…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
文件上传漏洞防御全攻略
要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...
用鸿蒙HarmonyOS5实现国际象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的国际象棋小游戏的完整实现代码,使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├── …...
Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)
做RAG自己打算使用esmilvus自己开发一个,安装时好像网上没有比较新的安装方法,然后找了个旧的方法对应试试: 🚀 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana,适配中文搜索…...
Vue3学习(接口,泛型,自定义类型,v-for,props)
一,前言 继续学习 二,TS接口泛型自定义类型 1.接口 TypeScript 接口(Interface)是一种定义对象形状的强大工具,它可以描述对象必须包含的属性、方法和它们的类型。接口不会被编译成 JavaScript 代码,仅…...

CSS(2)
文章目录 Emmet语法快速生成HTML结构语法 Snipaste快速生成CSS样式语法快速格式化代码 快捷键(VScode)CSS 的复合选择器什么是复合选择器交集选择器后代选择器(重要)子选择器(重要)并集选择器(重要)**链接伪类选择器**focus伪类选…...