双向认证下rpc-gateway使用(同时提供rpc和http服务)


下载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")
}
双向认证下rpc-gateway使用(同时提供rpc和http服务)的更多相关文章
- 使用gRPC-Gateway快速构建微服务-双向认证下rpc-gateway使用(同时提供rpc和http接口)
		https://github.com/grpc-ecosystem/grpc-gateway 在grpc之上加一层代理并转发,转变成protobuf格式来访问grpc服务 安装 go get -u g ... 
- nodejs之https双向认证
		说在前面 之前我们总结了https的相关知识,如果不懂可以看我另一篇文章:白话理解https 有关证书生成可以参考:自签证书生成 正题 今天使用nodejs来实现https双向认证 话不多说,直接进入 ... 
- SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码)
		SSL握手通信详解及linux下c/c++ SSL Socket代码举例(另附SSL双向认证客户端代码) 摘自: https://blog.csdn.net/sjin_1314/article/det ... 
- linux下Tomcat+OpenSSL配置单向&双向认证(自制证书)
		背景 由于ios将在2017年1月1日起强制实施ATS安全策略,所有通讯必须使用https传输,本文只针对自制证书,但目前尚不确定自制证书是否能通过appstore审核. 1.必须支持传输层安全(TL ... 
- .net core下用HttpClient和asp.net core实现https的双向认证
		关于https双向认证的知识可先行google,这时矸接代码. 为了双向认证,我们首先得准备两个crt证书,一个是client.crt,一个是server.crt,有时为了验证是否同一个根证书的验证, ... 
- (xampp)lampp 下配置https(ssl)自签双向认证以后 apache无法启动解决方案
		自签CA一般是没有应用场景的,因为需要客户端浏览器导入证书才能访问 但是在某些需要内部使用的场景下,确实是一个解决方案 但是在lampp配置了双向认证以后发现 原来自带的管理命令 lampp star ... 
- Centos 7 环境下,如何使用 Apache 实现 SSL 虚拟主机 双向认证 的详细教程:
		1. testing ! ... 1 1 原文参考链接: http://showerlee.blog.51cto.com/2047005/1266712 很久没有更新LAMP的相关文档了,刚好最近单位 ... 
- windows下tomcat+nginx+openssl配置双向认证
		1. 基础知识 CA证书:https://blog.csdn.net/yangyuge1987/article/details/79209473 SSL双向认证原理:https://blog.csdn ... 
- tomcat配置SSL双向认证
		一.SSL简单介绍 SSL(Secure Sockets Layer 安全套接层)就是一种协议(规范),用于保障客户端和服务器端通信的安全,以免通信时传输的信息被窃取或者修改. 怎样保障数据传输安全? ... 
随机推荐
- linux 创建虚拟机常见错误
			无法打开内核设备global vmx86 重启虚拟机所有服务 无法创建虚拟机 需要使用管理员身份运行vm即可 
- Shell编程学习记录
			一.shell中单引号和双引号的区别: 1).单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原 封不动的使用,唯一需要注意的点是不允许引用自身: 2).双引号属于弱引用, ... 
- dom元素新增后不会触发事件
			<!DOCTYPE HTML> <html> <head> <title>checkbox设置只能单选</title> <script ... 
- golang 执行命令行(二)--修改进程启动用户
			继续上文所述,有时候我们需要设置进程的启动用户,操作与设置进程组的方式类似,不多说直接上代码: // 修改进程的执行用户 func withUserAttr(cmd *exec.Cmd, name s ... 
- 【LEETCODE】48、数组分类,简单级别,题目:189,217,219,268,283,414
			package y2019.Algorithm.array; import java.util.Arrays; import java.util.Stack; /** * @ClassName Rot ... 
- tkinter学习笔记_02
			4. 多行输入框 text # 按钮 # command 执行动作 def insert_point(): var = e.get() t.insert('insert', var) b = tk.B ... 
- Javascript实现的智能消防栓状态监测画面
			系统需要添加智能消防栓模块.集成了一家采用NbIOT通讯的智能消防栓产品.由第厂家平台对接NbIot特联网平台,我们平台提供一个api从第三方平台接收消防栓状态,用SignlaR把状态推送到前端.需要 ... 
- 异常【kubelet cgroup driver:cgroupfs跟docker cgroup driver:systemd不一致】
			修改docker.service vi /lib/systemd/system/docker.service 找到 --exec-opt native.cgroupdriver=systemd \ 修 ... 
- undefined reference to cv::imread(cv::String const&, int)
			.build_release/lib/libcaffe-nv.so: undefined reference to cv::imread(cv::String const&, int)' .b ... 
- Java中map接口 遍历map
			转自:https://www.cnblogs.com/wjk921/p/4918442.html java集合框架用于存储数据,也被称为集合类 位于java.util包下 java.util包下常用接 ... 
