springboot第53集:微服务分布式架构,docker-compose,Prometheus,mqtt监控体系周刊

news2024/11/17 11:30:44

从0搭建一套Prometheus监控体系

简介:

Prometheus是一款开源监控系统,起源于SoundCloud的警告工具包。自2012年以来,许多公司和组织开始广泛采用Prometheus。该项目具有活跃的开发人员和用户社区,吸引越来越多的参与者。如今,Prometheus已经成为一个独立的开源项目,摆脱了对任何特定公司的依赖。为了强调这一点并明确项目的治理结构,Prometheus在2016年加入了Cloud Native Computing Foundation,成为继Kubernetes之后的又一个成员。

主要特点:

  • 采用多维数据模型,其中时序由指标名称和键/值标签构成。

  • 支持灵活的查询语言(PromQL)。

  • 无依赖存储,支持本地和远程多种模型。

  • 使用HTTP协议,采用拉取模式,简单易于理解。

  • 监控目标可通过服务发现或静态配置的方式实现。

  • 支持多种统计数据模型,图形化友好。

前言:

  • 通常情况下,Prometheus采用二进制安装,以提高自定义性。

  • 随着云服务时代的发展,使用Docker部署的用户不断增加。

  • 两种安装方式,以满足不同场景下的选择需求。

node-exporter采用go语言开发,专门用来收集Linux系统中硬件、系统指标。既可以用二进制安装部署,也可以通过容器形式部署

mysql_exporter是用来收集MysQL或者Mariadb数据库相关指标的,mysql_exporter需要连接到数据库并有相关权限。既可以用二进制安装部署,也可以通过容器形式部署

docker-compose

//指定版本安装:
$ sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.23.1/\
docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

//对二进制文件赋可执行权限
$ sudo chmod +x /usr/local/bin/docker-compose
$ yum -y install docker-compose
$ docker-compose --version
docker-compose version 1.23.1, build 1719ceb
[root@localhost /]# java -version
openjdk version "1.8.0_161"
OpenJDK Runtime Environment (build 1.8.0_161-b14)
OpenJDK 64-Bit Server VM (build 25.161-b14, mixed mode)
[root@localhost /]# rpm -qa | grep java
python-javapackages-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
tzdata-java-2018c-1.el7.noarch
java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64
java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64
javapackages-tools-3.4.1-11.el7.noarch
java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64
[root@localhost /]# rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
[root@localhost /]# rpm -e --nodeps java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64
[root@localhost /]# rpm -e --nodeps java-1.7.0-openjdk-1.7.0.171-2.6.13.2.el7.x86_64
[root@localhost /]# rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.171-2.6.13.2.el7.x86_64

[安装JDK]

上传新的jdk-8u191-linux-x64.rpm软件到/usr/local/src/执行以下操作:

[root@localhost src]# rpm -ivh jdk-8u191-linux-x64.rpm 
警告:jdk-8u191-linux-x64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID ec551f03: NOKEY
准备中...                          ################################# [100%]
正在升级/安装...
   1:jdk1.8-2000:1.8.0_191-fcs        ################################# [100%]
Unpacking JAR files...
    tools.jar...
    plugin.jar...
    javaws.jar...
    deploy.jar...
    rt.jar...
    jsse.jar...
    charsets.jar...
    localedata.jar...
[root@localhost src]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
[root@localhost src]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
[root@localhost src]# vi /etc/profile
JAVA_HOME=/usr/java/jdk1.8.0_191-amd64
JRE_HOME=/usr/java/jdk1.8.0_191-amd64/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
[root@localhost /]# source /etc/profile
[root@localhost /]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/java/jdk1.8.0_191-amd64/bin:/usr/java/jdk1.8.

安装新版mysql之前,我们需要将系统自带的mariadb-lib卸载

