分布式集群——jdk配置与zookeeper环境搭建

系列文章目录

分布式集群——jdk配置与zookeeper环境搭建

分布式集群——搭建Hadoop环境以及相关的Hadoop介绍

文章目录

系列文章目录

前言

一 zookeeper介绍与环境配置

1.1 zookeeper的学习

1.2 Zookeeper的主要功能

1.2.1 znode的节点类型

1.2.2 zookeeper的实现

1.3 Zookeeper的特征

zookeeper的几种角色?

1.4 关于zookeeper的文件系统

1.5 zookeeper的角色

1.6 zookeeper的选举机制

1.7 配置免密登录

1.8 安装jdk

1.9 安装配置zookeeper1环境

(1)下载Zookeeper的压缩包

(2)解压缩

(3)修改配置文件

(4)添加myid配置

(5)安装包分发并修改myid的值。

(6)三台机器启动zookeeper服务

二 实战zookeeper

2.1事务型请求与非事务型请求

2.查看当前节点详细数据

2. zookeeper的监听器Watcher

三 Zookeeper的JavaAPI操作

3.1 创建IDEA项目

3.1.1 创建Maven项目

3.1.2 添加项目名称以及项目存放位置

3.2 在pom.xml文件里面添加依赖

3.3 创建APP类

3.4 对监听进行测试

四 补充内容

4.1 sleep()和wait()的区别

总结


前言

本文主要介绍分布式集群搭建,jdk配置以及zookeeper环境配置,以及相关的zookeeper客户端常见的命令介绍,与zookeeper的JavaAPI操作。以下的案例仅供参考。

一 zookeeper介绍与环境配置

1.1 zookeeper的学习

一个开源的分布式协调服务框架,它是集群的管理者。 常用用途:它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。

通供了新增、删除、修改、监听等等功能

ZooKeeper具有高可用性的原因:因为Zookeeper集群中所有的机器都有相同的副本,ZooKeeper本质上是一个分布式文件系统,本身也是一个集群,适合存放小文件(单个文件最好不要超过IM)

1.2 Zookeeper的主要功能

  1. 配置管理(Zookeeper作为配置中心来进行管理)

  2. 分布式锁(Zookeeper提供分布式锁)

  3. 集群管理(Zookeeper作为注册中心来使用)

  4. 统一命名

1.2.1 znode的节点类型

Znode有两种,分为临时节点( 生命周期和会话一样,不能有子节点 )永久节点。Znode还有一个序列化【有顺序】的特性分为四类:

  • 永久节点

  • 临时节点

  • 永久序列化节点【序列化是指有顺序的序列化】

  • 临时序列化节点【序列化是指有顺序的序列化】

  • 顺序的临时节点【会话级别】

  • 临时的非顺序节点

  • 永久的非顺序节点

  • 永久的顺序节点

序列化【Java里面的list,hadoop里面的序列化】

1.2.2 zookeeper的实现

主要通过zookeeper文件系统特性,监听机制,订阅/服务

1.3 Zookeeper的特征

  • 他的核心是一个精简的文件系统,提供了一些简单的操作。

  • 文件系统中的文件及文件夹都是znode。是文件也是文件夹。

  • znode不能大,集群中都是该文件系统的完全副本。

一个领导者,多个学习者(跟随者 + 观察者)组成的集群。 集群中只有半数以上的节点存活,Zookeeper集群才可以正常服务。集群都是单数,3台,5台。

全局数据一致性:每个Server保存一份相同的数据副本,Client无论连接到哪一个Server,数据都是一致的。

更新请求是顺序进行的。 数据更新原子性,一次数据更新要么成功,要么失败。 实时性,在一定时间范围内,Client能读到最新数据。(因为数据量小,所以,会非常的快)。

Client的可以进行读请求(非事务性请求)和写请求(事务性请求)。读请求在非Leader机器上是可以进行处理的,但是写请求,非Leader机器是无权处理,他需要将这个请求再提交给Leader机器处理。

zookeeper的几种角色?

领导者:

  • 1.集群管理者

  • 2.处理事务型操作

  • 3.参与投票,选举

跟随者

  • 1.处理客户端非事务请求

  • 2.转发事务型请求给leader

  • 3.参与投票权限

观察者

  • 1.处理客户端非事务请求

  • 2.转发事务型请求给leader

  • 3.无参与投票权限

