热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GoGRPC入门(二)

前言最近较忙,其实准备一篇搞定的中途有事,只能隔了一天再写正文pb.go需要注意的是,在本个demo中,客户端与服务端都是,所以在客户端与服务端都公用一个模板文件(如果是不同的语言

前言

最近较忙,其实准备一篇搞定的
中途有事,只能隔了一天再写

正文

pb.go

需要注意的是,在本个 demo 中,客户端与服务端都是 Golang,所以在客户端与服务端都公用一个 pb.go 模板文件(如果是不同的语言生成的pb是对应语言),可以将 pb.go 文件放置在云上由双方引用,也可以生成两个副本放在两端项目中,本次就使用 COPY 两份的方式
由于 Golang 一个文件夹只有一个 package,而生成的 pb.go 文件 package 为创建 proto 的名字(示例为 spider), 所以我们在项目内单独建立文件夹 spider将文件放入其中即可正常使用

编写 server 端

编写 main.go 文件

package main

import (
    "context"
    "google.golang.org/grpc"
    "google.golang.org/grpc/reflection"
    "io/ioutil"
    "net"
    "net/http"
    "server/spider"
)

type server struct{}

const (
    // Address 监听地址
    Address string = "localhost:8080"
    // Method 通信方法
    Method string = "tcp"
)

// 接收client端的请求,函数名需保持一致
// ctx参数必传
// 参数二为自定义的参数,需从pb文件导入,因此pb文件必须可导入,文件放哪里随意
// 返回值同参数二,为pb文件的返回结构体指针
func (s *server) GetAddressResponse(ctx context.Context, a *spider.SendAddress) (*spider.GetResponse, error) {
    // 逻辑写在这里
    switch a.Method {
    case "get", "Get", "GET":
        // 演示微服务用,故只写get示例
        status, body, err := get(a.Address)
        if err != nil {
            return nil, err
        }
        res := spider.GetResponse{
            HttpCode: int32(status),
            Response: body,
        }
        return &res, nil
    }
    return nil, nil
}

func get(address string) (s int, r string, err error) {
    // get请求
    resp, err := http.Get(address)
    if err != nil {
        return
    }
    defer resp.Body.Close()
    s = resp.StatusCode
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        return
    }
    r = string(body)
    return
}

func main() {
    // 监听本地端口
    listener, err := net.Listen(Method, Address)
    if err != nil {
        return
    }
    s := grpc.NewServer()                       // 创建GRPC
    spider.RegisterGoSpiderServer(s, &server{}) // 在GRPC服务端注册服务

    reflection.Register(s) // 在GRPC服务器注册服务器反射服务
    // Serve方法接收监听的端口,每到一个连接创建一个ServerTransport和server的grroutine
    // 这个goroutine读取GRPC请求,调用已注册的处理程序进行响应
    err = s.Serve(listener)
    if err != nil {
        return
    }
}

编写 client 端

package main

import (
    "client/spider"
    "context"
    "google.golang.org/grpc"
)

import "fmt"

const (
    // Address server端地址
    Address string = "localhost:8080"
)

func main() {
    // 连接服务器
    conn, err := grpc.Dial(Address, grpc.WithInsecure())
    if err != nil {
        fmt.Println(err)
        return
    }
    defer conn.Close()

    // 连接GRPC
    c := spider.NewGoSpiderClient(conn)
    // 创建要发送的结构体
    req := spider.SendAddress{
        Address: "http://www.baidu.com",
        Method:  "get",
    }
    // 调用server的注册方法
    r, err := c.GetAddressResponse(context.Background(), &req)
    if err != nil {
        fmt.Println(err)
        return
    }
    // 打印返回值
    fmt.Println(r)
}

运行

需要先启动 server 端监听端口,再启动 client 端向端口发送请求
我们运行后可看到结果已经正常返回并打印
技术图片

Go GRPC 入门(二)


推荐阅读
  • spotify engineering culture part 1
    原文,因为原视频说的太快太长,又没有字幕,于是借助youtube,把原文听&打出来了。中文版日后有时间再翻译。oneofthebigsucceessfactorshereatSpo ... [详细]
  • FroggerTimeLimit:1000MSMemoryLimit:65536KTotalSubmissions:32257Accepted:10396DescriptionFr ... [详细]
  • 本文分析和介绍了GLo ... [详细]
  • delphi控件大全
    本文章已收录于:delphi控件查询:http:www.torry.nethttp:www.jrsoftware.orgTb97最有名的工具条(ToolBar) ... [详细]
  • mongodb复制集部署文档 ... [详细]
  • 【自制小工具】代码生成器
    【自制小工具】代码生成器陆陆续续接触过好几款代码生成工具,发现确实好用,但都会有那么点不完善的地方,所以索性就自己做一个吧。界面非常简单,反正是自己用的,简单点用起来也方便上图:左 ... [详细]
  • kepserver中文手册,kepserver使用教程,kepserver设置
    下面介绍一下KepServer模拟器的使用,以下示例使用服务器随附的Simulator驱动程序来演示创建、配置和运行项目的过程。Simulator驱动程序是基于内存的驱动程序,能为 ... [详细]
  • 开发网站你需要知晓的部分专用术语
      越来越多的企业和个人都在拥有属于自己的网站门户,首当其冲的就是你得知晓几个网站方面的专业术语,先是中就有好多的客户不明白这些,造成误会是正常的,那不如我们对它有个大致的了解,这样就不容易感觉 ... [详细]
  • 22.Container With Most Water(能装最多水的容器)
    thecontainercontainsthemos ... [详细]
  • 抓取百万知乎用户设计之实体设计
    一.实体的关系实体是根据返回的Json数据来设计的教育经历方面用户可以有很多教育经理,USER和education是一对多的关系,一个education对应一个education一 ... [详细]
  • iOS之富文本
    之前做项目时遇到一个问题:使用UITextView显示一段电影的简介,由于字数比较多,所以字体设置的很小,行间距和段间距也很小,一大段文字挤在一起看起来很别扭,想要把行间距调大,结 ... [详细]
  • Xib九宫格应用管理使用xib封装一个自定义view的步骤1新建一个继承UIView的自定义view,假设类名叫做(AppView)2新建一个AppView.xib文件来描述 ... [详细]
  • 论文阅读及复现 | Improved Semantic Representations From TreeStructured Long ShortTerm Memory Networks
    两种形式的LSTM变体Child-SumTree-LSTMsN-aryTree-LSTMshttps:paperswithcode.compaperimproved-semanti ... [详细]
  • 看这里,教你如何快速将pdf文件翻译成中文
    因为网上下载的PDF资料,往往掺杂着一些英文,所以中英文翻译是一件很平常的事,毕竟不是每个人的英文都那么好,轻轻松松的就能够看完一篇英文的文件,那么,我们就要寻找翻译工具来帮助我们 ... [详细]
  • 以SOA服务为导向的信息系统构建是通过有计划地构建信息系统时,一种简单而有柔性的方法,就是组件化与服务导向架构。过去的信息系统,是在使用者需要新功能时才开发的,也就是响应不同时 ... [详细]
author-avatar
虹彩戳穿_525
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有