下载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") }

最新文章

  1. webstorm下载&&安装过程&&打开项目
  2. Silverlight5 Tools安装失败及解决方案
  3. java第二次作业
  4. Sql Server建立链接服务器访问Access的MDB数据库
  5. 【BZOJ】【1030】【JSOI2007】文本生成器
  6. java懒汉式单例遇到多线程
  7. 换成gnome3桌面后国际版qq不能输入中文问题
  8. Javascript参数传递中值和引用的一种理解
  9. aix网络管理
  10. Vmdk文件如何使用,vmdk导入虚拟机VMware8.0教程
  11. linux脚本后台监控执行指定程序的状态(假设程序是死的重新启动程序)
  12. js实现搜索框响应回车键
  13. REST风格框架实战:从MVC到前后端分离(附完整Demo)
  14. DSL 系列(1) - 扩展点的论述与实现
  15. 2019.02.21 bzo1038: [ZJOI2008]瞭望塔(半平面交)
  16. (16)模型层Models - ORM的使用
  17. hive随机采样
  18. 无法嵌入互操作类型"ESRI.ArcGIS.Carto.MapDocumentClass".请改用适用的接口
  19. 2-Python3从入门到实战—基础之运算符
  20. Dubbo学习笔记6:Dubbo增强SPI与SPI中扩展点自动包装的实现原理

热门文章

  1. Java开发笔记(一百二十)AWT文本标签
  2. Sublime Text3安装LESS
  3. SQL——JOIN(连接)
  4. Linux远程管理命令
  5. Selenium 配置IE浏览器
  6. redis连接相关命令
  7. 阿里云ECS云服务器Linux Tomcat启动慢 访问网页转圈
  8. 爬虫 HttpHelper
  9. Ado.Net查询语句使用临时表做条件
  10. 【洛谷 P4070】 [SDOI2016]生成魔咒(后缀自动机)