[root@master ~]# rpm -qa|grep mariadb
mariadb-libs-5.5.41-2.el7_0.x86_64
[root@master ~]# rpm -e mariadb-libs-5.5.41-2.el7_0.x86_64 --nodeps

接下来是初始化数据库,我们使用如下命令均可

[root@master~]# mysqld --initialize

新版的推荐此方法,执行生会在/var/log/mysqld.log生成随机密码

更改mysql数据库目录的所属用户及其所属组,然后启动mysql数据库

[root@master~]# chown mysql:mysql /var/lib/mysql -R
[root@master~]# systemctl start mysqld.service
[root@master~]# cat /var/log/mysqld.log | grep 'password'
[root@master~]# service mysqld restart
[root@master~]# mysql -u root -p
$ sudo yum remove docker
$ sudo yum remove docker \
                  docker-common \
                  docker-selinux \
                  docker-engine
yum --version
3.4.3
  Installed: rpm-4.11.3-43.el7.x86_64 at 2020-09-03 03:49
  Built    : CentOS BuildSystem <http://bugs.centos.org> at 2020-04-01 04:21
  Committed: Panu Matilainen <pmatilai@redhat.com> at 2019-10-04

  Installed: subscription-manager-1.24.51-1.el7.centos.x86_64 at 2023-05-27 04:39
  Built    : CentOS BuildSystem <http://bugs.centos.org> at 2022-05-18 15:54
  Committed: Christopher Snyder <csnyder@redhat.com> at 2022-04-18

  Installed: yum-3.4.3-167.el7.centos.noarch at 2020-09-03 03:49
  Built    : CentOS BuildSystem <http://bugs.centos.org> at 2020-04-02 15:56
  Committed: CentOS Sources <bugs@centos.org> at 2020-03-31

  Installed: yum-plugin-fastestmirror-1.1.31-54.el7_8.noarch at 2020-09-03 03:49
  Built    : CentOS BuildSystem <http://bugs.centos.org> at 2020-05-12 16:27
  Committed: Michal Domonkos <mdomonko@redhat.com> at 2020-03-12

安装 yum-utils , 这样就能使用 yum-config-manager 工具设置 Yum 源。

$ sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

执行以下命令,添加 Docker 的 Yum 源。

$ sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
$ sudo yum-config-manager --enable docker-ce-edge
$ sudo yum-config-manager --enable docker-ce-test

如想要禁用测试仓库,可执行以下命令:

$ sudo yum-config-manager --disable docker-ce-edge
$ sudo yum makecache fast
$ sudo yum install docker-ce

在生产系统中,可能需要安装指定版本的 Docker ,而并不总是安装最新的版本。

执行以下命令,即可列出可用的 Docker 版本

$ yum list docker-ce --showduplicates | sort -r

列出 Docker 版本后,可使用以下命令安装指定版本的 Docker 。

$ sudo yum install
$ sudo yum -y install docker-ce-17.09.0.ce
$ sudo docker run hello-world
docker version

卸载 Docker 软件包

$ sudo yum remove docker-ce

如需删除镜像、容器、卷以及自定义的配置文件,可执行以下命令

$ sudo rm -rf /var/lib/docker
InputStream isTrustCa = HttpRequestTest.class.getResourceAsStream("/cert/ca.jks");
InputStream isSelfCert = HttpRequestTest.class.getResourceAsStream("/cert/outgoing.CertwithKey.pkcs12");

KeyStore selfCert = KeyStore.getInstance("pkcs12");
selfCert.load(isSelfCert, "password".toCharArray());
KeyManagerFactory kmf = KeyManagerFactory.getInstance("sunx509");
kmf.init(selfCert, "password".toCharArray());
KeyStore caCert = KeyStore.getInstance("jks");
caCert.load(isTrustCa, "caPassword".toCharArray());
TrustManagerFactory tmf = TrustManagerFactory.getInstance("sunx509");
tmf.init(caCert);
SSLContext sc = SSLContext.getInstance("TLS");