关于Zookeeper集群的一些特点:

  • 一个领导者,多个学习者(跟随者+观察者)组成的集群。

  • 集群中只有半数以上的节点存活,Zookeeper集群才可以正常服务。

  • 全局数据一致性:每个Server保存一份相同的数据副本,Client无论连接到哪一个Scrver,数据都是一致的。

写是顺序原则【串行操作】

读是就近原则【并行操作】

1.4 关于zookeeper的文件系统

ZooKeeper本质上是一个分布式文件系统,本身也是一个集群,适合存放小文件(单个文件最好不要超过1M,[主要是做数据一致性的]这是因为一般这些文件都是配置文件,所以不会太大)。也可以把它理解成文件类型的数据库。它本身也是一个集群。我们的Zookeeper可以分布在集群中(多台机器,我们可以称为Zookeeper集群)

结构上有层次,每一个节点都叫做Znode,具备文件(携带数据)和文件夹(可以有子节点)的特性。

  • Znode存储数据大小有限制,最大不能超过1M

  • Znode通过路径引用,绝对路径

每个Znode由三个部分组成:

  • stat:状态信息,描述该Znode的版本,权限等信息。它由版本号,操作控制列表(ACL),时间戳和数据长度组成。

  • data:与该Znode关联的数据。

  • children:该Znode下的子节点。

1.5 zookeeper的角色

1.6 zookeeper的选举机制

若进行Leader选举,至少需要两台机器,我们以选取3台机器组成的服务器集群为例。在集群化初始阶段,当有一台服务器Serverl启动时,其单独无法进行和完成Leader选举。当第二台服务器Server2启动时,此时两台机器相互通信,每台机器都试图找到Leader,于是进入Leader选举过程,选举过程如下:

(1)每台Server '发出一个投票。

由于是初始情况,Serverl和 Scrver2都会将自己作为Lcader 服务器来进行投票,每次投票会包含推举的服务器的myid和ZXID,使用(myid,ZXID)来表示。此时,Serverl的投票为(1,0) ,Server2的投票为(2,0),然后各自将这个投票发给集群中的其他机器。myid表示服务器的一个编号(一个权值),这个值越大越好,越大就越有优势。ZXID被称为事务ID,这个数字越大代表你的数据就越新,这个值越大也越占优势。 投完票后,他们的每台机器的数据都是数组的形式:[(1,0)]和[(2,0)]

(2)接收来自各个服务器的投票

集群中每个服务器收到投票后,首先判断该投票的有效性。如:检查是否是本轮投票,是否来自LOOKING状态的服务器。投票的服务器数要过半,有一个过半机制。注意:是每个服务器都会收到投票,然后追加到数组中。就形成了如下结果:[(1,0),(2,0)]和【(2,0),(1,0)]

(3)处理投票

针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下:A.优先检查ZXID,该值比较大的服务器优先作为Leader。针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下:A.优先检查ZXID,该值比较大的服务器优先作为领袖。

B.如果ZXID值是一样的,那么比较myid,myid 比较大的服务器优先作为Leader。对于Server1而言,它的投票是(1,0),接收到了Server2的投票(2,0)。然后Serverl会重新投票,对于Scrverl而言,他需要更新自己的投票为(2,0)。同理,对于Server2而B.如果ZXID值是一样的,那么比较myid,myid比较大的服务器优先作为领导人。对于Server 1而言,它的投票是(1,0),接收到了Server 2的投票(2,0)。然后Server l会重新投票,对于Scrverl而言,他需要更新自己的投票为(2,0)同理,对于Server 2而

(第几次启动,事务编号【代表数据新旧】)

1.7 配置免密登录

生成密钥,此处为三台虚拟机,需要在三台虚拟机上面同时操作。

拷贝密钥到node01

查看一下生成的密钥: 

拷贝密钥到其他两台主机上面 

完成之后测试一下是否可以免密登录。

1.8 安装jdk

安装JAVA的JDK
安装之前需要先输入上述的命令进行检查,卸载本地的openjdk

  • 查找命令:rpm -qa | grep java , 查看所有的rpm包并且是含有java字样的rpm包。
  • 卸载命令:rpm -e openjdk版本1 openjdk版本2 [....] --nodeps

1. rz -E 将 jdk-8u281-linux-x64.tar.gz 上传到node01节点

