双向认证下rpc-gateway使用(同时提供rpc和http服务)
2024-08-22 04:14:17
下载go get -v github.com/grpc-ecosystem/grpc-gateway,然后把这个包下面的third-party下面的google文件夹拷贝到Prod.proto的同级目录下
syntax = "proto3";
package services;
import "google/api/annotations.proto"; //引入proto
message ProdRequest {
int32 prod_id = 1; //传入id
}
message ProdResponse {
int32 prod_stock = 1; //商品库存
}
service ProdService {
rpc GetProdStock (ProdRequest) returns (ProdResponse) {
option (google.api.http) = {
get: "/v1/prod/{prod_id}" //和request中的prod_id对应,不能写错
};
}
}
然后重新生成pb文件和生成pb.gw.go网关文件
封装服务端证书配置和客户端证书配置文件
package helper
import (
"crypto/tls"
"crypto/x509"
"google.golang.org/grpc/credentials"
"io/ioutil"
)
//获取服务端证书配置
func GetServerCreds() credentials.TransportCredentials {
cert,_:=tls.LoadX509KeyPair("cert/server.pem","cert/server.key")
certPool := x509.NewCertPool()
ca, _ := ioutil.ReadFile("cert/ca.pem")
certPool.AppendCertsFromPEM(ca)
creds:=credentials.NewTLS(&tls.Config{
Certificates: []tls.Certificate{cert},//服务端证书
ClientAuth: tls.VerifyClientCertIfGiven,
ClientCAs: certPool,
})
return creds
}
//获取客户端证书配置
func GetClientCreds() credentials.TransportCredentials {
cert,_:=tls.LoadX509KeyPair("cert/client.pem","cert/client.key")
certPool := x509.NewCertPool()
ca, _ := ioutil.ReadFile("cert/ca.pem")
certPool.AppendCertsFromPEM(ca)
creds:=credentials.NewTLS(&tls.Config{
Certificates: []tls.Certificate{cert},//客户端证书
ServerName: "localhost",
RootCAs: certPool,
})
return creds
}
编写HttpServer文件,由于是http访问grpc,所以http也相当于一个客户端,需要提供客户端秘钥才可以成功访问
package main
import (
"context"
"github.com/grpc-ecosystem/grpc-gateway/runtime"
"google.golang.org/grpc"
"grpcpro/helper"
"grpcpro/services"
"log"
"net/http"
)
func main() {
gwmux := runtime.NewServeMux()
opt := []grpc.DialOption{grpc.WithTransportCredentials(helper.GetClientCreds())} //由于是http访问grpc,所以http也相当于一个客户端,需要提供客户端秘钥才可以成功访问
err := services.RegisterProdServiceHandlerFromEndpoint(context.Background(), gwmux, "localhost:8081", opt) //localhost这是grpc的地址
if err != nil {
log.Fatal(err)
}
httpServer := &http.Server{
Addr: ":8080",
Handler: gwmux,
}
httpServer.ListenAndServe()
}
grpc server文件
package main
import (
"google.golang.org/grpc"
"grpcpro/helper"
"grpcpro/services"
"net"
)
func main() {
//creds, err := credentials.NewServerTLSFromFile("keys/server.crt",
// "keys/server.key")
//if err != nil {
// log.Fatal(err)
//}
creds := helper.GetServerCreds() //这里这个方法取到的是服务端证书配置
rpcServer := grpc.NewServer(grpc.Creds(creds))
services.RegisterProdServiceServer(rpcServer, new(services.ProdService))
lis, _ := net.Listen("tcp", ":8081")
rpcServer.Serve(lis)
//mux:=http.NewServeMux()
//mux.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {
// rpcServer.ServeHTTP(writer,request)
//})
//httpServer:=&http.Server{
// Addr:":8081",
// Handler:mux,
//}
//httpServer.ListenAndServeTLS("keys/server.crt","keys/server.key")
}
最新文章
- webstorm下载&;&;安装过程&;&;打开项目
- Silverlight5 Tools安装失败及解决方案
- java第二次作业
- Sql Server建立链接服务器访问Access的MDB数据库
- 【BZOJ】【1030】【JSOI2007】文本生成器
- java懒汉式单例遇到多线程
- 换成gnome3桌面后国际版qq不能输入中文问题
- Javascript参数传递中值和引用的一种理解
- aix网络管理
- Vmdk文件如何使用,vmdk导入虚拟机VMware8.0教程
- linux脚本后台监控执行指定程序的状态(假设程序是死的重新启动程序)
- js实现搜索框响应回车键
- REST风格框架实战:从MVC到前后端分离(附完整Demo)
- DSL 系列(1) - 扩展点的论述与实现
- 2019.02.21 bzo1038: [ZJOI2008]瞭望塔(半平面交)
- (16)模型层Models - ORM的使用
- hive随机采样
- 无法嵌入互操作类型";ESRI.ArcGIS.Carto.MapDocumentClass";.请改用适用的接口
- 2-Python3从入门到实战—基础之运算符
- Dubbo学习笔记6:Dubbo增强SPI与SPI中扩展点自动包装的实现原理