TrustManager[] trustManagers = tmf.getTrustManagers();
X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
sc.init(kmf.getKeyManagers(), trustManagers, (SecureRandom) null);

// 1. 全局配置证书
OkHttpClient.Builder builder = new OkHttpClient.Builder()
    .sslSocketFactory(sc.getSocketFactory(), trustManager)
    .hostnameVerifier(TrustAllHostNames.INSTANCE);
HttpRequest.setHttpClient(builder.build());

// 2. 单次请求配置证书
HttpRequest.get("https://123.xxx")
    .useConsoleLog(LogLevel.BODY)
    .sslSocketFactory(sc.getSocketFactory(), trustManager)
    .disableSslValidation()
    .execute()
    .asString();

mqtt

控制报文中的文本字段编码为UTF-8格式的字符串。UTF-8  是一个高效的Unicode字符编码格式,为了支持基于文本的通信,它对ASCII字符的编码做了优化。

每一个字符串都有一个两字节的长度字段作为前缀,它给出这个字符串UTF-8编码的字节数

MQTT控制报文

4b4b42f524b4399ce04409495bc5e47b.png
image.png
7f18999f6bc6f951daa6b7d0cc9f778d.png
image.png
5f4bc3bcb7b5d5ff19bb6300b6a94578.png
image.png
ab55d81f7dbfae9f5f1b706726c762c6.png
image.png
ab53bbd2f0bd9e453bf651cbfda40380.png
image.png

homebrew 和 npm 的区别?

  1. homebrew,可以理解成 macOS 的软件管理工具,粗俗点说就是 mac 界的 qq 软件助手之类的东西。所以通过 brew,安装什么 chrome浏览器啊、atom 编辑器之类的可视化工具也是可以的。

  2. npm,是 node.js 界的程序/模块管理工具,也就是说 npm 只管理那些服务于 JavaScript 社区的程序。而且跨平台,windows 和 macOS,以及其他类 unix 操作系统都可以用。

  3. npm是用于 NodeJS 语言的包管理器,NodeJS 是跨平台的;而 homebrew 是用于OS X系统的包管理器,类似Windows的各种软件管理工具(所谓XX软件市场之类)和Linux的apt-get/yum/pacman等。

  4. npm 是 node.js 的包管理工具,只要有 node 环境,不管是 windows, macOS, 还是 linux 都可以使用 npm 下载模块,brew 是 mac 的包管理工具,只有 macOS 上才有。

  5. Webstorm IntelliJ Darcula Theme (主题插件,提供和 Webstorm一样的字体和主题)

  6. 小霸王(通过类似 webview 形式嵌套提供各种小游戏,如魂斗罗、坦克大战等)

  7. 韭菜盒子(VSCode 里也可以看股票 & 基金 & 期货实时数据,做最好用的投资插件。)

  8. Live Host (快速编辑 host 文件、每日获取最佳 github ip 解决 DNS 污染问题。)

  9. Live Server(快速启动一个端口服务)

  10. git blame(可以快速的查看某一行最近的一次修改是谁、什么时候、哪次提交修改的)

  11. git graph(可以进行版本管理,比如pull、push、修改比较、log、merge)

  12. gitlens (在vscode中使用git必备插件,功能非常强大)

  13. filesize(在底部显示当前文件到大小)

这行代码定义了一个静态的日志记录器(Logger)变量,使用 SLF4J(Simple Logging Facade for Java)接口,并通过 LoggerFactory 获取 Logger 的实例。这是一种常见的在 Java 项目中使用日志的方式。

  • static: 这个变量是静态的,属于类而不是类的实例。静态变量在类加载时初始化,并且在整个应用程序的生命周期内保持不变。

  • Logger logger: 这是日志记录器的声明,类型是 Logger

  • LoggerFactory.getLogger(GPSPosInfo.class): 通过 LoggerFactory 工厂类的 getLogger 方法,获取一个 Logger 实例。传递的参数是类 GPSPosInfo.class,这样在日志中就可以标识出日志消息是从哪个类输出的。

