go

go 检测数据竞争 race

Go(从v1.1开始)具有内置的数据竞争检测器,可以使用它来检测潜在的数据竞争。 使用: 运行时检查竟态的命令:go run -race main.go 构建时检查竟态的命令:go build -race main.go 测试时检查竟态的命令:go test -race main.go 总结一下,其实就是race选项其实就是检测数据的安全性的,同时读写(而不是同时读,同时写),等情况。

go 不一样的grpc入门示例

之所以说不一样,是因为在这里你看不到.proto文件,当然也无需生成任何代码 之所以这么神奇是我用了buf,它托管了我的.proto文件,并且自动生成了相关代码,详情请移步:https://www.cuiwei.net/p/1679512807 服务端极简示例 下面的示例提供了一个AdminLogin服务 server.go package main import ( "context" blogv1 "go.buf.build/grpc/go/cuiwei/blog/admin/v1" "google.golang.org/grpc" "net" ) ty...

微服务链路追踪之Jaeger

在一个微服务分布式架构的系统中,可能存在复杂的、深层的层层服务调用关系,大致如下图 如果某个环节出问题,在海量的日志中定位问题是很痛苦的,于是就有了调用链追踪系统,比较有名的是:Jaeger和Zipkin。本篇文章主要介绍Jaeger Jaeger的组成部分 Instrumentation SDKs: 集成到应用程序和框架中以捕获跟踪数据的库。 从历史上看,Jaeger 项目支持使用各种编程语言编写的自己的客户端库。 它们现在被弃用,取而代之的是 OpenTelemetry Jaeger Agent: Jaeger 代理是一个网络守护程序,用于侦听通过 UDP 从 Jaeger 客户端接收...

gRPC调试工具推荐

在介绍工具之前先说一个情况,就是你用某个工具调试时,会发现,有的项目无需手动导入.proto文件,工具就能列出所有method,有些则不行。这是因为项目注册了反射,先看下怎么注册反射 就是这样,下面开始介绍工具 Postman 这个我觉得是最好的 gRPC UI gRPC的交互式Web用户界面,类似postman 安装 go install github.com/fullstorydev/grpcui/cmd/grpcui@latest 使用 # no TLS cuiwei@weideMacBook-Pro ~ % grpcui -plaintext localhost:9087 gRPC...

go-zero: not matching destination to scan

在用go-zero写一个通过api调用grpc的一个功能 问题还原 错误的返回值 func (m *customCwFlashModel) FindListByPage(ctx context.Context, page, max int64) (resp []*flash.AdminFlashDetailResponse, err error) { 。。。 } 这是一个查询flash列表的自定义模型,flash的定义有三处,分别是model部分、api部分和grpc部分 model部分 这是go-zero通过sql自动生成的 CwFlash struct { ...

go mutex的模式

mutex 有正常模式和饥饿模式 mutex是golang提供的基础并发原语,可以帮助我们处理多goruntine并发访问共享资源的问题。每个goruntine都要再获取到锁之后才能操作共享资源,完成操作释放锁,保证了共享资源的读写安全性。 但这种方式也可能带来一些问题:一些悲惨的goruntine一直获取不到锁,导致业务逻辑不能继续完整执行,这种问题被称为"饥饿问题" 正常模式 当前的mutex只有一个goruntine来获取,那么没有竞争,直接返回。 新的goruntine进来,如果当前mutex已经被获取了,则该goruntine进入一个先入先出的waiter队列,...

gin 使用 Json Web Token(JWT)

之前的token验证借助了redis,如果用jwt就不需要了 中间件 cat middlewares/jwt.go package middlewares import ( "enterprise-api/app/models" "enterprise-api/core" "github.com/gin-gonic/gin" ) func JWTAuth(role string) gin.HandlerFunc { return func(c *gin.Context) { signToken := c.Request.Header.Get...

grpc 实现统一格式的body响应

我们写rest api时,统一响应大多是这样的 { "err": 0, "msg": "参数错误",//有错误时非空 "data" : {//没错误时才存在 ... } } 在grpc项目中有些许差异 func Admin2Resetpasswd(ctx context.Context, in *pb.Admin2ResetpasswdRequest) (*pb.Admin2ResetpasswdResponse, error) { if in.AdminId == in.ToAid { return nil, status.Error(code...

使用 buf 替代 protoc 生成和管理代码

以go为例,下面是所需工具 工具 介绍 安装 protobuf protoc 可执行文件 Install protoc-gen-go 从 proto 文件,生成 .go 文件 Install protoc-gen-go-grpc 从 proto 文件,生成 GRPC 相关的 .go 文件 Install protoc-gen-grpc-gateway 从 proto 文件,生成 grpc-gateway 相关的 .go 文件 Install protoc-gen-openapiv2 从 proto 文件,生成 swagger 所需的json文件 Install ...

gRPC 同时提供 Restful API 接口

gRPC支持很多语言,但是种种原因,要么对方的语言不支持,要么老项目无法改造,这时就需要提供Restful API 接口。如果重新写一套肯定是不划算的,这时候使用gRPC-Gateway,只需要在现有的gRPC项目做稍许修改就可以轻松实现Restful API 接口 引用etcd文档中的一段话 为什么你应该考虑使用gRPC网关? etcd v3使用gRPC作为其消息传递协议。etcd项目包括一个基于gRPC的Go客户端和一个命令行实用程序etcdctl,用于通过gRPC与etcd集群通信。对于不支持gRPC的语言,etcd提供JSON gRPC网关。此网关服务于RESTful代理,将HTTP...