gRPC实战:从零构建一个时间服务与问候服务

Go 微服务框架实战:基于 Gin 和 gRPC 构建高可用、高性能分布式系统 微服务架构是一种将单一应用拆分为多个小型、独立、松耦合服务的架构模式。独立部署:每个服务可以独立部署、扩展和升级。松耦合:服务间通过轻量级协议(如 HTTP、gRPC 等)进行通信,不直接依赖于其他服务的实现。弹性扩展:每个服务都可以根据业务需求独立扩展。容错与高可用:采用熔断器、限流等机制保证服务在高并发时的稳定性。Go 语言非常适合构建微服务,特别是与Gin框架(用于构建 HTTP 服务)和gRPC(用于高效的远程过程调用)结合使用时,能够高效地处理并发、优化服务间通信,从而提高系统性能。 阅读详情

1. gRPC基础概念与开发流程

gRPC是一个高性能、开源的通用RPC框架,由Google推出。它基于HTTP/2协议设计,默认使用Protocol Buffers作为序列化工具。在实际项目中,gRPC特别适合微服务架构中的服务间通信。

开发一个gRPC服务通常包含以下四个核心步骤:

  1. 定义proto文件:使用Protocol Buffers语法描述服务接口和数据结构
  2. 生成代码:通过protoc工具生成对应语言的客户端和服务端代码
  3. 实现服务端:编写业务逻辑代码实现proto定义的服务接口
  4. 开发客户端:使用生成的客户端代码调用远程服务

我刚开始接触gRPC时,最困惑的就是如何将proto定义转换为实际可运行的代码。后来发现protoc工具配合语言插件就能自动完成这个转换过程,大大简化了开发工作。

2. 构建时间查询服务

2.1 定义时间服务接口

我们先从简单的例子开始,创建一个返回服务器时间的gRPC服务。首先需要定义proto文件:

syntax = "proto3";
package proto;
option go_package = "./base;base";

service BaseService {
  rpc GetTime (TimeRequest) returns (TimeResponse) {}
}

message TimeRequest {}

message TimeResponse {
  string time = 1;
}

这个proto文件定义了一个BaseService服务,其中包含GetTime方法。TimeRequest是空消息,表示不需要输入参数;TimeResponse包含一个字符串类型的time字段。

2.2 生成gRPC代码

安装好protoc工具和Go语言的gRPC插件后,执行以下命令生成代码:

protoc --go_out=plugins=grpc:. time.proto

这条命令会生成time.pb.go文件,其中包含:

  • TimeRequest和TimeResponse结构体
  • BaseServiceClient接口(客户端使用)
  • BaseServiceServer接口(服务端实现)

2.3 实现服务端逻辑

接下来实现服务端代码:

package main

import (
	"context"
	pb "demo/base"
	"fmt"
	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
	"net"
	"time"
)

type service struct {
	pb.UnimplementedBaseServiceServer
}

func (s *service) GetTime(ctx context.Context, in *pb.TimeRequest) (*pb.TimeResponse, error) {
	now := time.Now().Format("2006-01-02 15:04:05")
	return &pb.TimeResponse{Time: now}, nil
}

func main() {
	listen, err := net.Listen("tcp", ":50051")
	if err != nil {
		fmt.Println(err)
		return
	}
	
	s := grpc.NewServer()
	reflection.Register(s)
	pb.RegisterBaseServiceServer(s, &service{})
	
	fmt.Println("Time服务已启动,监听端口50051")
	s.Serve(listen)
}

服务端代码做了以下几件事:

  1. 实现GetTime接口,返回当前时间字符串
  2. 创建gRPC服务器实例
  3. 注册服务实现
  4. 启动TCP监听

2.4 开发客户端调用

客户端代码相对简单:

package main

import (
	"context"
	pb "demo/base"
	"fmt"
	"google.golang.org/grpc"
	"time"
)

func main() {
	conn, err := grpc.Dial(":50051", grpc.WithInsecure(), grpc.WithBlock())
	if err != nil {
		fmt.Println(err)
		return
	}
	defer conn.Close()

	c := pb.NewBaseServiceClient(conn)
	
	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	
	r, err := c.GetTime(ctx, &pb.TimeRequest{})
	if err != nil {
		fmt.Println(err)
		return
	}
	
	fmt.Println("服务器时间:", r.Time)
}

运行客户端和服务端后,你会看到客户端打印出服务器当前时间。这个简单例子展示了gRPC的核心开发流程。