在使用 SLF4J 进行日志记录时,常用的日志级别包括 DEBUG、INFO、WARN、ERROR。你可以使用这个 logger 对象记录不同级别的日志

ObjectUtils.nullSafeEquals 是 Spring Framework 提供的一个用于比较两个对象是否相等的方法。它考虑了对象为 null 的情况,避免了在比较过程中出现空指针异常。

@NoArgsConstructor@AllArgsConstructor 是 Lombok 提供的注解,用于自动生成类的无参构造方法和全参构造方法。

  1. @NoArgsConstructor: 自动生成无参构造方法。使用这个注解的类会在编译时生成一个默认的无参构造方法,无需手动编写。

  2. @AllArgsConstructor: 自动生成全参构造方法。使用这个注解的类会在编译时生成一个包含所有成员变量的全参构造方法,无需手动编写。

@ToString 是 Lombok 提供的注解之一,用于自动生成类的 toString() 方法。它会自动按照类的字段生成一个格式化的字符串,用于方便地输出对象的内容。

创建一个 JedisConnectionFactory 对象,然后通过一系列的设置为该连接工厂配置连接信息,如主机名、端口、密码、数据库等。接着,配置了连接池相关的参数,包括最大空闲数、最小空闲数、最大连接数、最大等待时间等。

注解 @EqualsAndHashCode,并通过 callSuper = true 参数指定了在生成 equalshashCode 方法时调用父类的相应方法。

logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warning message");
logger.error("This is an error message");
  1. 空值检查: 在处理数据之前进行空值检查,确保数据的完整性。

  2. 方法拆分: 将长方法拆分成更小的方法,提高代码的可读性和可维护性。

  3. Lambda 表达式: 使用 Lambda 表达式和方法引用来简化集合处理。

  4. 常量定义: 将一些常量值提取为静态常量,提高代码的可维护性。

  5. 异常处理: 添加适当的异常处理机制,确保代码的健壮性。

  6. 可配置参数: 将一些硬编码的参数提取为可配置的参数,使得代码更具灵活性。

在 Vue 3 中,watch 选项提供了 flush 选项,你可以使用 flush: 'sync' 来确保在组件初始化时立即执行一次监听函数

  1. findFirst

  • 获取第一个匹配的结果。如果没有找到匹配项,它将返回一个空的 Optional

orElse("")

  • 如果 Optional 为空(表示没有找到匹配项),则返回一个空字符串 ("")。

!CollectionUtils.isEmpty

是否不为空,以避免空指针异常。

  1. Lambda 表达式:

  • 简洁性和可读性: 使用Lambda表达式可以减少冗余的代码,使代码更为简洁,同时提高可读性。在这种情况下,通过Lambda表达式替代了匿名内部类,使得线程的创建过程更为清晰。

  • 优雅的函数式编程风格: Lambda表达式是Java对函数式编程支持的一部分,能够在一些场景中实现更优雅的函数式编程风格。

CompletableFuture:

  • 异步执行: CompletableFuture 提供了更为强大和灵活的异步执行机制。通过CompletableFuture.runAsync方法,可以在后台异步执行任务,而无需手动创建线程。

  • 更好的可组合性: CompletableFuture 支持将多个异步操作组合在一起,形成更为复杂的异步操作流。这使得代码更易于组织和维护。

CompletableFuture.runAsync(() -> {
    
})
  1. 更具体的类型:

  • 将方法的返回类型更改为 List<Map<String, Object>>,以便更清晰地表达返回值的类型。

使用更具描述性的变量名:

  • 修改变量名 page2 为更具描述性的 page,以提高代码的可读性。

异常处理:

  • 代码中没有对远程调用结果和 JSON 解析结果的异常进行处理。在实际代码中,你可能需要进一步处理这些异常,例如打印日志、抛出自定义异常或者根据业务需要进行其他处理。

