1. 初识golang微服务-gRPC

单体架构

在这里插入图片描述


微服务架构

RPC架构(远程过程调用)

服务端实例代码:

go 复制代码
package main

import (
	"fmt"
	"net"
	"net/rpc"
	"time"
)

type Hello struct {
}

func (h Hello) SayHello(req string, res *string) error {
	*res = "你好," + req
	fmt.Println(*res)
	time.Sleep(10*time.Second)
	return nil
}

func main() {
	// 1. 注册RPC服务
	err := rpc.RegisterName("hello", new(Hello))
	if err!=nil{
		fmt.Println(err)
	}
	
	// 2. 监听端口
	listener, err := net.Listen("tcp", "127.0.0.1:8000")
	if err!=nil{
		fmt.Println(err)
	}

	// 3. 退出程序是关闭监听
	defer listener.Close()

	for{
		// 4. 建立连接
		conn, err := listener.Accept()
		if err!=nil{
			fmt.Println(err)
		}
		// 绑定服务
		go rpc.ServeConn(conn)
	}

}

客户端示例代码:

go 复制代码
package main

import (
	"fmt"
	"net/rpc"
)

func main() {
	// 1. 与RPC微服务建立连接
	conn, err := rpc.Dial("tcp", "127.0.0.1:8000")
	if err!=nil{
		fmt.Println(err)
	}
	
	// 2. 当程序退出时关闭连接
	defer conn.Close()

	// 3. 远程调用函数
	var res string
	err = conn.Call("hello.SayHello", "hahahha", &res)

	fmt.Println(res)
}

Protobuf

https://github.com/protocolbuffers/protobuf/releases/tag/v30.0

下载对应操作系统版本,然后解压缩,将bin文件夹的路径加入环境变量中

即为成功!

然后下载go对应的包

go get github.com/golang/protobuf/protoc-gen-go

使用样例

复制代码
syntax = "proto3";
option go_package="./";

message User{
    string name = 1;
    bool male = 2;
    repeated string hobby = 3;
}

// 执行:protoc --go_out=. *.proto
go 复制代码
package main

import (
	"fmt"
	"google.golang.org/protobuf/proto"
)

func main() {
	u := User{
		Name: "张三",
		Male: false,
	}
	data, _ := proto.Marshal(&u)
	fmt.Println(data)
	user := &User{}
	proto.Unmarshal(data, user)
	fmt.Println(user)
}

message嵌套

复制代码
message SearchResponse {
  message Result {
    string url = 1;
    string title = 2;
    repeated string snippets = 3;
  }
  repeated Result results = 1;
}

定义服务类型

复制代码
service SearchService {
  rpc Search (SearchRequest) returns (SearchResponse);
}
相关推荐
钮钴禄·爱因斯晨几秒前
C语言 | 函数核心机制深度解构:从底层架构到工程化实践
c语言·开发语言·数据结构
wkj0012 分钟前
php中array($this, ‘loadClass‘)表示啥意思?
android·开发语言·php
Stuomasi_xiaoxin3 分钟前
服务器重装后如何“复活”旧硬盘上的 Anaconda 环境?—— 一次完整的排错与恢复记录
开发语言·python·github
presenttttt1 小时前
用Python和OpenCV从零搭建一个完整的双目视觉系统(四)
开发语言·python·opencv·计算机视觉
每日出拳老爷子1 小时前
[C#] 使用TextBox换行失败的原因与解决方案:换用RichTextBox的实战经验
开发语言·c#
半桔1 小时前
【Linux手册】从接口到管理:Linux文件系统的核心操作指南
android·java·linux·开发语言·面试·系统架构
nightunderblackcat1 小时前
新手向:实现ATM模拟系统
java·开发语言·spring boot·spring cloud·tomcat·maven·intellij-idea
开开心心就好1 小时前
电脑息屏工具,一键黑屏超方便
开发语言·javascript·电脑·scala·erlang·perl
笑衬人心。1 小时前
Java 17 新特性笔记
java·开发语言·笔记
序属秋秋秋2 小时前
《C++初阶之内存管理》【内存分布 + operator new/delete + 定位new】
开发语言·c++·笔记·学习