首先我需要去了解一些概念,根据百度百科了解到:

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构建微服务》阅读笔记的更多相关文章

  1. 阅读《RobHess的SIFT源码分析:综述》笔记

    今天总算是机缘巧合的找到了照样一篇纲要性质的文章. 如是能早一些找到就好了.不过“在你认为为时已晚的时候,其实还为时未晚”倒是也能聊以自慰,不过不能经常这样迷惑自己,毕竟我需要开始跑了! 就照着这个大 ...

  2. RobHess的SIFT源码分析:imgfeatures.h和imgfeatures.c文件

    SIFT源码分析系列文章的索引在这里:RobHess的SIFT源码分析:综述 imgfeatures.h中有SIFT特征点结构struct feature的定义,除此之外还有一些特征点的导入导出以及特 ...

  3. RobHess的SIFT源码分析:综述

    最初的目的是想做全景图像拼接,一开始找了OpenCV中自带的全景拼接的样例,用的是Stitcher类,可以很方便的实现全景拼接,而且效果很好,但是不利于做深入研究. 使用OpenCV中自带的Stitc ...

  4. 阅读《RobHess的SIFT源码分析:综述》笔记2

    今天开始磕代码部分. part1: 1. sift特征提取. img1_Feat = cvCloneImage(img1);//复制图1,深拷贝,用来画特征点 img2_Feat = cvCloneI ...

  5. element-ui button组件 radio组件源码分析整理笔记(一)

    Button组件 button.vue <template> <button class="el-button" @click="handleClick ...

  6. element-ui 组件源码分析整理笔记目录

    element-ui button组件 radio组件源码分析整理笔记(一) element-ui switch组件源码分析整理笔记(二) element-ui inputNumber.Card .B ...

  7. element-ui Carousel 走马灯源码分析整理笔记(十一)

    Carousel 走马灯源码分析整理笔记,这篇写的不详细,后面有空补充 main.vue <template> <!--走马灯的最外层包裹div--> <div clas ...

  8. STL源码分析读书笔记--第二章--空间配置器(allocator)

    声明:侯捷先生的STL源码剖析第二章个人感觉讲得蛮乱的,而且跟第三章有关,建议看完第三章再看第二章,网上有人上传了一篇读书笔记,觉得这个读书笔记的内容和编排还不错,我的这篇总结基本就延续了该读书笔记的 ...

  9. element-ui MessageBox组件源码分析整理笔记(十二)

    MessageBox组件源码,有添加部分注释 main.vue <template> <transition name="msgbox-fade"> < ...

  10. element-ui switch组件源码分析整理笔记(二)

    源码如下: <template> <div class="el-switch" :class="{ 'is-disabled': switchDisab ...

随机推荐

  1. python:创建文件夹

    #!/usr/bin/python# -*- coding:utf-8 -*- import os dir = './dir'os.mkdir(dir)

  2. 棋盘划分问题中4的k次方减一是三的倍数

    1.数学归纳法(万物皆可数学归纳) ①当n=1时:4-1=3(是三的倍数) ②假设n-1成立证明n成立:4n-1=4n-1*(4-1)+4n-1-1 =3*4n-1+(4n-1-1) 所以4n-1%3 ...

  3. java基础(十三)之接口

    接口 什么是接口? 生活中也有很多的接口,比如USB接口.定义了接口就是定义了调用对象的标准. 接口基本语法 1.使用interface定义:2.接口当中的方法都是抽象方法:因为抽象函数不能生成对象, ...

  4. django--关于部署scrapyd项目报错问题

    首先在同步两篇之前写过的博客,可能能用得到 1.https://www.cnblogs.com/lutt/p/10893192.html2.https://www.cnblogs.com/lutt/p ...

  5. electron聊天室|vue+electron-vue仿微信客户端|electron桌面聊天

    一.项目概况 基于Electron+vue+electron-vue+vuex+Nodejs+vueVideoPlayer+electron-builder等技术仿制微信电脑端界面聊天室实例,实现消息 ...

  6. AcWing 803. 区间合并

    #include <iostream> #include <vector> #include <algorithm> using namespace std; ty ...

  7. eclipse快速创建一个Spring Boot应用

    1,创建一个空的maven项目 2,添加parent <parent> <groupId>org.springframework.boot</groupId> &l ...

  8. 消息中间件MQTT

    1.1概念 MQTT(MQ Telemetry Transport) 消息队列遥测传输协议是IBM开发的一种网络应用层的协议,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息 ...

  9. 每天进步一点点------直接数字频率合成DDS

     

  10. php 利用debug_backtrace方法跟踪代码调用

    在开发过程中,例如要修改别人开发的代码或调试出问题的代码,需要对代码流程一步步去跟踪,找到出问题的地方进行修改.如果有一个方法可以获取到某段代码是被哪个方法调用,并能一直回溯到最开始调用的地方(包括调 ...