避免 null 的返回:

  • 在解析 Feign 调用结果的过程中,对 null 进行了检查,以避免可能的空指针异常。

合并返回语句:

  • 将最后的返回语句合并,使得代码更为紧凑。

// 使用 TypeToken 来获取泛型类型

  1. 使用 Objects.isNull

  • 使用 Objects.isNull 来检查对象是否为空,这是 Java 7 引入的方法,避免了手动比较 == null

使用 StrUtil.isNotBlank

  • 使用 StrUtil.isNotBlank 方法来判断字符串不为空,这比直接使用 !StringUtils.isEmpty 更为简洁。

使用 Optional.ofNullable 以避免 null 值引发的空指针异常。

使用 map 获取 对象中的 属性。为 null,整个链式调用将返回 Optional.empty()

如果前面的链式调用中存在 null 值,使用 orElse(null) 提供默认值为 null

使用 ObjectUtils.nullSafeEquals 检查 locate 是否与已定位枚举的代码相等。

  1. distinct()

  • 使用 distinct 进行去重,确保列表中的值是唯一的。

.collect(Collectors.toList())

  • 使用 collect 收集结果为列表。

collect(Collectors.toList()) 是 Java 8 中 Stream API 提供的一个方法,它用于将流中的元素收集到一个列表中。

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 省略 getter 和 setter 方法
}

使用 Optional.ofNullable 包装 ,以避免可能的 null 引用异常。

使用 map 操作将可能为 null 的值转换为字符串表示。如果值为 null,则整个链式调用返回一个空的 Optional

  1. .map(Objects::toString)

  • 使用 map 操作将可能为 null 的值转换为字符串表示。如果值为 null,则整个链式调用返回一个空的 Optional

.map(Long::parseLong)

  • 使用 map 操作将字符串表示的时间戳转换为 Long 类型。如果值为 null 或无法解析为 Long,则整个链式调用返回一个空的 Optional

.orElse(0L)

  • 使用 orElse 操作提供一个默认值,如果整个链式调用返回空的 Optional,则返回默认值 0L

BatteryInfoBO.builder()

  • @Builder 注解会在编译时为带有该注解的类生成一个建造者模式的构造器。

  • builder() 是 Lombok 自动生成的静态方法,返回一个构造者对象,你可以使用这个构造者对象设置属性,并最终调用 build() 方法构建对象。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
An error occurred: This is an example exception.
Exception in thread "main" java.lang.RuntimeException: This is an example exception.
    at ExampleClass.main(ExampleClass.java:10)
  1. 日志体系的抽象logger 是 SLF4J 或其他日志门面的通用接口,而 log 可能指代不同的日志框架(例如 Log4j、Java Util Logging 等)。使用 logger 提供了更高的抽象,使得你可以在不更改代码的情况下切换底层的日志实现。

  2. SLF4J 的性能:SLF4J 提供了一种将日志语句延迟计算的机制,只有在达到适当的日志级别时才计算日志语句的值。这种延迟计算的机制在性能上有一些优势,因为它可以避免不必要的字符串拼接。

  3. 日志级别的判断:SLF4J 支持更多的日志级别(例如 TRACE),而 log 通常使用简单的几个级别(例如 DEBUG、INFO、WARN、ERROR)。使用 logger 可以提供更多的日志级别选项。

  4. 参数化日志:SLF4J 提供了参数化日志的机制,可以有效避免手动拼接字符串。这有助于提高代码的可读性和维护性。

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor

加群联系作者vx:xiaoda0423

仓库地址:https://github.com/webVueBlog/JavaGuideInterview

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

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

相关文章

网站地址怎么改成HTTPS?

现在&#xff0c;所有类型的网站都需要通过 HTTPS 协议进行安全连接&#xff0c;而实现这一目标的唯一方法是使用 SSL 证书。如果您不将 HTTP 转换为 HTTPS&#xff0c;浏览器和应用程序会将您网站的连接标记为不安全。 但用户询问如何将我的网站从 HTTP 更改为 HTTPS。在此页…

