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-g37088a8CMake 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 falseSubmodule '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-cppurl = https://github.com/abseil/abseil-cpp.git
[submodule "third_party/benchmark"]path = third_party/benchmarkurl = https://github.com/google/benchmark
[submodule "third_party/bloaty"]path = third_party/bloatyurl = https://github.com/google/bloaty.git
[submodule "third_party/boringssl-with-bazel"]path = third_party/boringssl-with-bazelurl = https://github.com/google/boringssl.git
[submodule "third_party/cares/cares"]path = third_party/cares/caresurl = https://github.com/c-ares/c-ares.git
[submodule "third_party/envoy-api"]path = third_party/envoy-apiurl = https://github.com/envoyproxy/data-plane-api.git
[submodule "third_party/googleapis"]path = third_party/googleapisurl = https://github.com/googleapis/googleapis.git
[submodule "third_party/googletest"]path = third_party/googletesturl = https://github.com/google/googletest.git
[submodule "third_party/opencensus-proto"]path = third_party/opencensus-protourl = https://github.com/census-instrumentation/opencensus-proto.git
[submodule "third_party/opentelemetry"]path = third_party/opentelemetryurl = https://github.com/open-telemetry/opentelemetry-proto.git
[submodule "third_party/protobuf"]path = third_party/protobufurl = https://github.com/protocolbuffers/protobuf.git
[submodule "third_party/protoc-gen-validate"]path = third_party/protoc-gen-validateurl = https://github.com/envoyproxy/protoc-gen-validate.git
[submodule "third_party/re2"]path = third_party/re2url = https://github.com/google/re2.git
[submodule "third_party/xds"]path = third_party/xdsurl = https://github.com/cncf/xds.git
[submodule "third_party/zlib"]path = third_party/zliburl = 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/grpcexport 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 CMake3.8 and up.  We recommend enabling this option to ensure your project stillbuilds 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/caresdoes 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 providedconstexpr 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 providedstruct 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版本等。

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

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

相关文章

Android Webview加载pdf文件无法缩放问题

WebView设置开启页面缩放&#xff1a; settings webView.getSettings(); settings.setSupportZoom(true); settings.setJavaScriptEnabled(true); settings.setUseWideViewPort(true); settings.setLoadWithOverviewMode(true); settings.setBuiltInZoomControls(true); sett…

Matlab 2023b学习笔记1——界面认识

下载安装好Matlab后&#xff0c;可以看到如下界面&#xff1a; 可以看到&#xff0c;这时只有命令行窗口。我们在上方工具栏中选择“布局”—— “默认”&#xff0c;即可看到左右两边多出来了“当前文件夹”与“工作区”两栏。 一、当前文件夹界面 这个界面显示的是当前目录下…

常见应用流量特征分析

目录 1.sqlmap 1.常规GET请求 2.通过--os-shell写入shell 3.post请求 2.蚁剑 编码加密后 3.冰蝎 冰蝎_v4.1 冰蝎3.2.1 4.菜刀 5.哥斯拉 1.sqlmap 1.常规GET请求 使用的是sqli-labs的less7 &#xff08;1&#xff09;User-Agent由很明显的sqlmap的标志&#xff0c;展…

二叉数之插入操作

首先是题目 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能存在多种有效…

佩戴安全头盔监测识别摄像机

佩戴安全头盔是重要的安全措施&#xff0c;尤其在工地、建筑工程和工业生产等领域&#xff0c;安全头盔的佩戴对于工人的生命安全至关重要。为了更好地管理和监控佩戴安全头盔的情况&#xff0c;监测识别摄像机成为了一项重要的工具。监测识别摄像机可以通过智能技术监测并记录…

小程序-滚动触底-页面列表数据无限加载

// index/index.vue <template> <!-- 自定义导航栏 --> <CustomNavbar /> <scroll-view scrolltolower"onScrolltolower" scroll-y class"scroll-view"> <!-- 猜你喜欢 --> <Guess ref"guessRef" /> </s…

vue koa post 请求代理失败问题总结

场景是在使用 koa 写接口时&#xff0c;客户端发送 post 请求&#xff0c;服务端会报下面这个错误&#xff0c;导致接口未能访问成功&#xff1a; 前端接口一直 Pending 状态&#xff0c; 解决方案&#xff1a;走的是本地 mock 数据&#xff0c;未访问服务端的接口 总结&#x…

.NET调用阿里云人脸核身服务端 (ExecuteServerSideVerification)简易流程保姆级教学