2. 解压缩,重命名:jdk1.8.0_281

  • tar -zxvf jdk-8u281-linux-x64.tar.gz -C ./
  • mv jdk-8u281-linux-x64 jdk1.8.0_281

3. 配置环境变量 /etc/profile

  • export JAVA_HOME=/opt/software/jdk1.8.0_281
  • export PATH=:$JAVA_HOME/bin:$PATH

4. 使 环境变量立刻生效

source /etc/profile

之后验证node01的jdk安装是否正确

java

javac

java -version

5. 将 JDK安装目录和环境变量的文件 同步到 node02和node03

  • scp -r jdk目录/ node02:目录
  • scp -r jdk目录/ node03:目录

也可以用$PWD
别忘记 node02和node03环境变量同步并且立刻生效。

6. 测试node02和node03的jdk的安装

1.9 安装配置zookeeper1环境

(1)下载Zookeeper的压缩包

下载网址如下:http://archive.apache.org/dist/zookeeper/选择3.4.9版本进行下载,如下图:


下载完毕后,上传到我们的linux的/opt/zookeeper目录下

(2)解压缩

解压zookeeper的压缩包到/opt路径下,然后进行准备安装

tar -zxvfzookeeper-3.4.9.tar.gz -C /opt

备注:如果已经切换好目录,则命令为tar -zxvf zookeeper-3.4.9.tar.gz -C ./

(3)修改配置文件

第一台机器修改配置文件:
cd /opt/ zookeeper-3.4.9/conf
我们需要找到zoo_sample.cfg
我们拷贝zoo_sample.cfg,并命名为zoo.cfg

利用vim命令编辑zoo.cfg
保留快照数,其实就是保留多少个文件数。(其实,就是日志数)
其中,2888是心跳端口,3888是数据端口。

(4)添加myid配置

在第一台机器的/opt/zookeeper-3.4.9/zkdatas/ 这个路径下创建一个文件,文件名为myid,文件内
容为1。
echo 1 > /opt/ zookeeper-3.4.9/zkdatas/myid 当然也可以通过vim myid进行创建和编辑。

(5)安装包分发并修改myid的值。

在第一台机器上面执行以下命令:

scp -r /opt/zookeeper-3.4.9/ node02:/opt/

scp -r /opt/zookeeper-3.4.9/ node03:/opt/

在第二台机器上修改myid的内容为2
在第三台 机器上修改myid的内容为3

(6)三台机器启动zookeeper服务

三台机器启动zookeeper服务,下面的 命令三台机器都要执行:
/opt/zookeeper-3.4.9/bin/zkServer.sh start
查看启动状态
/opt/zookeeper-3.4.9/bin/zkServer.sh status

二 实战zookeeper

2.1事务型请求与非事务型请求

首先要启动zookeeper集群

从客户端发起 事务型或者非事务型的操作请求

执行命令:

 zkCli.sh -server node01:2181

连接其他节点上的服务器,并设置超时时长

 zkCli.sh -timeout 5000 -server node03:2181

具体操作请求如下:

具体的相关操作

创建角色

创建的内容是有序的

临时节点与永久节点

删除操作

quit是直接关闭连接了

close只是退出客户端

2.查看当前节点详细数据

  • (1) czxid: 创建节点的事务 zxid

    每次修改ZooKeeper状态都会 产生一个 ZooKeeper事务 ID。事务 ID是 ZooKeeper中所有修改总的次序。每 次 修改都有唯一的 zxid,如果 zxid1小于 zxid2,那么 zxid1在 zxid2之前发生。

  • (2) ctime:znode被创建的毫秒数(从 1970年开始)

  • (3) mzxid:znode最后更新的事务 zxid

  • (4) mtime: znode最后修改的毫秒数(从 1970年开始)

  • (5)pZxid:znode最后更新的子节点 zxid

  • (6)cversion:znode 子节点变化号,znode 子节点修改次数

  • (7)dataversion:znode 数据变化号

  • (8)aclVersion:znode 访问控制列表的变化号

  • (9)ephemeralOwner:如果是临时节点,这个是znode 拥有者的session id。如果不是临时节点则是0。

  • (10)dataLength:znode 的数据长度

  • (11)numChildren:znode 子节点数量

2. zookeeper的监听器Watcher