springBoot - mybatis 多数据源实现方案

应用场景: 多数据源 小型项目 或者 大项目的临时方案中比较常用.在日常开发中,可能我们需要查询多个数据库,但是数据库实例不同,导致不能通过 指定schema的方式 区分不同的库, 这种情况下就需要我们应用程序配置多数据源 实现方式: 首先自定义实现 datasource数据源 为当前…

HT UI 5.0,前端组件图扑是认真的!

为顺应数字时代的不断发展&#xff0c;图扑 HT UI 5.0 在原有功能强大的界面组件库的基础上进行了全面升级&#xff0c;融入了更先进的技术、创新的设计理念以及更加智能的功能。HT UI 5.0 使用户体验更为直观、个性化&#xff0c;并在性能、稳定性和安全性等方面达到新的高度。…

【Spring实战】32 Spring Boot3 集成 Nacos 服务注册中心 并在 Gateway 网关中应用

文章目录 1. 定义2. 背景3. 功能和特性4. 下载安装5. 服务启动6. 使用示例1&#xff09;服务提供者2&#xff09;服务消费者3&#xff09;测试 7. 代码参考结语 1. 定义 Nacos 是 Dynamic Naming and Configuration Service 的首字母简称&#xff0c;一个更易于构建云原生应用…

自动化测试——selenium工具(web自动化测试)

1、自动化测试 优点&#xff1a;通过自动化测试有效减少人力的投入&#xff0c;同时提高了测试的质量和效率。 也用于回归测试。随着版本越来越多&#xff0c;版本回归的压力越来越大&#xff0c;仅仅通过人工测试 来回归所以的版本肯定是不现实的&#xff0c;所以…

薅运营商羊毛?封杀!

最近边小缘在蓝点网上看到一则消息 “浙江联通也开始严格排查PCDN和PT等大流量行为 被检测到可能会封停宽带”。 此前中国联通已经在四川和上海等多个省市严查家庭宽带 (部分企业宽带也被查) 使用 PCDN 或 PT&#xff0c;当用户的宽带账户存在大量上传数据的情况&#xff0c;中…

MySQL安全(一)权限系统

一、授权 1、创建用户 在MySQL中&#xff0c;管理员可以通过以下命令创建用户&#xff1a; namelocalhost IDENTIFIED BY password; name是要创建的用户名&#xff0c;localhost表示该用户只能从本地连接到MySQL&#xff0c;password是该用户的密码。如果要允许该用户从任何…

明亮成长:新生儿补充维生素A的关键

引言&#xff1a; 新生儿时期是生命最为脆弱而又充满希望的阶段&#xff0c;而维生素A作为生命的必需营养素之一&#xff0c;在新生儿的成长中扮演着至关重要的角色。本文将深入探讨维生素A的作用、补充时机&#xff0c;以及在补充维生素A时应该注意的事项&#xff0c;为家长提…

uniapp H5 touchstart touchend 切换背景会失效,或者没用

uniapp H5 touchstart touchend 切换背景会失效&#xff0c;或者没用 直接上代码 &#xff08;使用 class 以及 hover-class来设置样式&#xff09; class 设置默认的背景图或者样式 hover-class 来设置按下的背景图 或者样式 抬起 按下 <view class"mp_zoom_siz…

如何在群晖中本地部署WPS Office并实现公网远程访问

文章目录 1. 拉取WPS Office镜像2. 运行WPS Office镜像容器3. 本地访问WPS Office4. 群晖安装Cpolar5. 配置WPS Office远程地址6. 远程访问WPS Office小结 7. 固定公网地址 wps-office是一个在Linux服务器上部署WPS Office的镜像。它基于WPS Office的Linux版本&#xff0c;通过…

