【grpc】二、grpc入门,基本使用方法

news2024/11/26 20:18:51

上篇介绍了使用protobuf生成grpc相关代码,并实现了服务端方法,本篇介绍下具体的使用。

一、服务端

// server.go

package main

import (
	"google.golang.org/grpc"
	"grpcDemo/calc"
	"net"
)

func startServer(addr string) {
	// 监听端口
	ls, err := net.Listen("tcp", addr)
	if err != nil {
		panic(err)
	}
	defer ls.Close()
	
	// 创建grpc服务
	gServer := grpc.NewServer()
	
	// 注册rpc
	calc.RegisterCalcServer(gServer, &calc.Server{})
	if err = gServer.Serve(ls); err != nil {
		panic(err)
	}
}

服务端开启方法主要包含三个步骤:

  1. 开启监听端口;
  2. 调用grpc.NewServer创建grpc服务;
  3. 调用生成的包注册rpc服务。

二、客户端

// client.go
package main

import (
	"context"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	"grpcDemo/calc"
)

func clientTest(addr string) {
	// 创建rpc连接
	cc, err := grpc.NewClient(addr,
		grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		panic(err)
	}
	defer cc.Close()
	
	// 创建rpc调用客户端
	cli := calc.NewCalcClient(cc)
	
	// 调用具体的rpc方法
	versionRsp, err := cli.Version(context.Background(), &calc.Empty{})
	if err != nil {
		panic(err)
	}
	fmt.Println("server version:", versionRsp.GetStr())

	sumRsp, err := cli.Sum(context.Background(), &calc.CalcRequest{
		A: 1,
		B: 2,
	})
	fmt.Println("1+2=", sumRsp.GetNum())
}

客户端使用方法也分为三个步骤:

  1. 调用grpc.NewClient创建grpc连接(这里有一点需要注意,grpc强制需要鉴权配置,否则会报错。但是目前没有做鉴权,传入的是grpc.WithTransportCredentials(insecure.NewCredentials()),后续会介绍生产环境中鉴权如何配置);
  2. 调用生成的包创建rpc客户端;
  3. 调用具体的rpc方法。

三、运行结果
目前代码结构如下
在这里插入图片描述

// main.go
package main

import (
	"time"
)

func main() {
	go startServer(":8080")
	// 确保服务开起来
	time.Sleep(time.Second)
	clientTest("localhost:8080")
}

这里有个需要注意的点,因为client.gomain.goserver.go 都是在 main 包下面的,在运行配置那里需要把这三个文件都加上去,如下所示:
在这里插入图片描述

最终运行效果如下:
在这里插入图片描述

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

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

相关文章

【C语言】函数相关选择题

前言 关于函数相关的选择题。 题目一: C语言规定,在一个源程序中,main函数的位置( ) A .必须在最开始 B .必须在库函数的后面 C .可以任意 D .必须在最后 题解:选择C。 main函数为C语言中整个工程的程序入…

快速理解vim编辑器和软硬连接

刚开始学习linux基础命令时最难搞懂的应该就是vi和ln命令了😭,写这篇文章主要想和大家分享一下我对这两个命令的理解,希望能更快的帮助到那些还没搞懂的同学😜 首先我们要知道vim编辑器主要分为三个工作模式,分别是图上…

python中的split()用法

在Python中,split() 是一个字符串方法,用于将字符串按照指定的分隔符分割成一个列表。如果没有提供分隔符,那么它会默认按照任何空白字符(如空格、换行符、制表符等)进行分割。 这里是 split() 方法的一些基本用法&am…

K8s学习九(配置与存储_存储)

存储管理 Volumes HostPath 将节点上的文件或目录挂载到 Pod 上,此时该目录会变成持久化存储目录,即使 Pod 被删除后重启,也可以重新加载到该目录,该目录下的文件不会丢失 效果就是容器里的数据和主机里的数据进行共享 配置文…

Hadoop安装部署-SecondaryNameNode备份版

Hadoop分布式文件系统支持NameNode节点的高可用性,本文主要描述Secondary NameNode数据备份版本的安装部署。 如上所示,NameNode主节点同步数据到NameNode备份节点,当NameNode主节点发生故障变得不可用时, NameNode主节点重新启动…

【多线程】多线程下使用集合类

一.Java中线程安全的集合类 Java中提供了多种线程安全的集合类,它们可以在多线程环境下安全地被多个线程同时访问而无需外部同步。以下是一些常见的线程安全集合类: Vector: 类似于 ArrayList 的动态数组,但是所有方法都是同步的&#xff0…

ThinkPhp8 框架使用 mysql find_in_set 函数

