《gPRC使用protobuf构建微服务》阅读笔记
首先我需要去了解一些概念,根据百度百科了解到:
l 微服务架构:微服务架构是一项在云中部署应用和服务的新技术。微服务可以在“自己的程序”中运行,并通过“轻量级设备与HTTP型API进行沟通”。
l gPRC:gRPC 是一款高性能、开源的 RPC 框架,产自 Google,基于 ProtoBuf 序列化协议进行开发,支持多种语言。
我们过去根据 MVC 划分目录结构,由Controller 层处理业务逻辑,Model 层作为对象实体类,对数据库进行 CURD操作,View 视图层处理数据渲染和页面交互。以及 MVP、MVVM 都是将整个项目的代码是集中在一个代码库中,进行业务处理。这种单一聚合代码的方式在前期实现业务的速度很快,但在后期会暴露很多问题:
1. 开发与维护困难:随着业务复杂度的增加,代码的耦合度往往会变高,多个模块相互耦合后不易横向扩展
2. 效率和可靠性低:过大的代码量将降低响应速度,应用潜在的安全问题也会累积
微服务将一个大且聚合的业务项目拆解为多个小且独立的业务模块,每一模块即服务,各服务间使用高效的协议(protobuf、JSON 等)相互调用即是 RPC。这种拆分代码库的方式有以下特点:
每个服务应作为小规模的、独立的业务模块在运行,类似 Unix 的 Do one thing and do it well
每个服务应在进行自动化测试和(分布式)部署时,不影响其他服务
每个服务内部进行细致的错误检查和处理,提高了健壮性
本质上,二者只是聚合与拆分代码的方式不同。
安装gRPC与protoc编译器:
go get -u google.golang.org/grpc
go get -u github.com/golang/protobuf/protoc-gen-go
定义微服务的user.protoc文件
syntax = "proto3"; // 指定语法格式,注意 proto3 不再支持 proto2 的 required 和 optional
package proto; // 指定生成的 user.pb.go 的包名,防止命名冲突
// service 定义开放调用的服务,即 UserInfoService 微服务
service UserInfoService {
// rpc 定义服务内的 GetUserInfo 远程调用
rpc GetUserInfo (UserRequest) returns (UserResponse) {
}
}
// message 对应生成代码的 struct
// 定义客户端请求的数据格式
message UserRequest {
// [修饰符] 类型 字段名 = 标识符;
string name = 1;
}
// 定义服务端响应的数据格式
message UserResponse {
int32 id = 1;
string name = 2;
int32 age = 3;
repeated string title = 4; // repeated 修饰符表示字段是可变数组,即 slice 类型
生成 user.pb.go
package proto
import (
context "golang.org/x/net/context"
grpc "google.golang.org/grpc"
)
// 请求结构
type UserRequest struct {
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
}
// 为字段自动生成的 Getter
func (m *UserRequest) GetName() string {
if m != nil {
return m.Name
}
return ""
}
// 响应结构
type UserResponse struct {
Id int32 `protobuf:"varint,1,opt,name=id" json:"id,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
Age int32 `protobuf:"varint,3,opt,name=age" json:"age,omitempty"`
Title []string `protobuf:"bytes,4,rep,name=title" json:"title,omitempty"`
}
// ...
// 客户端需实现的接口
type UserInfoServiceClient interface {
GetUserInfo(ctx context.Context, in *UserRequest, opts ...grpc.CallOption) (*UserResponse, error)
}
// 服务端需实现的接口
type UserInfoServiceServer interface {
GetUserInfo(context.Context, *UserRequest) (*UserResponse, error)
}
// 将微服务注册到 grpc
func RegisterUserInfoServiceServer(s *grpc.Server, srv UserInfoServiceServer) {
s.RegisterService(&_UserInfoService_serviceDesc, srv)
}
// 处理请求
func _UserInfoService_GetUserInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {...}
《gPRC使用protobuf构建微服务》阅读笔记的更多相关文章
- 阅读《RobHess的SIFT源码分析:综述》笔记
今天总算是机缘巧合的找到了照样一篇纲要性质的文章. 如是能早一些找到就好了.不过“在你认为为时已晚的时候,其实还为时未晚”倒是也能聊以自慰,不过不能经常这样迷惑自己,毕竟我需要开始跑了! 就照着这个大 ...
- RobHess的SIFT源码分析:imgfeatures.h和imgfeatures.c文件
SIFT源码分析系列文章的索引在这里:RobHess的SIFT源码分析:综述 imgfeatures.h中有SIFT特征点结构struct feature的定义,除此之外还有一些特征点的导入导出以及特 ...
- RobHess的SIFT源码分析:综述
最初的目的是想做全景图像拼接,一开始找了OpenCV中自带的全景拼接的样例,用的是Stitcher类,可以很方便的实现全景拼接,而且效果很好,但是不利于做深入研究. 使用OpenCV中自带的Stitc ...
- 阅读《RobHess的SIFT源码分析:综述》笔记2
今天开始磕代码部分. part1: 1. sift特征提取. img1_Feat = cvCloneImage(img1);//复制图1,深拷贝,用来画特征点 img2_Feat = cvCloneI ...
- element-ui button组件 radio组件源码分析整理笔记(一)
Button组件 button.vue <template> <button class="el-button" @click="handleClick ...
- element-ui 组件源码分析整理笔记目录
element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...
- element-ui Carousel 走马灯源码分析整理笔记(十一)
Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...
- STL源码分析读书笔记--第二章--空间配置器(allocator)
声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...
- element-ui MessageBox组件源码分析整理笔记(十二)
MessageBox组件源码,有添加部分注释 main.vue <template> <transition name="msgbox-fade"> < ...
- element-ui switch组件源码分析整理笔记(二)
源码如下: <template> <div class="el-switch" :class="{ 'is-disabled': switchDisab ...
随机推荐
- python 中 if __name__ == '__main__' 判断的作用
假设这样一个a.py文件 def fun1(): ........ def fun2(): ......... if __name__=='__main__': ......#执行的一些语句 当你执行 ...
- HDU1010 --- Tempter of the Bone(dfs+剪枝)
小明做了一个很久很久的梦,醒来后他竟发现自己和朋友在一个摇摇欲坠的大棋盘上,他们必须得想尽一切办法逃离这里.经过长时间的打探,小明发现,自己所在的棋盘格子上有个机关,上面写着“你只有一次机会,出发后t ...
- php设计模式之适配器模式实例代码
<?php header("Content-type:text/html;charset=utf-8"); // 适配器模式 /** * 查看天气接口 */ class Ti ...
- 读书笔记 (.NET企业级应用架构设计)
建议你自己和别人多沟通(学会沟通会使你在公司更好的发展,有意见就提,有问题就问,有困难就说)加油lxp 1.架构师是用来干嘛的: 架构师分析需求,分析系统要去做什么,架构怎么去做 2.架构师的职责是: ...
- thinkphp3.2 中 Memcache 的配置和使用(memcahe的使用场景)
Thinkphp的默认缓存方式是以File方式,在/Runtime/Temp 下生成了好多缓存文件. TIPS: TP3.2支持的缓存方式有:数据缓存类型,支持:File|Db|Apc|Memcach ...
- linux异常
常见报错语句 Command not found; - 找不到命令(敲入的命令有误或者该命令还没安装) No Such file or directory; - 找不到输入的文件或者目录
- elasticSearch 起步(CentOS7 success)
安装和启动 这里使用docker进行安装的 docker pull elasticsearch 然后使用 docker run -e ES_JAVA_OPTS="-Xms256m -Xmx2 ...
- Web API入参,响应规范
入参绑定 入参应该定义成实体,而不是多个参数,方便扩展.[FromBody]和[FromUrl]特性也最好加上. public ActionResult<Pet> Create([From ...
- String类中的equals方法总结(转载)
转载:https://blog.csdn.net/qq_25827845/article/details/53868815 1.String源码中equals大致写法: public boolean ...
- AcWing 826. 单链表
https://www.acwing.com/activity/content/problem/content/863/1/ #include <iostream> using names ...