工业交换机厂家:社区和行业的坚实支柱

工业交换机厂家在现代社会中扮演着重要的角色&#xff0c;不仅在技术创新和产品质量上起着关键作用&#xff0c;而且在社区和整个行业中承担着诸多责任和义务。作为一家致力于服务社区和推动行业发展的工业交换机厂家&#xff0c;厚石网络深知自己的责任和使命&#xff0c;不断…

JVM系列——垃圾收集器

对象存活判断 引用计数法 在对象中添加一个引用计数器&#xff0c;每当有一个地方引用它时&#xff0c;计数器值就加一&#xff1b;当引用失效时&#xff0c;计数器值就减一&#xff1b;任何时刻计数器为零的对象就是不可能再被使用的。 可达性分析算法 通过一系列称为“GC …

Flask框架小程序后端分离开发学习笔记《5》简易服务器代码

Flask框架小程序后端分离开发学习笔记《5》 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 简易服务器代码 接口解析那一块很关键&#xff0c;学后端服务器这一块&#xff0c;感觉主要就是学习相应地址的接口怎么处理。 然后…

30s学会JAVA几个关键词

1.final&#xff08;最终&#xff09; 修饰类-》此类无法被继承 修饰方法-》该方法不可被重写 修饰属性和局部变量-》看作常量&#xff0c;赋值位置&#xff1a;显式初始化&#xff0c;代码块初始化&#xff0c;构造器初始化 2.super(继承子类可用) 1.在子类方法或构造器中…

Python+uiautomator2 框架搭建

一、安装整体步骤 01 开发环境安装 jdk安装&#xff08;version "1.8.0_361"&#xff09;python安装 &#xff08;Python37&#xff09;python编辑器安装 &#xff08;PyCharm2021&#xff09; 02 运行环境安装 adb安装 &#xff08;Android Debug Bridge versio…

硬件知识(2) 手机的传感器-sensor

#灵感# 看看小米在干啥 手机型号&#xff1a;Redmi Note 13 Pro&#xff0c;解读一下它宣传的手机卖点。 目录 宣传1&#xff1a;1/1.4" 大底&#xff0c;f/1.65 大光圈&#xff0c; 宣传2&#xff1a;支持 2 亿像素超清直出&#xff0c;分辨率高达 16320 x 12240 宣…

2024.1.29 GNSS 学习笔记

1.假设只对4颗卫星进行观测定位&#xff0c;卫星的截止高度角是15&#xff0c;那么如何布设这四颗卫星的位置&#xff0c;使其围成的四面体的体积得到最大&#xff0c;以获得最好定位精度&#xff1f; 答&#xff1a;3颗卫星均匀分布在最低仰角面上&#xff0c;第4颗卫星在测站…

对前端限流操作(无Redis版本)

如何限制前端的请求次数 最近学习缓存击穿的时候&#xff0c;解决方法是限流&#xff0c;前端限制请求次数。故通过后端来对前端的请求做限流次数。 这里首先不用redis方法&#xff0c;这里采用通过Aop切面的方式来限制请求次数 创建限流注解 /*** 限流接口*/ Retention(Re…

Windows XP x86 sp3 安装 Google Chrome 49.0.2623.112 (正式版本) (32 位)

1 下载地址&#xff1b; https://dl.google.com/release2/h8vnfiy7pvn3lxy9ehfsaxlrnnukgff8jnodrp0y21vrlem4x71lor5zzkliyh8fv3sryayu5uk5zi20ep7dwfnwr143dzxqijv/49.0.2623.112_chrome_installer.exe 2 直接 双击 49.0.2623.112_chrome_installer.exe 安装&#xff1b; 3 …

Vue Router 路由组件传参

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 路由的动态片段1.1 基本使用1.2 多个动态片段 2. 查询参数2.1 传递查询参数2.2 在路由导航中传递查询参数 3. 路由元信息4. Vuex 状态管理总结 ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料…