前言: 使用mysql 存储一些标签时 会使用逗号拼接的存储方法 比如 1,2,3,11 一般情况下 查询 1 可能会用到 like %1% 但这样查询的不够准确 因为11也会被查询到 如果每次都多一个逗号 1,2,3,11, 查询时 like %1,% 这样存储有点不太符合程序设计 解决方案 ----------- 官网…

Linux 5.10 Pstore 功能测试

目录 简介环境配置内核配置参考备注 简介 Pstore(Persistent store support)是用于系统发生oops或panic时,自动保存内核log buffer中的日志。随着功能不断完善,Duo S使用Linux 5.10已经支持保存console日志、ftrace消息和用户空间日志的收集&#xff0c…

【Shell语言学堂】Shell 脚本练习1

Shell 脚本练习 shell语言实战 Shell 脚本练习💧CSDN划过手的泪滴t现有一个脚本可传入n个参数,要求在脚本中实现在终端输出第n个参数之前的所有参数(不包含第n个参数)编写一个计算bmi体质指数的脚本,该脚本需要用户输入身高和体重信息&#x…

登录信息失效后多次请求提示合并成一次

在通常的业务场景中经常会出现进入页面之后一次性发送好多个请求,如果登录信息失效,那就会出现很多提示 类似这种多个提示的,看起来不美观,希望改成可以把在短时间内出现相同的错误信息,只提示一次,其他的就不提示了 实现思路 通常业务中每一个请求的code都是有具体的意思,可以…

虚拟机VMware启动虚拟机刚启动有网之后没网

虚拟机VMware启动虚拟机刚启动有网之后没网 害,感觉这种调试的事情是真的浪费时间 如题,对于这种情况,一句话,就是你本地的DHCP虚拟机服务以及NAT网络服务没启动 本机windowR,输入services.msc 进入服务 然后 喏,…

【MATLAB源码-第182期】基于matlab的QPSK调制解调系统频偏估计及补偿算法仿真,对比补偿前后的星座图误码率。

操作环境: MATLAB 2022a 1、算法描述 在通信系统中,频率偏移是一种常见的问题,它会导致接收到的信号频率与发送信号的频率不完全匹配,进而影响通信质量。在调制技术中,QPSK(Quadrature Phase Shift Keyi…

LowCodeEngine基础教程

一、技术介绍 1、应用场景 LowCodeEngine支持一下四种通用场景:中后台页面、移动端页面、流程、可视化报表。 2、低代码的特点 3、低代码在阿里巴巴实践 4、开发痛点 中后台页面中,对于页面的视觉冲击、视觉炫酷要求并不是很敏感,更多的是…

【Linux进阶之路】ARP欺骗实验

正文 话不多说,直接干! 首先我们需要准备一下环境,先配置VMARE,然后下载KALI的虚拟机。 详细的安装教程视频:点击跳转,下载KALI可能要半个小时,中间可以看个剧玩个游戏缓一缓。 配置好之后&am…

K8s学习八(配置与存储_配置)

配置与存储 配置管理 ConfigMap ConfigMap的创建 一般用于去存储 Pod 中应用所需的一些配置信息,或者环境变量,将配置于 Pod 分开,避免应为修改配置导致还需要重新构建 镜像与容器。configmap缩写为cmkubectl create cm -h来查看创建命令…

java+mysql图书管理系统制作教程v1.0.0完整版

本人QQ:2711138299,需要源码的可以加我,附带数据库备份文件,以及建立数据库表 下面是我写在有道云笔记里面的教程,由于复制粘贴后,代码都混乱在一起了,不建议大家观看,所以想看详细教程的也可以…

拥有自己的云环境-域名及备案

序 唠叨两句 之前的文章,讲了如何购买一台云服务器,然后购买之后,如何操作云服务器。当买完云服务器之后,我们就可以使用云服务器提供的公网ip,访问到我们的服务器上。但是,这样怎么能体现我们一个老程序…

Hybrid混合开发 和 Android平台JSBridge的原理

书接上篇:移动端研发技术的进化历程 纯原生开发主要面临动态化和开发成本两个问题,而针对这两个问题,诞生了一些跨平台的动态化框架。 针对原生开发面临的问题,业界一直都在努力寻找好的解决方案,而时至今日&#xf…

【深度学习】图像风格混合——StyleGAN原理解析

1、前言 上一篇,我们讲了PGGAN的模型原理,本章我们就来讲解一下StyleGAN,这个模型能够自由控制图像的风格,细节变化等等,生成用户想要的图像,甚至从某种程度上说,其可以实现AI换脸。 PS&#…

[StartingPoint][Tier1]Pennyworth

Important Jenkins是一个用于自动化构建、测试和部署软件项目的开源持续集成和持续部署(CI/CD)工具。它允许开发团队自动执行和监控在软件开发过程中的重复性任务,例如构建代码、运行测试、部署应用程序等。Jenkins提供了一个易于使用的Web界…