3. 创建问候服务

3.1 定义问候服务接口

接下来我们实现一个更实用的问候服务。首先定义hello.proto:

syntax = "proto3";
package hello;
option go_package = "./hello";

service Hello {
  rpc SayHello(HelloRequest) returns (HelloResponse) {}
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

这个服务定义了一个SayHello方法,接收包含name的请求,返回问候语。

3.2 生成代码

同样使用protoc生成代码:

protoc -I . --go_out=plugins=grpc:. ./hello.proto

3.3 实现服务端

服务端实现SayHello方法:

package main

import (
	"context"
	pb "demo/hello"
	"fmt"
	"google.golang.org/grpc"
	"log"
	"net"
)

type server struct {
	pb.UnimplementedHelloServer
}

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
	return &pb.HelloResponse{
		Message: fmt.Sprintf("你好, %s!", in.Name),
	}, nil
}

func main() {
	lis, err := net.Listen("tcp", ":50052")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	
	s := grpc.NewServer()
	pb.RegisterHelloServer(s, &server{})
	
	log.Println("问候服务已启动,监听端口50052")
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

3.4 客户端调用

客户端代码:

package main

import (
	"context"
	pb "demo/hello"
	"google.golang.org/grpc"
	"log"
)

func main() {
	conn, err := grpc.Dial(":50052", grpc.WithInsecure(), grpc.WithBlock())
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()

	c := pb.NewHelloClient(conn)
	
	ctx := context.Background()
	res, err := c.SayHello(ctx, &pb.HelloRequest{Name: "gRPC"})
	if err != nil {
		log.Fatalf("could not greet: %v", err)
	}
	
	log.Println(res.Message)
}

运行后会输出"你好, gRPC!"的问候语。通过这两个例子,你应该已经掌握了gRPC的基本开发方法。

4. 项目结构与开发技巧

4.1 典型项目结构

一个规范的gRPC项目通常采用以下目录结构:

demo/
├── proto/               # 存放所有proto文件
│   ├── time.proto
│   └── hello.proto
├── gen/                 # 生成的代码
│   ├── base/
│   │   └── time.pb.go
│   └── hello/
│       └── hello.pb.go
├── server/              # 服务端代码
│   ├── time/
│   │   └── main.go
│   └── hello/
│       └── main.go
└── client/              # 客户端代码
    ├── time/
    │   └── main.go
    └── hello/
        └── main.go

4.2 实用开发技巧

  1. 使用buf工具:替代protoc,提供更好的proto文件管理和代码生成体验
  2. 添加拦截器:实现认证、日志、监控等横切关注点
  3. 启用反射:方便使用grpcurl等工具测试服务
  4. 配置超时:客户端调用时务必设置合理的超时时间
  5. 错误处理:使用gRPC标准错误码,方便客户端处理

4.3 常见问题解决

在实际开发中,我遇到过几个典型问题:

  1. 版本兼容性问题:确保protoc版本与protoc-gen-go插件版本兼容
  2. 包导入问题:正确设置go_package选项,避免生成代码中的导入路径错误
  3. 连接问题:服务端和客户端需要使用相同的协议(如plaintext或TLS)
  4. 性能问题:复用gRPC连接,避免频繁创建销毁连接的开销

5. 进阶主题与扩展

5.1 流式RPC

gRPC支持四种通信模式:

  1. 一元RPC(普通RPC)
  2. 服务端流式RPC
  3. 客户端流式RPC
  4. 双向流式RPC

流式RPC特别适合传输大量数据或实时通信场景。例如,可以实现一个文件传输服务:

service FileService {
  rpc Upload(stream Chunk) returns (UploadResponse) {}
  rpc Download(DownloadRequest) returns (stream Chunk) {}
}

5.2 拦截器应用

拦截器是gRPC的中间件机制,可以用于:

  • 认证和授权
  • 日志记录
  • 监控指标收集
  • 请求/响应修改
  • 限流和熔断

实现一个简单的日志拦截器:

func loggingInterceptor(ctx context.Context, req interface{}, 
	info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
	
	start := time.Now()
	resp, err := handler(ctx, req)
	log.Printf("方法:%s 耗时:%v 错误:%v", 
		info.FullMethod, time.Since(start), err)
	return resp, err
}

// 注册拦截器
grpc.NewServer(grpc.UnaryInterceptor(loggingInterceptor))

5.3 负载均衡与健康检查

在生产环境中,通常需要考虑:

  1. 客户端负载均衡
  2. 服务健康检查
  3. 服务发现集成
  4. 重试和熔断机制

gRPC原生支持这些特性,可以结合具体服务发现工具(如Consul、Etcd)使用。

java版gRPC实战之三:服务端流 本文是《java版gRPC实战》系列的第三篇,前文咱们实战体验了简单的RPC请求和响应,那种简单的请求响应方式其实只是gRPC定义的四种类型之一,这里给出《gRPC 官方文档中文版》对这四种gRPC类型的描述:简单 RPC:客户端使用存根(stub)发送请求到服务器并等待响应返回,就像平常的函数调用一样;服务器端流式 RPC:客户端发送请求到服务器,拿到一个流去读取返回的消息序列。客户端读取返回的流,直到里面没有任何消息;(即本篇内容) 阅读详情

相关推荐

使用Spring Boot+gRPC构建微服务并部署到Istio

使用Spring Boot+gRPC构建微服务并部署到Istio 作为Service Mesh和云原生技术的忠实拥护者,我却一直没有开发过Service Mesh的应用。正好最近受够了Spring Cloud的“折磨”,对Kubernetes也可以熟练使用了,而且网上几乎没有Spring Boot微服务部署到Istio的案例,我就开始考虑用Spring Boot写个微服务的Demo并且部署到Istio。项目本身不复杂,就是发送一个字符串并且返回一个字符串的最简单的Demo。 题外话:我本来是想用Sprin

江文 | Back-End Developer 3418

从零构建 gRPC 跨语言通信:C++ 服务端与 C# 客户端完整指南

在现代分布式系统中,gRPC 作为高性能、跨语言的 RPC 框架越来越受欢迎。它基于 HTTP/2 协议,使用 Protocol Buffers(Protobuf)作为接口定义语言,支持多种编程语言,能够高效地实现不同语言之间的远程过程调用。本文将手把手教你如何从零开始构建一个完整的 gRPC 通信系统,使用 C++ 实现服务端,C# 实现客户端。首先,我们需要创建一个.proto文件来定义服务接口和数据结构。创建一个名为// 请求消息// 响应消息// 服务定义// 加法运算。

码事漫谈 5548

C#与gRPC实战:从零搭建通信服务的避坑指南

本文是一份C#与gRPC实战避坑指南,详细介绍了从零搭建通信服务的完整流程。内容涵盖环境准备、Proto文件编写、代码生成、服务端与客户端实现、流式通信以及调试部署等关键步骤,重点解析了开发过程中常见的版本匹配、协议定义和工具链配置等踩坑点,帮助开发者高效构建高性能的gRPC服务。

weixin_29199873的博客 574

gRPC实战:从零构建时间服务与Hello World案例

本文通过构建时间服务和Hello World两个实战案例,详细介绍了gRPC的核心开发流程。从编写.proto文件定义接口,到使用protoc生成代码骨架,再到实现服务端逻辑与客户端调用,手把手演示了如何利用gRPC实现高效的远程函数调用,帮助开发者快速入门并掌握这一微服务通信利器。

7up55的博客 1081

【Rust微服务】Rust结合grpc构建跨平台的微服务

gRPC是由google开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。 通过gRPC,客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,能够让用户更容易地创建分布式应用和服务。 在 Rust 中使用 gRPC 通常依赖于 tonic 这个库。Tonic 是一个基于 Tokio 的 gRPC 实现,支持 async/await,性能优良,是 Rust 社区使用最广泛的 gRPC 实现之一。

景天科技苑 4万+

LS-DYNA超高速碰撞仿真入门:从SPH算法配置到铝靶板穿孔分析(附K文件模板)

本文详细介绍了使用LS-DYNA中的SPH(光滑粒子流体动力学)算法进行超高速碰撞仿真的完整流程。以铝弹丸撞击铝靶板为例,从SPH算法原理、LS-PrePost前处理、材料模型与状态方程设置,到接触定义、边界条件及K文件生成,提供了系统的入门指导和关键参数调试经验,帮助工程师高效模拟材料破碎、穿孔等极端变形问题。

h0i1j2k3l的博客 726

掌握 gRPC:从安装到构建第一个C++ 和Python微服务

文章首先介绍了 gRPC 的基本概念和与传统通信方法的对比,然后详细指导如何在不同操作系统上安装 gRPC。通过具体的 C++ 和 Python 项目案例,我们展示了如何编写、编译和运行 gRPC 服务端和客户端,为读者提供了实际的操作步骤和代码示例。

m0_51661400的博客 5625

保姆级教程:手把手教你用Jacquard V2数据集训练机器人抓取模型(附完整代码)

本文提供了一份详细的保姆级教程,手把手教你使用Jacquard V2数据集训练机器人抓取模型。从环境配置、数据准备到模型架构设计、训练优化和实际部署,全程解析并附完整代码,帮助开发者快速掌握视觉抓取技术。

weixin_29031057的博客 314

(转载)gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

原文: gRPC初探——概念介绍以及如何构建一个简单的gRPC服务 - takumiCX - 博客园 gRPC初探——概念介绍以及如何构建一个简单的gRPC服务 目录 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 3.2 通过maven插件生成相应代码 3.3 gRPC服务端创建 3.5 gRPC客户端创建 3.6 ..

力尽山拔的博客 1763

基于SHIS凝视型短波红外高光谱相机(900-1700nm)区分不同宝石的差异性和可分性(宝石分选)

SHIS系列凝视型高光谱相机基于液晶可调谐滤波器(LCTF),通过电控LCTF进行连续细分窄波段分光,对每个波段进行高分辨率的二维面阵成像,进行图像处理后,获得完整的高光谱高清图像序列。具有低功耗、小型化、使用方便和易于扩展的优势。其工作波段覆盖400nm至1000nm,能够捕捉宝石在不同波长下的光谱特征,为宝石鉴定提供了新的工具。

wayho的博客 709

数字后端设计实现 | 数字后端PR工具Innovus中如何创建不同高度的row?

数字IC后端设计实现之innovus中如何创建不同高度的row?

weixin_37584728的博客 3163

10分钟快速入门 gRPC-rs:从零构建你的第一个 Rust gRPC 应用

想要在Rust生态中快速构建高性能的微服务应用?gRPC-rs是你的终极解决方案!作为Rust语言中最成熟的gRPC实现库,gRPC-rs基于Google的gRPC C Core构建,为开发者提供了完整的异步RPC框架支持。本文将带你快速掌握gRPC-rs的核心功能,在10分钟内完成第一个Rust gRPC应用的搭建。 ## 🚀 为什么选择gRPC-rs? gRPC-rs是TiKV团队维护的

gitblog_00012的博客 1043

基于CANoe的Basic Diagnostics ECU (UDS)

基于CANoe的Basic Diagnostics ECU (UDS)

farmer00的博客 9153

【gRPC实战】:从零构建高效微服务通信的完整指南

本文是一份从零构建高效微服务通信的完整指南,详细介绍了gRPC框架的核心优势与实战部署。通过对比HTTP/JSON,阐述了gRPC基于HTTP/2和Protobuf带来的高性能与强类型开发体验。指南涵盖开发环境搭建、Protobuf接口定义、服务端与客户端实现,并深入探讨了TLS加密、身份认证、健康检查等生产级配置,帮助开发者构建健壮、安全的微服务通信体系。

sugar的博客 992

基于物联网的门禁与考勤系统(阿里云)_81

本课题设计的基于物联网的门禁与考勤管理系统,结合现代信息技术,利用指纹识别、射频卡、密码输入和远程控制等多种开锁方式,提升门禁系统的安全性和灵活性;同时,通过物联网平台进行数据上传和远程管理,极大提高了管理效率。通过智能化的考勤功能,系统可以实时记录员工的出入情况,并通过云平台进行远程查询和管理,推动门禁与考勤管理的数字化、智能化和高效化。

1万+

猿创征文|Qt 文件和目录应用讲解【QCoreApplication】【QFile、QFileInfo】【QTemporaryDir和QTemporaryFile】【QDir】【QFileSyste】

Qt 文件和目录精准讲解【QCoreApplication】【QFile、QFileInfo】【QTemporaryDir和QTemporaryFile】【QDir】【QFileSyste】【QFileDialog】 第一章 QCoreApplication类 第一节 QCoreApplication常用函数方法 第二节 QCoreApplication举例 第二章 QFile类 第一节 静态函数方法 第二节 成员函数方法 第三章 QFileInfo类 第一节 常用函数方法 第四章 QDir类

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 942

使用 Go 与 gRPC 构建高性能微服务:从入门到实战指南

在// 定义用户信息消息// 查询用户请求// 查询用户响应// 创建用户请求// 创建用户响应// 用户服务定义// 根据用户 ID 查询用户信息// 创建一个新用户本文从环境搭建、接口定义到服务端与客户端实现,详细介绍了如何使用 Go 与 gRPC 构建一个高性能的微服务系统。通过丰富的代码示例,你了解了如何利用 Protocol Buffers 定义数据结构与服务接口,如何在 Go 中实现服务端业务逻辑,以及如何编写客户端调用代码。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 1730

LabVIEW实现TCP通信

在本节中,我们将简要探讨TCP通信的基础知识,并以工业物联网平台TLINK中的云端设备数据发布设计为例,详细阐述在互联网环境下TCP客户端应用程序设计的基本方法。

不脱发的程序猿 1962

java版gRPC实战之二:服务发布和调用

实战最基础的gRPC服务的开发和调用

程序员欣宸的博客 6037

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

漫谈grpc 5:实战,在Java中使用grpc

原文链接:java版gRPC实战之二:服务发布和调用 - 掘金 欢迎访问我的GitHub github.com/zq2599/blog… 内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等; 关于《java版gRPC实战》系列 《java版gRPC实战》是欣宸原创的面向java程序员的gRPC开发笔记,与读者们一起通过实战来学习掌握gRPC的各个知识点; 《java版gRPC实战》全系列链接 用proto生成代码 服务发布和调用 服务端流

Java技术江湖 4290

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

从零开始构建gRPC的Go服务

第一步首先定义gRPC服务以及方法请求和响应类型。然后在服务定义中定义RPC方法,指定它们的请求和响应类型。一个简单的RPC,其中客户端使用存根向服务端发送请求并等待响应返回,就像正常的函数调用一样。服务端流式RPC,客户端向服务端发送请求并获取流以读回一系列消息。客户端从返回的流中读取,直到没有更多消息为止。客户端流式RPC,其中客户端写入一系列消息并将它们发送到服务端,再次使用提供的流。一旦客户端完成了消息的写入,它会等待服务端读取所有消息并返回其响应。

ldxxxxll的博客 1478

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

本地构建gRPC的Mock服务

本文介绍了如何本地构建gRPC Mock服务。gRPC是一种跨语言的远程过程调用框架,基于HTTP2协议和Protocol Buffer数据格式。文章详细说明了创建gRPC Mock服务器的步骤:首先安装Node.js环境,然后通过npm安装相关依赖包,创建项目结构并编写.proto接口定义文件。重点展示了如何实现一个包含GetUser和CreateUser方法的用户服务Mock,包括错误处理和响应构建。该Mock服务可以用于本地测试,模拟真实gRPC服务的行为,同时支持请求验证和模拟数据返回,为开发调试提

ZebrafishInVines的博客 917

gRPC 实战篇:从零打造库存管理系统

说一个好消息,C++那些事开源项目4w star了!开源项目地址:https://github.com/Light-City/CPlusPlusThings网站:可以点击阅读原文或者:https://light-city.github.io/stories_things/gRPC 实战篇:从零打造库存管理系统目录一、项目背景二、如何设计 Protobuf核心代码 (inventory.proto)...

Francis的博客 1149

gRPC入门指南:构建高效微服务的利器

gRPC是一种高性能开源RPC框架,由Google开发,基于HTTP/2协议和Protocol Buffers数据格式。相比REST API,gRPC具有更高的性能(二进制传输、多路复用)、强类型安全和内置代码生成等优势。它支持四种通信模式:单向RPC、服务端流、客户端流和双向流。本文通过一个Go语言示例,展示了如何定义protobuf接口、生成代码并实现简单的用户服务,帮助开发者快速掌握gRPC的核心特性与应用方法。gRPC特别适合微服务架构中的内部通信、低延迟高吞吐场景以及多语言环境。

2501_93501759的博客 1054

gRPC-Go实战指南:从零构建微服务通信

gRPC-Go实战指南:从零构建微服务通信 【免费下载链接】grpc-go 基于HTTP/2的gRPC的Go语言实现。 项目地址: https://gitcode.com/GitHub_Trending/gr/grpc-go ...

gitblog_01025的博客 866
上一篇: LLM训练中的隐藏陷阱:为什么你的Sample Packing策略可能拖慢训练速度?
下一篇: Windows高DPI屏幕下Qt Designer预览与运行不一致?3步搞定缩放适配
bread
博客等级 码龄26年 59粉丝 1210原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值