go

gRPC 同时提供 Restful API 接口

go

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...

grpc TLS证书认证

go

首先,申请证书,这个证书和nginx用的是一样的,具体步骤请移步:RabbitMQ插件之MQTT ca.cer www.cuiwei.net.key www.cuiwei.net.pem 看代码 服务端 ... // 从输入证书文件和密钥文件为服务端构造TLS凭证 creds, err := credentials.NewServerTLSFromFile("./www.cuiwei.net.pem", "./www.cuiwei.net.key") if err != nil { log.Fatalf("Failed to generate credentials %v", er...

Golang大文件下载

go

文件下载 func DownloadFile() { url := "https://www.baidu.com/img/pc_79bff59263430e2e42693b50cf376490.png" resp, _ := http.Get(url) defer resp.Body.Close() data, err := io.ReadAll(resp.Body) if err != nil { panic(err) } _ = os.WriteFile("./pc_79bff59263430e2e42693b50cf376490.png", data, 0777) ...

Golang获取普通字符串和大文件的MD5

go

先看一下md5的两种用法 hash := md5.New() b := []byte("test") hash.Write(b) fmt.Printf("%x %x\n", hash.Sum(nil), md5.Sum(b)) 普通字符串的md5 func Md5(str string) string { data := []byte(str) return fmt.Sprintf("%x", md5.Sum(data)) } 小文件的md5(不推荐) func Md5File(file string) string { cf, _ := os.Open(file) def...

Golang使用微软语音SDK实现文字转语音,Docker环境开箱即用

go

微软语音是什么这里就不多说了,文本转语音我之前尝试过调用 REST API,但是太慢了,一句话的文本还行,几百字的文本就需要几十秒,甚至几分钟,就很容易失败。所以这次尝试一下Go版本的 SDK,吸引我的点是它快,并且可以在服务端运行 配置开发环境 按照官方文档所说需要先配置语音SDK,而这个SDK只支持Linux,所以我选择了Go的官方Docker镜像 Golang:1.19(此镜像是基于Debian),然后配合VS Code进行容器内开发 如上,我打开了VS Code,按照官方文档的步骤 apt-get update apt-get install build-essential lib...

go内置的性能分析工具 - pprof

go

获取数据 控制台程序 - 使用runtime/pprof库 如下,一个基于 cobra 的程序 package main import ( "cobra-demo/cmd" "fmt" "os" "runtime/pprof" ) func main() { //start cpuProfile, err := os.Create("./pprof/cpu_profile") if err != nil { fmt.Printf("创建文件失败:%s", err.Error()) return } defer cpuProfile.Close() memPro...

golang 中实现并发安全的map

go

Go语言中的 map 在并发情况下,只读是线程安全的,同时读写是线程不安全的。 问题还原 下面来看下并发情况下读写 map 时会出现的问题 func main() { m := make(map[int]int) go func() { // 不停地对map进行写入 for { m[1] = 1 } }() go func() { // 不停地对map进行读取 for { _ = m[1] } }() } 会报错 fatal error: concurrent map read and map write 实现方案1 - 加锁 // 加锁的m...

go-zero 创建api/rpc项目

go

1.创建目录ent-api,然后用goland打开 设置代理 GOPROXY=https://goproxy.cn 2.初始化项目 cuiwei@weideMacBook-Pro ent-api % go mod init ent-api go: creating new go.mod: module ent-api 创建项目(这里咱不用这种方式,咱通过 api文件创建) cuiwei@weideMacBook-Pro ent-api % goctl api new ent //rpc cuiwei@weideMacBook-Pro ent-api % goctl rpc new ...

缺少某些方法: mustEmbedUnimplementedJobServiceServer()

go

默认情况下,要使用此工具生成的方法注册服务,服务实现必须嵌入相应的UnimplementedServer,以实现未来的兼容性。这是与之前包含在protoc-gen-go中包含的grpc代码生成器的行为更改。要恢复此行为,请设置require_unimplemented_servers=false选项。例如: protoc --go-grpc_out=require_unimplemented_servers=false[,other options...]:. \ 请注意,不建议这样做,并且仅提供该选项来恢复与之前生成的代码向后兼容性。 建议的做法是,在你的实现(blogServer)文件中...