Grpc

实现流程图

资料

使用方法

make run

新建一个proto文件

syntax = "proto3";

package chat;

service ChatService {
//发送消息
rpc Send(SendRequest) returns (SendReply){};
}
//发送消息 请求结构体
message SendRequest {
string content = 1;//发送内容
}
//发送消息 响应结构体
message SendReply {
string msg = 1;//返回消息
}

GRPC服务端

package main

import (
"context"
"github.com/yezihack/grpc/simple/server/proto"
"google.golang.org/grpc"
"log"
"net"
"os"
) var (
port = ":8008"
) func main() {
log.SetOutput(os.Stdout)
//新建一个tcp监听
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalln(err)
}
//起一个服务
s := grpc.NewServer()
// 注册反射服务 这个服务是CLI使用的 跟服务本身没有关系
chat.RegisterChatServiceServer(s, &Chats{})
log.Printf("server port %s start...\n", port)
//启动服务
if err = s.Serve(lis); err != nil {
log.Fatalln(err)
}
} //新建一个结构体,实现proto里定义的方法
type Chats struct {
} //实现proto方法
func (c *Chats) Send(ctx context.Context, in *chat.SendRequest) (*chat.SendReply, error) {
out := chat.SendReply{
Msg: "hello " + in.Content,
}
return &out, nil
}

客户端代码

package main

import (
"context"
"github.com/yezihack/grpc/simple/server/proto"
"google.golang.org/grpc"
"log"
"os"
) var (
addrees = "localhost:8008"
) func main() {
log.SetOutput(os.Stdout)
conn, err := grpc.Dial(addrees, grpc.WithInsecure())
if err != nil {
log.Fatalln(err)
}
client := chat.NewChatServiceClient(conn)
req := chat.SendRequest{
Content: "world 2019",
}
reply, err := client.Send(context.Background(), &req)
if err != nil {
log.Fatalln(err)
}
log.Println(reply.Msg) }

代码归档: https://github.com/yezihack/grpc

学习GRPC(一) 简单实现的更多相关文章

  1. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  2. Hibernate二次学习一----------Hibernate简单搭建

    因为博客园自带的markdown不太好用,因此所有markdown笔记都使用cmd_markdown发布 Hibernate二次学习一----------Hibernate简单搭建: https:// ...

  3. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  4. oracle学习 第一章 简单的查询语句 ——03

    1.1最简单的查询语句 例 1-1 SQL> select * from emp; 例 1-1 结果 这里的 * 号表示全部的列.它与在select 之后列出全部的列名是一样的.查询语句以分号( ...

  5. gRPC的简单使用

    目录 前言 gRPC的简单介绍 基本用法 服务的定义 服务端代码编写 客户端代码编写 运行效果 服务治理(注册与发现) .NET Core 2.x 和 .NET Core 3.0的细微区别 扩展阅读 ...

  6. Spark学习笔记0——简单了解和技术架构

    目录 Spark学习笔记0--简单了解和技术架构 什么是Spark 技术架构和软件栈 Spark Core Spark SQL Spark Streaming MLlib GraphX 集群管理器 受 ...

  7. Html学习笔记(二) 简单标签

    标签的重点 标签的用途 标签在浏览器中的默认样式 <body>标签: 在网页上显示的内容 <p>标签: 添加段落 <hx>标签: 添加标题 标签一共有6个,h1.h ...

  8. Openfire/XMPP学习之——一个简单的Smack样例

    昨天讲了Openfire的搭建和配置,今天来讲一下Smack.如果对如何搭建和配置Openfire的,可以参考Openfire/XMPP学习之——Openfire的安装.配置. Smack是一个开源, ...

  9. GitHub学习心得之 简单操作

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 前言 本文对Github的基本操作进行了总结, 主要基于以下文章: http://gitre ...

随机推荐

  1. mysql进阶三四五六

    排序查询 一.语法 select 查询表 from 表 where 筛选条件 order by 排序列表[asc / desc] 特点: 1.asc:升序 desc:降序 2.排序列表之中支持单字段, ...

  2. CSS中behavior属性语法简介

    本文和大家重点讨论一下CSS中behavior属性语法的使用,在进行CSS网页布局的时候,我们经遇到刷新要保留表单里内容的时候,习惯的做法使用cookie,但是那样做实在是很麻烦,CSS中的behav ...

  3. Android事件分发机制浅析(3)

    本文来自网易云社区 作者:孙有军 我们只看最重要的部分 1: 事件为ACTION_DOWN时,执行了cancelAndClearTouchTargets函数,该函数主要清除上一次点击传递的路径,之后执 ...

  4. 实时视频h5

    http://www.cnblogs.com/dotfun/p/4286878.html

  5. Hadoop数据管理介绍及原理分析

    Hadoop数据管理介绍及原理分析 最近2014大数据会议正如火如荼的进行着,Hadoop之父Doug Cutting也被邀参加,我有幸听了他的演讲并获得亲笔签名书一本,发现他竟然是左手写字,当然这个 ...

  6. IOS开发学习笔记023-UIToolBar的使用

    这里使用代码实现 大概过程: 1.创建工具条 2.创建插入条 3.添加头像.标签.删除按钮 4.点击头像获取标签信息 做一个简单的联系人列表,可以添加删除联系人,现在还没有添加头像和文字,接下来慢慢添 ...

  7. 安恒杯月赛 babypass getshell不用英文字母和数字

    BABYBYPASS 先贴代码: ①限制字符长度35个 ②不能使用英文字母和数字和 _ $ 最后提示有个getFlag()函数,从这个函数入手. 我们的第一思路是直接eval执行getFlag函数,但 ...

  8. day02_04.算算多少人

    第四题 算算有多少人? 第二题的升级版,看看你能不能做出来 利用你的编程思想去看这道题目,记住不要放过题目的每一个小细节 题目:操场上100多人排队,3人一组多1人,4个一组多2人,5人一组多3人,共 ...

  9. vue-devtools安装

    https://www.cnblogs.com/yuqing6/p/7440549.html

  10. js获取触发事件的元素

    //获取事件 var e = window.event; //获取元素 obj = e.target || e.srcElement; console.log(e); checkRepeat(e.ta ...