需要注意的是&#xff0c;以下内容仅限基础调用 功能说明 该功能是输入核验人的姓名和身份证以及人脸照片&#xff0c;去阿里库里面匹配&#xff0c;3个信息是否一致&#xff0c;一致则验证通过&#xff0c;需要注意的是&#xff0c;人脸有遮挡&#xff0c;或者刘海&#xff0…

「项目」负载均衡在线OJ(ONLINE_JUDGE)系统

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

作家百度百科怎么做出来的 怎么创建作家百科词条才能通过

创建作家百度百科词条需要遵循一定的步骤&#xff0c;并注意一些关键点&#xff0c;以确保词条能够顺利通过审核。以下是伯乐网络传媒pouquan根据经验结果得出的详细指导&#xff1a; 准备工作 注册百度账号&#xff1a;在创建任何百度百科词条之前&#xff0c;您需要先注册一…

Llama模型家族之使用 Supervised Fine-Tuning(SFT)微调预训练Llama 3 语言模型(一) LLaMA-Factory简介

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

docker 指定jdk11镜像执行jar

dockerfile :下载jdk11 并将上传的jar 放入jdk11容器/root&#xff0c;改名为app.jar vi dockerfile 。。。。内容见下图 # 构建jdk11镜像 docker build -t demo . # 也可以通过jdk11镜像&#xff08;前提有jdk11镜像&#xff09;外挂载目录方式运行jar docker run --name d…

AI大模型应用开发实践:4.基于 Chat Completions API 实现外部函数调用

基于 Chat Completions API 实现外部函数调用 2023年6月20日,OpenAI 官方在 Chat Completions API 原有的三种不同角色设定(System, Assistant, User)基础上,新增了 Function Calling 功能。 详见OpenAI Blog functions 是 Chat Completion API 中的可选参数,用于提供…

军工单位如何做到安全跨网文件交换与导出的

在现代信息化战争中&#xff0c;军工单位在信息安全方面的需求尤为突出。跨网文件交换与导出作为军工单位日常运营的重要环节&#xff0c;面临着网络带宽限制、数据安全风险、合规性要求和传输稳定性等挑战。下面&#xff0c;我们将从以下几个方面探讨军工单位如何实现安全、高…

《Effective Objective-C 2.0》读书笔记——协议与分类

目录 第四章&#xff1a;协议与分类第23条&#xff1a;通过委托与数据源协议进行对象间通信第24条&#xff1a;将类的实现代码分散到便于管理的数个分类之中第25条&#xff1a;总是为第三方类的分类名称加前缀第26条&#xff1a;勿在分类中声明属性第27条&#xff1a;使用“cla…

匝间冲击耐压试验仪产品介绍及工作原理

产品简介 武汉凯迪正大KD2684S匝间冲击耐压试验仪适用于电机、变压器、电器线圈等这些由漆包线绕制的产品。因漆包线的绝缘涂敷层本身存在着质量问题&#xff0c;以及在绕线、嵌线、刮线、接头端部整形、绝缘浸漆、装配等工序工艺中不慎而引起绝缘层的损伤等&#xff0c;都会造…

Docker Compose使用

Docker-Compose是什么 docker建议我们每一个容器中只运行一个服务,因为doker容器本身占用资源极少&#xff0c;所以最好是将每个服务单独分割开来&#xff0c;但是这样我们又面临了一个问题&#xff1a; 如果我需要同时部署好多个服务&#xff0c;难道要每个服务单独写Docker…

Midjourney应用场景、特点、生成图片带来影响

Midjourney是一个基于GPT-3.5系列接口开发的免费AI机器人&#xff0c;旨在提供多领域的智能对话服务。本文主要介绍Midjourney的应用场景、功能特点、图片生成后可以做什么&#xff1f; 一、Midjourney应用场景 Midjourney的应用场景相当广泛&#xff0c;以下是一些主要的适用…

Public Key Retrieval is not allowed解决

修改高级属性。 “Public Key Retrieval is not allowed” 错误是由于 MySQL 连接驱动程序的默认行为更改所引起的。在 MySQL 8.0 版本及更新版本中&#xff0c;默认情况下禁用了通过公钥检索用户密码的功能。 在旧版本的 MySQL 中&#xff0c;客户端连接到服务器时&#xf…

【Unity2D:C#Script】制作敌人

一、制作敌人预制体 1. 在场景面板中添加敌人&#xff0c;并创建预制体 2. 设置敌人的锚点在底部 二、为敌人添加碰撞体积 1. 添加Box Collider 2D、Rigidbody 2D组件 2. 调整轴心点位置、层级、碰撞体积大小、刚体类型、锁定z轴 Body Type&#xff08;刚体类型&#xff09;&…