一次性触发一个watcher,只会触发一次,如果需要继续监听,则需要再次添加watcher。通知的实现步骤如下:

  • 客户端注册Watcher到服务端;

  • 服务端发生数据变更;

  • 服务端通知客户端数据变更;

  • 客户端回调Watcher处理变更应对逻辑;

一个最简单的小示例:为创建一个hello节点,并且为hello节点添加wacth机制。然后修改hello节点的携带数据,观察一下时候可以监控到。

修改监听

PS:监听器只生效一次,第二次就不能生效了。

watcher机制常用场景:

  • 发布/订阅

  • 监控集群中主机的存活状态

三 Zookeeper的JavaAPI操作

3.1 创建IDEA项目

3.1.1 创建Maven项目

3.1.2 添加项目名称以及项目存放位置

选择默认的即可

3.2 在pom.xml文件里面添加依赖

 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.12.0</version></dependency><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>2.12.0</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId><version>1.7.25</version><scope>compile</scope></dependency></dependencies>

3.3 创建APP类

 package org.example;​import org.apache.curator.RetryPolicy;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.retry.ExponentialBackoffRetry;import org.apache.zookeeper.CreateMode;​/*** Hello world!**/public class App {public static void main( String[] args ) throws Exception {//制定策略RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,1);// 获取客户端对象//此处的IP地址为客户端CuratorFramework client;client = CuratorFrameworkFactory.newClient("192.168.1.131:2181,192.168.1.132:2181,192.168.1.133:2181",100 , 100 ,retryPolicy);//开启客户端client.start();//创建节点client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/hello2" , "world2".getBytes());//关闭客户端client.close();}}

3.4 对监听进行测试

 package org.example;​import org.apache.curator.RetryPolicy;import org.apache.curator.framework.CuratorFramework;import org.apache.curator.framework.CuratorFrameworkFactory;import org.apache.curator.framework.recipes.cache.ChildData;import org.apache.curator.framework.recipes.cache.TreeCache;import org.apache.curator.framework.recipes.cache.TreeCacheEvent;import org.apache.curator.framework.recipes.cache.TreeCacheListener;import org.apache.curator.retry.ExponentialBackoffRetry;​//节点监听public class To1 {public static void main(String[] args) throws Exception {//制定策略RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,1);// 获取客户端对象//此处的IP地址为客户端CuratorFramework client;client = CuratorFrameworkFactory.newClient("192.168.1.131:2181,192.168.1.132:2181,192.168.1.133:2181",100 , 100 ,retryPolicy);//开启客户端client.start();// 设置我们要监听的对象//  将我们的缓存与我们的节点创建了一种映射关系,自动监听,提供缓存树TreeCache treeCache = new TreeCache(client, "/hello2");//确定监听器//添加监听器,并且传入一个匿名对象(自己定义一个监听器)//监听treeCache.getListenable().addListener(new myTreeCacheListener() );//启动监听treeCache.start();//程序挂起,为了不让它结束[需要一直监听]Thread.sleep(300000);//关闭客户端client.close();​}}​class myTreeCacheListener implements TreeCacheListener{​@Overridepublic void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {// 如果数据不为空,则代表监听被触发了ChildData data = event.getData();//如果event的getData方法得到的数据对象为null,说明没有触发if (data != null){//监听到了之后,根据类型进行处理switch (event.getType()){case NODE_ADDED://节点被添加的处理System.out.println("NODE_ADDED:" +data.getPath() + ":" +new String(data.getData()));break;case NODE_REMOVED://节点被更新的处理System.out.println("NODE_REMOVED:" +data.getPath() + ":" +new String(data.getData()));break;case NODE_UPDATED://节点被移除的处理System.out.println("NODE_UPDATED:" +data.getPath() + ":" +new String(data.getData()));break;}}}}

四 补充内容

4.1 sleep()和wait()的区别

在Java中,sleep()和wait()都是用于线程控制的方法,它们有以下区别:

  1. 调用方式:sleep()是Thread类的静态方法,可以直接通过Thread.sleep()调用。而wait()是Object类的实例方法,只能在同步的代码块或方法中使用。

  2. 所属类别:sleep()是Thread类的方法,用于控制当前线程的休眠时间。wait()是Object类的方法,用于控制线程的等待和唤醒。

  3. 锁的释放:sleep()方法不会释放锁,线程仍然持有锁。而wait()方法会释放锁,使得其他线程可以获取该对象的锁。

  4. 被唤醒:sleep()方法在指定的时间过去后会自动唤醒,线程会重新进入就绪状态。而wait()方法需要通过notify()或notifyAll()方法来唤醒,其他线程调用了对象的notify()或notifyAll()方法后,等待的线程才会被唤醒。

  5. 使用场景:sleep()方法通常用于暂停线程的执行,可以用于模拟耗时操作或定时任务。wait()方法通常用于线程间的协作,一个线程等待某个条件满足后再继续执行。

需要注意的是,wait()方法必须在同步的代码块或方法中使用,否则会抛出IllegalMonitorStateException异常。而sleep()方法可以在任何地方使用。另外,wait()方法还可以指定等待的时间,而sleep()方法只能指定休眠的时间。

sleep是占用资源

wait是等待资源

总结

以上就是今天的内容~

欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

最后:转载请注明出处!!!

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

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

相关文章

【实战】十一、看板页面及任务组页面开发(六) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十八)

文章目录 一、项目起航&#xff1a;项目初始化与配置二、React 与 Hook 应用&#xff1a;实现项目列表三、TS 应用&#xff1a;JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

IIS搭建本地电脑服务器:通过内网穿透技术实现公网访问的步骤指南

1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如网页运行的Apache和Nginx、数据库软件MySQL和MSSQL之类&#xff0c;为方便用户使用&#xff0c;还出现了XAMPP、PHPStudy、宝塔面板等等一系列集成服务&#xff0c;都是为了方便我们…

应用程序管理工具

应用程序管理是 DevOps 的重要组成部分。它可以定义为在所有阶段监控和管理软件应用程序的可用性、运行状况、性能和功能的过程&#xff0c;包括规划、设计、构建、测试、部署、维护和更新。这意味着应用程序从概念到停止都受到监控。 应用程序管理的重要性 管理应用程序可确…

uni-app中使用iconfont彩色图标

uni-app中使用iconfont彩色图标 大家好&#xff0c;今天我们来学习一下uni-app中使用iconfont彩色图标&#xff0c;好好看&#xff0c;好好学&#xff0c;超详细的 第一步 首先&#xff0c;从iconfont官网&#xff08;iconfont-阿里巴巴矢量图标库&#xff09;选择自己需要的图…

数据库导出工具

之前根据数据库升级需求&#xff0c;需要导出旧版本数据&#xff08;sqlserver 6.5&#xff09;&#xff0c;利用c# winfrom写了一个小工具&#xff0c;导出数据。 →→→→→多了不说&#xff0c;少了不唠。进入正题→→→→ 连接数据库&#xff1a;输入数据库信息 连接成功…

K8S:K8S自动化运维容器Docker集群

文章目录 一.k8s概述1.k8s是什么2.为什么要用K8S3.作用及功能4.k8s容器集群管理系统 二.K8S的特性1.弹性伸缩2.自我修复3.服务发现和复制均衡4.自动发布和回滚5.集中化配置管理和秘钥管理6.存储编排7.任务批量处理运行 三.K8S的集群架构四、K8S的核心组件1、Master组件&#xf…

前端文件、图片直传OOS、分片上传、el-upload上传(vue+elementUI)

前言&#xff1a;基于天翼云的面相对象存储(Object-Oriented Storage&#xff0c;OOS),实现小文件的直接上传&#xff0c;大文件的分片上传。 开发文档地址&#xff1a;网址 上传之前的相关操作&#xff1a;注册账户&#xff0c;创建 AccessKeyId 和 AccessSecretKey之后&…

36种水果和蔬菜识别(pytorch框架,深度卷积网络模型,可以实现照片连续识别和视频识别)

1.效果视频&#xff1a;36种水果和蔬菜识别&#xff08;pytorch框架&#xff0c;深度卷积网络模型&#xff0c;可以实现照片连续识别和视频识别&#xff09;_哔哩哔哩_bilibili 2.项目文件夹 第一个文件夹&#xff08;data&#xff09;&#xff1a; 装载的是原始图像 第二个文…

移动端通讯录相关代码

vue3更新版本 附件地址 代码在附件里噜 太多了不好贴

【MYSQL】排序时 如何将0排到最后,并让其他值按正序展示?

背景&#xff1a;展示排名时需要1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;这样展示但是有些没有排名得数据字段默认值时0&#xff0c;这时直接用ASC就会出现问题 实现效果 实现方式&#xff1a;使用MySQL的ORDER BY语句来实现。以下是一个示例的SQL查…

Python编程——深入了解不可变的元组

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 本文专栏&#xff1a;Python专栏 专栏介绍&#xff1a;本专栏为免费专栏&#xff0c;并且会持续更新python基础知识&#xff0c;欢迎各位订阅关注。 目录 一、元组是什么 二、元组的定义 1、相同类型组成元组…

中间件环境搭建配置过程解读

中间件环境搭建 目录 中间件环境搭建xampp 搭建环境Tomcat环境配置安装mysql连接mysql 问题解决 xampp 搭建环境 安装xampp服务集成环境工具 官网地址下载项目压缩包&#xff0c;将项目文件夹放在xampp安装目录的htdocs文件夹下初始化xampp&#xff1a;运行目录内的setup_xamp…

一百六十八、Kettle——用海豚调度器定时调度从Kafka到HDFS的任务脚本(持续更新追踪、持续完善)

一、目的 在实际项目中&#xff0c;从Kafka到HDFS的数据是每天自动生成一个文件&#xff0c;按日期区分。而且Kafka在不断生产数据&#xff0c;因此看看kettle是不是需要时刻运行&#xff1f;能不能按照每日自动生成数据文件&#xff1f; 为了测试实际项目中的海豚定时调度从…

STM32G0 定时器PWM DMA输出驱动WS2812配置 LL库

通过DMA方式输出PWM模拟LED数据信号 优点&#xff1a;不消耗CPU资源 缺点&#xff1a;占用内存较大 STM32CUBEMX配置 定时器配置 定时器通道&#xff1a;TIM3 CH2 分频&#xff1a;0 重装值&#xff1a;79&#xff0c;芯片主频64Mhz&#xff0c;因此PWM输出频率&#xff1a…

USRP 简介,对于NI软件无线电你所需要了解的一切

什么是 USRP 通用软件无线电外设( USRP ) 是由 Ettus Research 及其母公司National Instruments设计和销售的一系列软件定义无线电。USRP 产品系列由Matt Ettus领导的团队开发&#xff0c;被研究实验室、大学和业余爱好者广泛使用。 大多数 USRP 通过高速链路连接到主机&…

Lnmp架构

关闭防火墙 安装依赖包 yum -y install pcre-devel zlib-devel gcc gcc-c make 创建运行用户、组 编译安装Nginx 让系统识别nginx的操作命令 添加Nginx系统服务 vim /lib/systemd/system/nginx.service 编译安装mysql 安装Mysql环境依赖包 创建运行用户 编译安装 cd /opt …

无涯教程-机器学习 - Jupyter Notebook函数

Jupyter笔记本基本上为开发基于Python的数据科学应用程序提供了一个交互式计算环境。它们以前称为ipython笔记本。以下是Jupyter笔记本的一些功能,使其成为Python ML生态系统的最佳组件之一- Jupyter笔记本可以逐步排列代码,图像,文本,输出等内容,从而逐步说明分析过程。 它有…

Java课题笔记~ 综合案例

3.综合案例 3.1 功能介绍 以上是我们在综合案例要实现的功能。除了对数据的增删改查功能外&#xff0c;还有一些复杂的功能&#xff0c;如 批量删除、分页查询、条件查询 等功能 批量删除 功能&#xff1a;每条数据前都有复选框&#xff0c;当我选中多条数据并点击 批量删除 按…

设计模式--装饰者模式(Decorator Pattern)

一、什么是装饰者模式&#xff08;Decorator Pattern&#xff09; 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许你在不修改现有对象的情况下&#xff0c;动态地将新功能附加到对象上。这种模式通过创建一个包装类&#xff0c;…

新手小白想要做好跨境电商独立站,需要考虑哪些要素?

对于不少中小卖家而言&#xff0c;利用独立站出海已然成为下一个跨境热潮。但是采用独立站模式做出海生意前&#xff0c;卖家需要考虑哪些要素&#xff1f; 产品选择 对于国内的卖家来说&#xff0c;依托于国内强大的供应链优势&#xff0c;只要能把握住消费者心态&#xff0…