【Golang/gRPC/Nacos】在golang中将gRPC和Nacos结合使用
Nacos与gRPC
前言
关于这部分,前段时间我在看文档以及视频教程的时候,怎么都想不明白,到底为什么要用gRPC是什么,他在项目中应该充当什么样的角色?Nacos又是如何和他结合的?
于是我就决定去看看一些小项目是如何实现的这个功能,现在将我最近学到的分享给大家。
正文
在正文开始之前,我们要先知道Nacos和gRPC在本篇内容中,会涉及到的作用:
gRPC
- gRPC 允许服务之间无缝通信,像调用本地函数一样调用远程服务的功能。
Nacos
- 服务在启动时将自身注册到 Nacos,包含 IP、端口和服务名称,其他服务可以通过服务名称查询可用实例。
正片
在这里,我们以一个实现了用户注册/登陆的接口为例子,进行讲解。
micro # 项目根目录
└── app # 应用逻辑目录
├── api # 定义API接口
│ └── user.go # 用户相关的API实现
├── client # 客户端功能实现
│ ├── nacos # Nacos配置相关
│ │ └── nacos.go # Nacos客户端实现
│ └── user # 用户客户端功能
│ └── proto # 用户相关的proto定义
│ └── userclient.go # 用户客户端的实现
├── cmd # 应用入口
│ └── main.go # 启动程序的主文件
├── Middleware # 中间件处理
│ └── Token.go # 处理Token的中间件
├── model # 数据模型定义
│ └── model.go # 数据结构和模型实现
├── router # 路由功能实现
│ └── router.go # 路由定义和管理
└── utils # 工具函数
└── jwt.go # JWT处理相关函数
└── response # 响应相关定义
├── Errors.go # 错误处理
├── Rsp.go # 通用响应结构
└── rspModel.go # 响应模型定义
└── server # 服务器端逻辑
└── user # 用户功能实现
├── conf # 配置文件
│ ├── conf.go # 配置读取逻辑
│ └── db.yaml # 数据库配置文件
├── dao # 数据访问对象
│ ├── init.go # 初始化数据库
│ └── user.go # 用户相关的数据库操作
└── proto # proto文件定义
├── user.pb.go # 编译后的用户proto文件
├── user.proto # 用户定义的proto文件
└── user_grpc.pb.go # gRPC编译后的用户proto文件
└── main.go # 服务器的主入口/同时实现了相应的业务逻辑函数
结构如上,首先我们需要知道,在app层,我们实现了基本的路由逻辑,随后client相当于我们的客户端,我们通过client的grpc客户端和server进行通信,并且拿到server上面实现的业务逻辑函数,从而调用相关的函数,从而实现完整用户的注册/登陆功能。
了解完这个demo的基本结构以后,下面我来细说。
proto部分
syntax = "proto3";package user;option go_package = "2025/01January/20250121/micro/proto;user";message RegisterRequest {string username = 1;string password = 2;
}message LoginRequest {string username = 1;string password = 2;
}message RegisterResponse {bool success = 1;string message = 2;
}message LoginResponse {bool success = 1;string message = 2;string token = 3;
}service User {rpc Login(LoginRequest) returns(LoginResponse);rpc Register(RegisterRequest) returns(RegisterResponse);
}
首先我来解释解释这上面都是什么意思,LoginRequest 以及RegisterRequest都相当于一个请求的结构体,上面带有请求的信息,我们可以看到信息就是用户名和密码,随后就是我们的回复信息Response,上面带有请求的结果以及信息,接下来只需要在控制台输入相应的指令就好了
protoc --go_out=. --go-grpc_out=. user.proto
随后就会产生相应的go文件,这里产生的文件我们并不需要理会它,这些文件实现了通信的内部逻辑,而且我们由于我们只需要按照规则简单的定义.proto文件就可以了,所以遵循这个规则的我们就可以轻易的实现通信,并且不需要关心内部的通信逻辑。
gRPC部分
随后我们需要做的是什么呢?在接下来我们需要将这个文件复制到server端一份,以保证两端可以相互通信,然后我们需要将我们定义在.proto文件中的函数方法进行重写,比如:
type UserServer struct {pb.UnimplementedUserServer
}func (U *UserServer) Register(_ context.Context, req *pb.RegisterRequest) (*pb.RegisterResponse, error) {user := model.User{Name: req.Username,Password: req.Password,}if len(user.Password) < 5 || len(user.Password) > 20 {return &pb.RegisterResponse{Success: false,Message: "PasswordLength",}, response.ErrPasswordLength}if len(user.Name) < 5 || len(user.Name) > 20 {return &pb.RegisterResponse{Success: false,Message: "NameLength",}, response.ErrNameLength}if err := dao.Register(user); err != nil {return &pb.RegisterResponse{Success: false,Message: err.Error(),}, err}return &pb.RegisterResponse{Success: true,Message: "ok",}, nil
}
这部分实现了相应的服务端的逻辑,就相当于我们在单层架构中的service层的作用,在该方法中,我们调用了dao层的函数,以便于实现完整的注册逻辑。
既然重写了相应的方法函数,这并不是完事大吉了,我们还需要在真正运行代码的时候让两端进行通信,此时就需要我们创建相应的grpc客户端和服务端。
// 设置监听地址和端口listener, err := net.Listen("tcp", ":10001")if err != nil {log.Fatalf("Failed to listen: %v", err)}grpcServer := grpc.NewServer(grpc.Creds(insecure.NewCredentials()))// 注册服务pb.RegisterUserServer(grpcServer, &UserServer{})
考虑到此处我们的重点是gRPC通信和nacos服务注册,我们就采取了不安全的通信方式。
此处我们设置了监听的端口,UserServer是实现了相对应的接口的结构体,使用 pb.RegisterUserServer
函数将 UserServer
实例注册到 gRPC 服务器。这使得通过 gRPC 客户端调用该服务时,可以调用您在 UserServer
中实现的方法。
此处还不着急使用nacos注册服务,我们先来看看客户端如何通信。
// 连接到 gRPC 服务UserConn, err = grpc.Dial(addr, grpc.WithInsecure())if err != nil {log.Fatalf("failed to connect to gRPC service: %v", err)return}UserClient = pb.NewUserClient(UserConn)
此处的addr是我们对应的server的地址+端口号,也是采取了不安全的通信,然后这个UserClient可以这样理解,他作为一个对象,在通信之后,能够作为UserServer对象来调用服务端实现的方法,就是如此,所以我们要在app层创建一个UserClient实例来完成我们的调用。
nacos部分
nacos是什么?他是一个服务注册中心,服务在启动时将自身注册到 Nacos,包含 IP、端口和服务名称,其他服务可以通过服务名称查询可用实例,于是我们在服务端将当前启动服务的ip端口以及服务名称等注册到了nacos,在客户端,我们就可以通过服务的名称等信息查找相应服务对应的信息,这样我们就不需要以硬编码的形式将服务对应的IP端口写在客户端,而且当我们在服务端改变IP和端口时,也是将最新的IP端口注册到nacos中,这样就不需要担心修改客户端的问题了,因为客户端的IP和端口是以变量的形式保存的,保证了灵活性,而当有多个相同服务注册时,客户端可以从多个可用实例中选择,提高系统的整体性能与可靠性。
下面让我们来看看是如何实现的。
首先是在服务端:
nacos.RegisterServiceInstance(nacos.Client, vo.RegisterInstanceParam{Ip: "127.0.0.1", // 根据实际情况填写Port: 10001, // gRPC服务的端口ServiceName: "UserTest", // 服务名称GroupName: "GroupTest", // 分组名称ClusterName: "cluster-a", // 集群名称Weight: 10, // 权重Enable: true, // 是否启用Healthy: true, // 是否健康Ephemeral: true, // 是否为临时实例Metadata: map[string]string{"idc": "shanghai"}, // 元数据信息})
在启动服务端时,我们通过函数调用,将服务的地址等信息注册到nacos的相应位置,关于nacos服务的增删查改可以看看我之前发的博客。
这样就算注册完成了,启动完服务端,我们返回来看客户端:
param := vo.GetServiceParam{ServiceName: "UserTest", // 替换为你的服务名称GroupName: "GroupTest", // 根据需要设置Clusters: []string{"cluster-a"}, // 集群名称}service, err := nacos.Client.GetService(param)if err != nil {log.Fatalf("can't discover the service: %v", err)return}// 获取第一个服务实例的地址if len(service.Hosts) == 0 {log.Fatal("no healthy instance found for service 'user'")return}addr := fmt.Sprintf("%s:%d", service.Hosts[0].Ip, service.Hosts[0].Port)
此处我们只需要将搜索信息放入param中,然后根据我们的信息查找这个服务是否注册到了nacos中,如果没注册,就说明服务端还没启动,就停止调用,如果发现了这个服务,我们便可以获取这个服务的地址,然后根据地址,连接gRPC服务,这样就算完成了!
最后,启动服务端,将服务注册进nacos,同时开启grpc服务端,监听端口,然后启动客户端,发送post命令,看到令人满意的结果,就算结束了。
如果想要详细的代码,可以看我的github-Some-WORKs仓库
结语
以上便是我关于nacos和gRPC如何结合起来实现服务注册调用的想法,希望对你会有帮助,如果有问题,欢迎提出来!
相关文章:
【Golang/gRPC/Nacos】在golang中将gRPC和Nacos结合使用
Nacos与gRPC 前言 关于这部分,前段时间我在看文档以及视频教程的时候,怎么都想不明白,到底为什么要用gRPC是什么,他在项目中应该充当什么样的角色?Nacos又是如何和他结合的? 于是我就决定去看看一些小项…...
数据库-多表关系
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构。由于业务之间相互关联,所以各个表结构之间也存在着各种联系。 多表关系: 一对多(多对一) 一对一 多对多 多表关系 一对…...
回归算法、聚类算法、决策树、随机森林、神经网络
这也太全了!回归算法、聚类算法、决策树、随机森林、神经网络、贝叶斯算法、支持向量机等十大机器学习算法一口气学完!_哔哩哔哩_bilibili 【线性回归、代价函数、损失函数】动画讲解_哔哩哔哩_bilibili 14分钟详解所有机器学习算法:…...
RabbitMQ1-消息队列
目录 MQ的相关概念 什么是MQ 为什么要用MQ MQ的分类 MQ的选择 RabbitMQ RabbitMQ的概念 四大核心概念 RabbitMQ的核心部分 各个名词介绍 MQ的相关概念 什么是MQ MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出&am…...
第17章:Python TDD回顾与总结货币类开发
写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…...
7、数组知识点汇总
一、 数组基本概念 程序算法数据结构 算法:解决程序的流程步骤数据结构:将数据按照某种特定的结构来存储设计良好的数据结构会导致良好的算法。ArrayList、LinkedList 数组是最简单的数据结构。 1、数组: 数组:存放同一种类型…...
蓝桥杯c/c++需要掌握的基础语法总结
1、#include<bits/stdc.h> 万能头文件 2、using namespace std; 3、输出 cout<<""<<end1; (换行) printf(""); 4、int x3;整数 double d3.14;小数 char ch’A‘;字符 char s[]"Hell…...
学习第七十四行
qt调用信号与槽机制: MOC查找头文件中的signal与slots,标记出信号槽。将信号槽信息储存到类静态变量staticMetaObject中,并按照声明的顺序进行存放,建立索引。connect链接,将信号槽的索引信息放到一个双向链表中&…...
《罗宾逊-旅途VR》Build2108907官方学习版
《罗宾逊-旅途VR》官方版 https://pan.xunlei.com/s/VODiY5gn_fNxKREdVRdwVboCA1?pwdsh3f# 从第一人称的角度进行探索,玩家将遇到一系列恐龙和生物,这些恐龙和生物会对它们在泰森三世生态系统中的存在做出反应。强调与周围环境的互动,鼓励玩…...
详解共享WiFi小程序怎么弄!
在数字化时代,共享WiFi项目正逐渐成为公共场所的新标配,它不仅为用户提供了便捷的上网方式,还为商家带来了额外的收入来源。那么共享wifi怎么弄,如何搭建并运营一个成功的共享WiFi项目呢? 共享WiFi项目通过在公共场所…...
Glide加载gif遇到的几个坑
Glide本身支持gif格式的动画加载,但是大多数情况下我们用Glide都是去加载一些静态图片,加载gif动态图的需求不是很多,因此这次使用Glide加载gif就遇到了一些令人匪夷所思的问题 问题一:加载gif图片会有明显的卡顿 通常情况下我们…...
mybatis(19/134)
大致了解了一下工具类,自己手敲了一边,java的封装还是真的省去了很多麻烦,封装成一个工具类就可以不用写很多重复的步骤,一个工厂对应一个数据库一个environment就好了。 mybatis中调用sql中的delete占位符里面需要有字符…...
部分“古董机”编程读取文件时出现文件损坏的简易处理办法(简单粗暴) - 随笔
在部分老旧计算机(通常被戏称为“古董机”)上编程,读取文件时可能会遇到文件损坏的问题。这通常是由于硬件性能限制或操作系统的文件处理机制导致的。本文将介绍几种简易的处理办法,以解决或绕过这一问题。 方法1. 调整磁盘关闭时…...
StarRocks 3.4 发布--AI 场景新支点,Lakehouse 能力再升级
自 StarRocks 3.0 起,社区明确了以 Lakehouse 为核心的发展方向。Lakehouse 的价值在于融合数据湖与数据仓库的优势,能有效应对大数据量增长带来的存储成本压力,做到 single source of truth 的同时继续拥有极速的查询性能,同时也…...
强化学习入门--基本概念
强化学习基本概念 grid-world example 这个指的是一个小机器人(agent)在一个网格区域(存在边界),网格中存在需要躲避的格子和目标格子,我们的目的就是找到到达目标格子的最短路径 state 表示智能体相对…...
Oracle 创建并使用外部表
目录 一. 什么是外部表二. 创建外部表所在的文件夹对象三. 授予访问外部表文件夹的权限3.1 DBA用户授予普通用户访问外部表文件夹的权限3.2 授予Win10上的Oracle用户访问桌面文件夹的权限 四. 普通用户创建外部表五. 查询六. 删除 一. 什么是外部表 在 Oracle 数据库中&#x…...
深度学习python基础(第三节) 函数、列表
本节主要介绍函数、列表的基本语法格式。 函数 与c语言的函数差不多,就是语法基本格式不同。 name "loveyou" length len(name) print("字符串的长度为:%d" % length) # 自定义函数 def countstr(data):count 0for i in da…...
基于Python的多元医疗知识图谱构建与应用研究(上)
一、引言 1.1 研究背景与意义 在当今数智化时代,医疗数据呈爆发式增长,如何高效管理和利用这些数据,成为提升医疗服务质量的关键。传统医疗数据管理方式存在数据孤岛、信息整合困难等问题,难以满足现代医疗对精准诊断和个性化治疗的需求。知识图谱作为一种知识表示和管理…...
Spring Boot 快速创建项目
目录 一. 创建项目 编辑 二. 项目目录 三. 运行项目 (1) 启动项目 (2) 输出HelloWorld 一. 创建项目 我们以idea专业版为例创建Spring项目: 步骤: (1) File --> New --> Project (2) 配置项目基本信息 (3) 依赖: 需要什么就勾选什么. 我们这里就只勾选一个Spri…...
MySQL预编译语句过多告警排查
业务背景 在使用Spring Cloud Alibaba搭建的微服务架构中,项目采用ShardingSphere进行分库分表,MyBatis-Plus作为持久层。线上环境突发大量预编译语句过多的数据库告警,导致系统性能下降。 排查过程 1. 初步排查:联系云数据库厂…...
在centos上编译安装opensips【初级-默认安装】
环境:centos9 last opensips3.2 dnf update -y dnf install -y gcc make git automake libtool pcre-devel libxml2-devel \libcurl-devel postgresql-devel \bzip2-devel zlib-devel ncurses-devel libuuid-devel \libpcap-devel # 有报错的直接删除cd /usr/lo…...
偏序关系.
一、偏序(半序)关系 偏序关系 自反反对称传递性 二、全序(线序、链)关系 三、偏序集中的重要元素 1. 极大元与极小元 极大元找所在集合的一个或几个最高点; 极小元找所在集合的一个或几个最低点。 2. 最大元与最小…...
Node.js接收文件分片数据并进行合并处理
前言:上一篇文章讲了如何进行文件的分片:Vue3使用多线程处理文件分片任务,那么本篇文章主要看一下后端怎么接收前端上传来的分片并进行合并处理。 目录: 一、文件结构二、主要依赖1. express2. multer3. fs (文件系统模块)4. pat…...
设计模式概述 - 设计模式的重要性
引言 设计模式是软件工程中用于解决常见设计问题的经典解决方案。它们提供了一种标准化的方式来组织和设计代码,使得代码更易于理解、维护和扩展。在C编程中,设计模式尤为重要,因为它们可以帮助开发者应对复杂的系统设计,提高代码…...
OSI5GWIFI自组网协议层次对比
目录 5G网络5G与其他协议栈各层映射 5G网络 物理层 (PHY) 是 5G 基站协议架构的最底层,负责将数字数据转换为适合无线传输的信号,并将接收到的无线信号转换为数字数据。实现数据的编码、调制、多天线处理、资源映射等操作。涉及使用新的频段(…...
网络安全(渗透)
目录 名词解释 2、相互关系 3. 安全影响 名词解释 1、poc、exp、payload与shellcode POC(Proof of Concept): 是一种概念验证代码或演示程序,用于证明漏洞的存在。 主要目的是通过简单的代码或操作向安全研究人员、开发人员…...
Whisper-GPT:混合表征音频大语言模型
Whisper-GPT:混合表征音频大语言模型 当下,利用从神经压缩算法(例如#Encodec#)派生的离散音频标记的生成式音频、语音以及音乐模型数量激增。然而,这种方法的主要缺陷之一在于对上下文长度的处理。如果必须考虑所有不同频率的音频内容才能进行下一个标记预测,那么高保…...
科技重塑未来:前沿技术趋势、跨领域融合与社会影响深度洞察
目录 科技重塑未来:前沿技术趋势、跨领域融合与社会影响深度洞察引言一、前沿技术趋势洞察与分析1. 人工智能与自动化1.1 趋势分析1.2 挑战分析 2. 区块链技术2.1 趋势分析2.2 挑战分析 3. 量子计算3.1 趋势分析3.2 挑战分析 二、跨领域技术融合与创新实践1. AI与大…...
深度学习:大模型Decoding+MindSpore NLP分布式推理详解
大模型推理流程 1. 用户输入提示词(Prompt) 假设用户输入为:“从前,有一只小猫,它喜欢……” 我们的目标是让模型生成一段完整的故事。 2. 模型处理用户输入 2.1 分词:输入提示被分词为模型可以理解的…...
GESP6级语法知识(二):动态规划算法(二)
最小路径和; //最小路径和 #include<iostream> using namespace std; const int N100; int dp[N][N],value[N][N]; int n,m; int main() {cin>>n>>m;for(int i1;i<n;i) //录入初始数字矩阵 for(int j1;j<m;j)cin>>value[i][j];for(int i1;i…...
数据结构与算法之递归: LeetCode 79. 单词搜索 (Ts 版)
单词搜索 https://leetcode.cn/problems/word-search/description/ 描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 单词必须按照字母顺序,通过相邻的单…...
智能系统的感知和决策
智能系统在感知和决策过程中具备的关键能力表现在智能感知/自主判定上,下面可以从感知的本质、自主判断的含义及其在智能系统中的作用进行深入分析。 1、智能感知:信息获取与理解 智能感知是指智能系统通过传感器或其他数据采集手段获取环境中的信息&…...
多线程之旅:线程安全问题
之前说到了多线程的创建和一些属性等等,接下来,就来讲讲多线程安全问题。 小编引入这段代码讲解下: public class Demo13 {public static int count0;public static void main(String[] args) throws InterruptedException {Thread t1new…...
用java配合redis 在springboot上实现令牌桶算法
令牌桶算法配合 Redis 在 Java 中的应用令牌桶算法是一种常用的限流算法,适用于控制请求的频率,防止系统过载。结合 Redis 使用可以实现高效的分布式限流。 一.、引入依赖首先,需要在 pom.xml 文件中引入 spring-boot-starter-data-re…...
科学计算库NumPy
NumPy是高性能科学计算和数据分析的基础包。 认识NumPy数据对象 n维数组对象ndarray(array) 数组是编程语言中重要且复杂的数据结构,它是由相同类型元素按照一定的顺序排列的集合。ndarray具有矢量算术能力和复杂的广播能力。 - 维度又称为维数,在数学…...
【大数据】机器学习----------强化学习机器学习阶段尾声
一、强化学习的基本概念 注: 圈图与折线图引用知乎博主斜杠青年 1. 任务与奖赏 任务:强化学习的目标是让智能体(agent)在一个环境(environment)中采取一系列行动(actions)以完成一个…...
Unicode不可见字符
场景复现 在访问 https://dotnet.microsoft.com/zh-cn/apps/aspnet地址时 突然出现 https://dotnet.microsoft.com/zh-cn/apps/aspnet%E2%80%8C%E2%80%8C 但是正常来看,这个地址后面是没有%E2%80%8C%E2%80%8C的,粘贴到idea里发现了url地址后面还拼接了2…...
w172二手车交易系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
TRELLIS微软的图生3D
TRELLIS 教程目录: Youtube:https://www.youtube.com/watch?vJqFHZ-dRMhI 官网地址:https://trellis3d.github.io/ GitHub:https://github.com/Microsoft/TRELLIS 部署目录: 克隆项目 git clone --recurse-submodul…...
【力扣:新动计划,编程入门 —— 题解 ①】
向前看,总会有新的故事值得期盼 —— 25.1.21 2235. 两整数相加 给你两个整数 num1 和 num2,返回这两个整数的和。 示例 1: 输入:num1 12, num2 5 输出:17 解释:num1 是 12,num2 是 5 &#x…...
如何使用 Pytest -k 选项轻松筛选测试用例
关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理,构建成功的基石 在自动化测试工作之前,你应该知道的10条建议 在自动化测试中,重要的不是工具 你是否曾不得不从成百上千个测试中费力筛选,只为运行几个特定的测试&am…...
C语言之小型成绩管理系统
🌟 嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 C语言之小型成绩管理系统 目录 设计题目设计目的设计任务描述设计要求输入和输出要求验收要…...
C++ ——— 模拟实现 vector 类
目录 vector 类的框架 无参数的构造函数 析构函数 获取有效数据个数 获取容量 重载 [] 运算符 可读可写版本 只可读版本 扩容 尾插 实现迭代器 可读可写版本 只可读版本 自定义设置size长度和内容 在任意位置插入 删除任意位置的数据 赋值重载 vector 类的框…...
SpringBoot实现轻量级动态定时任务管控及组件化
1关于动态定时任务 关于在SpringBoot中使用定时任务,大部分都是直接使用SpringBoot的Scheduled注解,如下: Component public class TestTask {Scheduled(cron"0/5 * * * * ? ") //每5秒执行一次public void execute(){SimpleDa…...
STM32 FreeRTOS 任务挂起和恢复---实验
实验目标 学会vTaskSuspend( )、vTaskResume( ) 任务挂起与恢复相关API函数使用: start_task:用来创建其他的三个任务。 task1:实现LED1每500ms闪烁一次。 task2:实现LED2每500ms闪烁一次。 task3:判断按键按下逻辑,KE…...
#漏洞挖掘# 一文了解什么是Jenkins未授权访问!!!
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
1.21学习记录
misc 2023isctf 你说爱我尊嘟假嘟 这题有点脑洞,需要把你说爱我换成Ook.将尊嘟换为Ook!假嘟换成Ook?(根据语气进行猜测吧)用在线工具解密最后用base64解密即可 2023isctf 杰伦可是流量明星 解压后是一个MP3文件&am…...
【Pandas】pandas Series groupby
Pandas2.2 Series Function application, GroupBy & window 方法描述Series.apply()用于将一个函数应用到 Series 的每个元素或整个 SeriesSeries.agg()用于对 Series 数据进行聚合操作Series.aggregate()用于对 Series 数据进行聚合操作Series.transform()用于对 Series…...
Text2SQL 智能报表方案介绍
0 背景 Text2SQL智能报表方案旨在通过自然语言处理(NLP)技术,使用户能够以自然语言的形式提出问题,并自动生成相应的SQL查询,从而获取所需的数据报表,用户可根据得到结果展示分析从而为结论提供支撑&#…...
51c~SLAM~合集1
我自己的原文哦~ https://blog.51cto.com/whaosoft/12327374 #GSLAM 自动驾驶相关~~~ 一个通用的SLAM架构和基准 GSLAM:A General SLAM Framework and Benchmark 开源代码:https://github.com/zdzhaoyong/GSLAM SLAM技术最近取得了许多成功&am…...