GRPC服务使用

目标:

1.什么是GRPC服务?

2.安卓客户端怎么不熟GRPC服务?

3.怎么生成GRPC的java类?

一、什么是GRPC服务?

GRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统

支持长连接。

在 GRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务。与许多 RPC 系统类似,GRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个 GRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。 

特征一:多语言/跨平台

gRPC 客户端和服务端可以在多种环境中运行和交互 - 从 google 内部的服务器到你自己的笔记本,并且可以用任何 gRPC 支持的语言来编写。所以,你可以很容易地用 Java 创建一个 gRPC 服务端,用 Go、Python、Ruby 来创建客户端。此外,Google 最新 API 将有 gRPC 版本的接口,使你很容易地将 Google 的功能集成到你的应用里。

特征二:序列化:使用 protocol buffers

gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON)。

二、GRPC安装

需要使用GRPC服务,首先需要安装GRPC工具。

怎么安装GRPC工具呢?

2.1 GRPC安装

GPRC安装,最直接的访问官网,

https://grpc.io/docs/languages/cpp/quickstart/

以Mac OS为例。

2.1.1 安装依赖工具

2.1.1.1 安装cmake

编译需要安装cmake工具。

如果未安装cmake,则需要安装。已安装则进入下一步。

brew install cmake

可以通过以下指令查询本地cmake版本。 

➜  local $ cmake --version
cmake version 3.22.1-g37088a8

CMake suite maintained and supported by Kitware (kitware.com/cmake).
2.1.1.2 安装其他依赖工具

Mac OS: 

$ brew install autoconf automake libtool pkg-config

安装其他编译grpc项目需要的依赖工具。

Linux版本:

$ sudo apt install -y build-essential autoconf libtool pkg-config

安装bazel

可以参考官网

https://bazel.build/install?hl=zh-cn

$ brew install bazel
# 安装后可以确认版本
$ bazel --version
# 升级bazel
$ brew upgrade bazel

2.1.2 克隆项目

克隆grpc仓库以及submodules。

$ git clone --recurse-submodules -b v1.64.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc

如果克隆报错:不能连接服务器,采用 ssh方式克隆。

Cloning into 'grpc'...
fatal: unable to access 'https://hub.fastgit.xyz/grpc/grpc/': Failed to connect to hub.fastgit.xyz port 443 after 75028 ms: Couldn't connect to server

 $ git clone --recurse-submodules -b v1.64.0 --depth 1 --shallow-submodules git@github.com:grpc/grpc.git

使用ssh方式克隆记得先设置ssh-key。

克隆的时候,有third_party仓库项目克隆失败。

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:

  git switch -c <new-branch-name>

Or undo this operation with:

  git switch -

Turn off this advice by setting config variable advice.detachedHead to false

