grpc
https://blog.csdn.net/weixin_34365417/article/details/88714357
-
c, err := credentials.NewServerTLSFromFile("../../conf/server.pem", "../../conf/server.key")
-
if err != nil {
-
log.Fatalf("credentials.NewServerTLSFromFile err: %v", err)
-
}
-
-
server := grpc.NewServer(grpc.Creds(c))
-
pb.RegisterSearchServiceServer(server, &SearchService{})
server:
-
func main() {
-
c, err := credentials.NewClientTLSFromFile("../../conf/server.pem", "go-grpc-example")
-
if err != nil {
-
log.Fatalf("credentials.NewClientTLSFromFile err: %v", err)
-
}
-
-
conn, err := grpc.Dial(":"+PORT, grpc.WithTransportCredentials(c))
-
if err != nil {
-
log.Fatalf("grpc.Dial err: %v", err)
-
}
-
defer conn.Close()
-
-
client := pb.NewSearchServiceClient(conn)
-
resp, err := client.Search(context.Background(), &pb.SearchRequest{
-
Request: "gRPC",
-
})
-
if err != nil {
-
log.Fatalf("client.Search err: %v", err)
-
}
-
-
log.Printf("resp: %s", resp.GetResponse())
-
}
ca :
https://segmentfault.com/a/1190000016601810
server:
func main() {
cert, err := tls.LoadX509KeyPair("../../conf/server/server.pem", "../../conf/server/server.key")
if err != nil {
log.Fatalf("tls.LoadX509KeyPair err: %v", err)
}
certPool := x509.NewCertPool()
ca, err := ioutil.ReadFile("../../conf/ca.pem")
if err != nil {
log.Fatalf("ioutil.ReadFile err: %v", err)
}
if ok := certPool.AppendCertsFromPEM(ca); !ok {
log.Fatalf("certPool.AppendCertsFromPEM err")
}
c := credentials.NewTLS(&tls.Config{
Certificates: []tls.Certificate{cert},
ClientAuth: tls.RequireAndVerifyClientCert,
ClientCAs: certPool,
})
server := grpc.NewServer(grpc.Creds(c))
pb.RegisterSearchServiceServer(server, &SearchService{})
lis, err := net.Listen("tcp", ":"+PORT)
if err != nil {
log.Fatalf("net.Listen err: %v", err)
}
server.Serve(lis)
}
client:
func main() {
cert, err := tls.LoadX509KeyPair("../../conf/client/client.pem", "../../conf/client/client.key")
if err != nil {
log.Fatalf("tls.LoadX509KeyPair err: %v", err)
}
certPool := x509.NewCertPool()
ca, err := ioutil.ReadFile("../../conf/ca.pem")
if err != nil {
log.Fatalf("ioutil.ReadFile err: %v", err)
}
if ok := certPool.AppendCertsFromPEM(ca); !ok {
log.Fatalf("certPool.AppendCertsFromPEM err")
}
c := credentials.NewTLS(&tls.Config{
Certificates: []tls.Certificate{cert},
ServerName: "go-grpc-example",
RootCAs: certPool,
})
conn, err := grpc.Dial(":"+PORT, grpc.WithTransportCredentials(c))
if err != nil {
log.Fatalf("grpc.Dial err: %v", err)
}
defer conn.Close()
client := pb.NewSearchServiceClient(conn)
resp, err := client.Search(context.Background(), &pb.SearchRequest{
Request: "gRPC",
})
if err != nil {
log.Fatalf("client.Search err: %v", err)
}
log.Printf("resp: %s", resp.GetResponse())
}
c := credentials.NewTLS(&tls.Config{
Certificates: []tls.Certificate{cert},
ServerName: "go-grpc-example",
RootCAs: certPool,
})
conn, err := grpc.Dial(":"+PORT, grpc.WithTransportCredentials(c))
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理