Submodule 'third_party/abseil-cpp' (https://github.com/abseil/abseil-cpp.git) registered for path 'third_party/abseil-cpp'
Submodule 'third_party/benchmark' (https://github.com/google/benchmark) registered for path 'third_party/benchmark'
Submodule 'third_party/bloaty' (https://github.com/google/bloaty.git) registered for path 'third_party/bloaty'
Submodule 'third_party/boringssl-with-bazel' (https://github.com/google/boringssl.git) registered for path 'third_party/boringssl-with-bazel'
Submodule 'third_party/cares/cares' (https://github.com/c-ares/c-ares.git) registered for path 'third_party/cares/cares'
Submodule 'third_party/envoy-api' (https://github.com/envoyproxy/data-plane-api.git) registered for path 'third_party/envoy-api'
Submodule 'third_party/googleapis' (https://github.com/googleapis/googleapis.git) registered for path 'third_party/googleapis'
Submodule 'third_party/googletest' (https://github.com/google/googletest.git) registered for path 'third_party/googletest'
Submodule 'third_party/opencensus-proto' (https://github.com/census-instrumentation/opencensus-proto.git) registered for path 'third_party/opencensus-proto'
Submodule 'third_party/opentelemetry' (https://github.com/open-telemetry/opentelemetry-proto.git) registered for path 'third_party/opentelemetry'
Submodule 'third_party/protobuf' (https://github.com/protocolbuffers/protobuf.git) registered for path 'third_party/protobuf'
Submodule 'third_party/protoc-gen-validate' (https://github.com/envoyproxy/protoc-gen-validate.git) registered for path 'third_party/protoc-gen-validate'
Submodule 'third_party/re2' (https://github.com/google/re2.git) registered for path 'third_party/re2'
Submodule 'third_party/xds' (https://github.com/cncf/xds.git) registered for path 'third_party/xds'
Submodule 'third_party/zlib' (https://github.com/madler/zlib) registered for path 'third_party/zlib'

怎么办呢?

查看submodules,在项目的.gitmodules可以查看这些第三方子模块

➜  grpc git:(v1.62.0) cat .gitmodules
[submodule "third_party/abseil-cpp"]
	path = third_party/abseil-cpp
	url = https://github.com/abseil/abseil-cpp.git
[submodule "third_party/benchmark"]
	path = third_party/benchmark
	url = https://github.com/google/benchmark
[submodule "third_party/bloaty"]
	path = third_party/bloaty
	url = https://github.com/google/bloaty.git
[submodule "third_party/boringssl-with-bazel"]
	path = third_party/boringssl-with-bazel
	url = https://github.com/google/boringssl.git
[submodule "third_party/cares/cares"]
	path = third_party/cares/cares
	url = https://github.com/c-ares/c-ares.git
[submodule "third_party/envoy-api"]
	path = third_party/envoy-api
	url = https://github.com/envoyproxy/data-plane-api.git
[submodule "third_party/googleapis"]
	path = third_party/googleapis
	url = https://github.com/googleapis/googleapis.git
[submodule "third_party/googletest"]
	path = third_party/googletest
	url = https://github.com/google/googletest.git
[submodule "third_party/opencensus-proto"]
	path = third_party/opencensus-proto
	url = https://github.com/census-instrumentation/opencensus-proto.git
[submodule "third_party/opentelemetry"]
	path = third_party/opentelemetry
	url = https://github.com/open-telemetry/opentelemetry-proto.git
[submodule "third_party/protobuf"]
	path = third_party/protobuf
	url = https://github.com/protocolbuffers/protobuf.git
[submodule "third_party/protoc-gen-validate"]
	path = third_party/protoc-gen-validate
	url = https://github.com/envoyproxy/protoc-gen-validate.git
[submodule "third_party/re2"]
	path = third_party/re2
	url = https://github.com/google/re2.git
[submodule "third_party/xds"]
	path = third_party/xds
	url = https://github.com/cncf/xds.git
[submodule "third_party/zlib"]
	path = third_party/zlib
	url = https://github.com/madler/zlib
	# When using CMake to build, the zlib submodule ends up with a
	# generated file that makes Git consider the submodule dirty. This
	# state can be ignored for day-to-day development on gRPC.
	ignore = dirty

方法一:采用git更新子模块

git submodule update

第一次克隆失败,这个子模块git 更新大概率也会失败。

方法二:手动克隆

cd third_party

git clone git@github.com:abseil/abseil-cpp.git

git clone git@github.com:google/benchmark.git

git clone git@github.com:google/bloaty.git

git clone git@github.com:google/boringssl.git

2.1.3 编译项目

2.1.3.1 设置GPRC安装目录

编译项目,需要设置.

根据自己需要设置安装目录。例如:

export GRPC_INSTALL_DIR=/usr/local/grpc
export PATH="$GPRC_INSTALL_DIR/bin:$PATH"
2.1.3.2 编译和安装
$ cd grpc
# 创建编译目录
$ mkdir -p cmake/build
# 在路径之间自由切换
$ pushd cmake/build
# cmake环境配置
$ cmake -DgRPC_INSTALL=ON \
      -DgRPC_BUILD_TESTS=OFF \
      -DCMAKE_INSTALL_PREFIX=$GRPC_INSTALL_DIR \
      ../..
$ make -j 4
$ sudo make install
$ popd

编译安装成功,添加环境变量

$ sudo vi /etc/zprofile
# 添加grpc的环境变量
export GRPC_HOME=/usr/local/grpc

export PATH=$PATH:$GRPC_HOME/bin

 2.1.3.3 常见编译错误
1.编译错误cares未包含CmakeLists.txt文件

执行

cmake -DgRPC_INSTALL=ON \
      -DgRPC_BUILD_TESTS=OFF \
      -DCMAKE_INSTALL_PREFIX=$GRPC_INSTALL_DIR \
      ../..

报错。

-- Performing Test HAVE_STDC_FORMAT_MACROS - Success
CMake Warning at third_party/abseil-cpp/CMakeLists.txt:82 (message):
  A future Abseil release will default ABSL_PROPAGATE_CXX_STD to ON for CMake
  3.8 and up.  We recommend enabling this option to ensure your project still
  builds correctly.


-- Performing Test ABSL_INTERNAL_AT_LEAST_CXX17
-- Performing Test ABSL_INTERNAL_AT_LEAST_CXX17 - Failed
-- Performing Test ABSL_INTERNAL_AT_LEAST_CXX20
-- Performing Test ABSL_INTERNAL_AT_LEAST_CXX20 - Failed
CMake Error at cmake/cares.cmake:25 (add_subdirectory):
  The source directory

    /Users/a1/workspace/DEV/grpc/third_party/cares/cares

  does not contain a CMakeLists.txt file.
Call Stack (most recent call first):
  CMakeLists.txt:337 (include)

这个是cares项目的代码不全导致,同步一下cares.

$ cd third_party

$ cd cares

$ git pull origin master

因为cares/cares也是一个依赖submodule。

因此,需要进入克隆依赖项目下来

$ git clone git@github.com:c-ares/c-ares.git
$ rm cares
# 将项目重新命名为cares,保持和原目录定义一致
$ mv c-ares cares
 

然后重新编译。

2. ClassDataFull构造函数参数错误

Built target libprotobuf-lite失败。

[ 23%] Building CXX object CMakeFiles/gpr.dir/src/core/lib/gprpp/posix/env.cc.o
/Users/a1/workspace/DEV/grpc/third_party/protobuf/src/google/protobuf/any.pb.cc:180:21: error: no matching constructor for initialization of 'const ::google::protobuf::MessageLite::ClassDataFull'
      ClassDataFull _data_ = {
                    ^        ~
/Users/a1/workspace/DEV/grpc/third_party/protobuf/src/google/protobuf/message_lite.h:598:15: note: candidate constructor not viable: requires 4 arguments, but 5 were provided
    constexpr ClassDataFull(ClassData base,
              ^
/Users/a1/workspace/DEV/grpc/third_party/protobuf/src/google/protobuf/message_lite.h:597:10: note: candidate constructor (the implicit copy constructor) not viable: requires 1 argument, but 5 were provided
  struct ClassDataFull : ClassData {
         ^

on.cc.o
[ 24%] Building CXX object third_party/protobuf/CMakeFiles/libprotobuf-lite.dir/src/google/protobuf/wire_format_lite.cc.o
[ 24%] Linking CXX static library libprotobuf-lite.a
[ 24%] Built target libprotobuf-lite
make: *** [all] Error 2

安装bazel工具,然后再编译。

还是存在错误。

/Users/a1/workspace/DEV/grpc/third_party/protobuf/src/google/protobuf/any.pb.cc:180:21: error: no matching constructor for initialization of 'const ::google::protobuf::MessageLite::ClassDataFull'
      ClassDataFull _data_ = {
                    ^        ~
/Users/a1/workspace/DEV/grpc/third_party/protobuf/src/google/protobuf/message_lite.h:598:15: note: candidate constructor not viable: requires 4 arguments, but 5 were provided
    constexpr ClassDataFull(ClassData base,

ClassDataFull构造函数是4个参数,当前提供了5个参数。因此创建对象报错。

有两种方案:

1)直接修改代码

2)确认分支是否正确,是否在其他分支使用5个参数的构造函数。

3) 确认本地Protobuf版本。

建议使用方法3)。

这个错误提示是由于在编译 Protobuf 代码时遇到不匹配的构造函数。通常,这种错误与编译器不兼容或 Protobuf 库版本不匹配有关。以下是解决这个问题的一些方法:

1. 检查 Protobuf 版本

确保你正在使用的 Protobuf 版本与项目中其他部分兼容。不同版本的 Protobuf 可能有 API 不兼容的问题。

2. 更新或重新安装 Protobuf

如果你使用的是旧版本的 Protobuf,尝试更新到最新版本。你可以通过以下命令更新 Protobuf:

# For Linux/MacOS
brew install protobuf
brew upgrade protobuf

bash

3. openssl/ssl头文件找不到。
distributor.h:36:
In file included from /Users/a1/workspace/DEV/grpc/src/core/lib/security/security_connector/ssl_utils.h:42:
/Users/a1/workspace/DEV/grpc/src/core/tsi/ssl/key_logging/ssl_key_logging.h:23:10: fatal error: 'openssl/ssl.h' file not found
#include <openssl/ssl.h>
         ^~~~~~~~~~~~~~~

 需要安装openssl

https://github.com/openssl/openssl

因为需要头文件,因此需要手动安装

# 克隆项目
$ git clone git@github.com:openssl/openssl.git

# 编译
$ cd openssl
$ ./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl
$ make
# 安装
$ sudo make install

也可以直接下载压缩包。

$ curl -0 https://www.openssl.org/source/openssl-3.3.0.tar.gz
$ tar -xzf openssl-3.3.0.tar.gz
$ cd openssl-3.3.0

添加环境变量

$ sudo vi /etc/zprofile

# openssl
export OPENSSL_HOME=/usr/local/ssl
# openssl头文件路径添加
$ export CPATH=/usr/local/ssl/include:$CPATH

# path enviroment
export PATH=$PATH:$OPENSSL_HOME/bin

然后生效环境变量

source /etc/zprofile

再次编译。

4. 找不到X509_STORE_set_check_crl的定义

grpc/src/core/tsi/ssl_transport_security.cc:2399:9: error: use of undeclared identifier 'X509_STORE_set_check_crl'

/Users/a1/workspace/DEV/grpc/third_party/boringssl-with-bazel/include/openssl/x509.h:4772:77: note: passing argument to parameter 'ctx' here
OPENSSL_EXPORT STACK_OF(X509_CRL) *X509_STORE_CTX_get1_crls(X509_STORE_CTX *ctx,
                                                                            ^
/Users/a1/workspace/DEV/grpc/src/core/tsi/ssl_transport_security.cc:2399:9: error: use of undeclared identifier 'X509_STORE_set_check_crl'
        X509_STORE_set_check_crl(cert_store, CheckCrlPassthrough);
        ^
6 errors generated.
make[2]: *** [CMakeFiles/grpc.dir/src/core/tsi/ssl_transport_security.cc.o] Error 1
make[1]: *** [CMakeFiles/grpc.dir/all] Error 2
make: *** [all] Error 2

openssl版本的参数

$ openssl version
OpenSSL 3.3.0 9 Apr 2024 (Library: OpenSSL 3.3.0 9 Apr 2024)

如果版本低于3.0,可以安装更新版本。

$ brew install openssl@3

然后重新编译

$ make clean

$ make -j 4

5. /Users/a1/workspace/DEV/grpc/third_party/upb/upb/message/compat.c:29:7: error: unknown type name 'upb_Extension'
const upb_Extension* upb_Message_FindExtensionByNumber(const upb_Message* msg,
      ^

third_party中的udp有问题

    git clone https://github.com/Microsoft/vcpkg.git
    cd vcpkg
    ./bootstrap-vcpkg.sh
    ./vcpkg integrate install
    ./vcpkg install upb

不能使用最新版的upd,需要按照以下步骤更新upd

steps below;
1. Update third_party/upb directory by running
   - `export GRPC_ROOT=~/git/grpc`
   - `wget https://github.com/protocolbuffers/protobuf/releases/download/v25.1/protobuf-25.1.zip`
   - `rm -rf $GRPC_ROOT/third_party/upb`
   - `unzip protobuf-25.1.zip -d /tmp/protobuf`
   - `cp -r /tmp/protobuf/protobuf-25.1/upb $GRPC_ROOT/third_party/upb`
2. Update the dependency in `grpc_deps.bzl` to the same commit
3. Populate the bazel download mirror by running `bazel/update_mirror.sh`
4. Run `tools/buildgen/generate_projects.sh` to regenerate the generated files
5. Run `tools/codegen/core/gen_upb_api.sh` to regenerate upb files.

三、GPRC客户端接入

服务端定义好grpc的接口以后,提供xxx.proto 接口文档。

客户端需要将对应的接口文档,编译为本地语言的接口文档,例如 C++版本,Java版本,kotlin版本等。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】-Tomcat安装部署[12]

目录 简介 安装 安装部署JDK环境 解压并安装Tomcat 简介 Tomcat是由Apache开发的一个Servlet容器&#xff0c;实现了对Servlet和JSP的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#…

vscode 插件-02 html

open in brower 安装后可以在vscode中,使用浏览器打开编辑的.html文件,以查看效果。 Live Preview 实现网页的实时渲染显示功能&#xff0c;即实时预览。

K8S认证|CKA题库+答案| 1. 权限控制RBAC

1、权限控制RBAC 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node k8s master …

ptrade从零开始学习量化交易第16期【ptrade策略API介绍之set_slippage-设置滑点】

设置函数 更加详细的调用方法&#xff0c;后续会慢慢整理。 也可找寻博主历史文章&#xff0c;搜索关键词使用方案&#xff0c;比如本文涉及函数set_slippage&#xff01; 感谢关注&#xff0c;咨询免费开通量化回测与获取实盘权限&#xff0c;欢迎和博主联系&#xff01; …

沃尔玛卖家必学:自养号测评环境搭建技巧,助你销量翻倍

沃尔玛&#xff0c;作为国际零售行业的翘楚&#xff0c;其平台的销售业绩对卖家来说意义非凡。然而&#xff0c;在现今这个充满竞争的商业环境中&#xff0c;众多卖家在沃尔玛平台上努力追求销量的过程中&#xff0c;常常面临着重重障碍和挑战。他们迫切需要在短时间内找到一种…

免费发布web APP的四个途径(Python和R)

免费发布数据分析类&#x1f310;web APP的几个途径&#x1f4f1; 数据分析类web APP目前用来部署生信工具&#xff0c;统计工具和预测模型等&#xff0c;便利快捷&#xff0c;深受大家喜爱。而一个免费的APP部署途径&#xff0c;对于开发和测试APP都是必要的。根据笔者的经验…

junams 文件上传 (CNVD-2020-24741)

漏洞环境搭建&#xff1a;vulfocus 发现这个页面后&#xff0c;通过访问IP:Port/admin.php,登录后台 通过默认用户名密码admin&#xff1a;admin进行登录 登录后台后&#xff0c;主要思路就是找到网站的文件上传点&#xff0c;然后去上传一句话木马&#xff0c;或者找到命令执…

AI大模型:GPT引领,百模征战

从 2022 年底 ChatGPT 横空出世&#xff0c;到 2023 年一整年的大模型热潮&#xff0c;在科技的巨浪中&#xff0c;大模型技术如同一颗璀璨的明星&#xff0c;迅速起并引领着一场前所未有的技术革命。大模型如同推动创新的引擎&#xff0c;将科技的边界不断拓展。 01 大模型演…

[数据集][目标检测]弹簧上料检测数据集VOC+YOLO格式142张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;142 标注数量(xml文件个数)&#xff1a;142 标注数量(txt文件个数)&#xff1a;142 标注类别…

自动驾驶决策规划算法——二次规划

自动驾驶决策规划算法第二章第二节(中) 参考线算法_哔哩哔哩_bilibili 动态规划开辟的凸空间如下&#xff0c;两条橙色线之间&#xff1a; 黄色的点就意味着L的上下界&#xff0c;物理意义是当轨迹ss1时&#xff0c;L的范围应该是(Lmin1,Lmax1)之间&#xff0c;这个范围就是开辟…

Git使用教程:最详细、最傻瓜、最浅显、真正手把手教

Git是什么&#xff1f;SVN与Git最主要的区别&#xff1f;在windows上如何安装Git?如何操作&#xff1f;远程仓库创建与合并分支 一、Git是什么 Git是目前世界上最先进的分布式版本控制系统。 工作原理/流程&#xff1a; workspace&#xff1a;工作区Index/Stage&#xff1a…

Jetbrains 拥抱 LLM ,推出的AI Assistant,这样使用!

ai assistant激活成功后&#xff0c;如图 ai assistant渠道&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 在去年五月份的 Google I/O 2023 上&#xff0c;Google 为 Android Studio 推出了 Studio Bot 功能&#xff0c;使用了谷歌编码基础模型 Codey,Codey 是…

3d模型旋转世界坐标输入怎么用?怎么设置?---模大狮模型网

在3D建模和动画领域&#xff0c;模型的旋转是常见的操作之一。而当我们谈到模型的旋转时&#xff0c;经常会涉及到世界坐标和局部坐标这两个概念。世界坐标是描述物体在三维空间中绝对位置的坐标系统&#xff0c;而局部坐标则是相对于物体自身坐标系的坐标系统。本文将详细介绍…

(六)Spring教程——Spring IoC容器(中)

(一)Spring教程——Spring框架简介 (二)Spring教程——Spring框架特点 (三)Spring教程——依赖注入与控制反转 (四)Spring教程——控制反转或依赖注入与Java的反射技术 (五)Spring教程——Spring IoC容器&#xff08;上&#xff09; (六)Spring教程——Spring IoC容器(中) (七)…

axios案例应用

1、Spring概述 Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架&#xff0c;以 IoC(Inverse Of Control: 反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核&#xff0c;提供了展现层 Spring MVC 和持久层。Spring JDBC 以及业务层事务管理等众多…

Removing Smallest Multiples

题目描述: 给你一个集合 S &#xff0c;其中包含前 n 个正整数1, 2 。 您可以对 S 执行以下操作任意次数(可能为零)&#xff1a; #include<iostream> #include<cstring> #include<algorithm> #define int long long using namespace std; int t,n,sum; bo…

前端vue基于uni-app的地图定位与距离测算技术研究

前端vue基于uni-app的地图定位与距离测算技术研究 摘要&#xff1a;随着移动互联网的普及和智能终端设备的多样化&#xff0c;移动应用的需求也在不断增长。uni-app作为一款跨平台的前端开发框架&#xff0c;为开发者提供了极大的便利。本文着重探讨了如何在uni-app中实现地图…

JVM知识之三色标记算法

一、定义 三色标记算法是一种用于垃圾收集的算法&#xff0c;它将内存中的对象分为三种颜色&#xff1a;白色、灰色和黑色。标记完毕后&#xff0c;所有可达对象都为黑色&#xff0c;剩余的白色对象视为不可达&#xff0c;可以被清除。 白色&#xff1a;该对象未被标记&…

SJDW-50G高低温电子万能试验机

一.项目简介&#xff1a; 微机控制高低温电子万能试验机是电子技术与机械传动相结合的新型材料试验机&#xff0c;可以在规定的温度内完成材料测试&#xff0c;它具有宽广准确的加载速度和测力范围&#xff0c;对载荷、变形、位移的测量和控制有较高的精度和灵敏度&#xff0c…

工作学习的电脑定时关机,定时重启,定时提醒

可以直接下载工具&#xff1a; 定时自动关机 大家好&#xff0c;&#xff01; 在我们学习与工作时&#xff0c;经常会遇到想要在完成一个任务后&#xff0c;再关闭电脑或对电脑重启&#xff0c;但这个时间点&#xff0c;操作电脑的人可能不能在电脑旁边&#xff0c;这样就需要…