首先創建grpc服務原來是micro.NewService還支持http等其他訪問方式,但是grpc.NewService這種方法只支持grpc訪問,所以需要創建網關讓其支持http訪問
package main
import (
"github.com/micro/go-micro"
"github.com/micro/go-micro/registry"
"github.com/micro/go-micro/registry/etcdv3"
"github.com/micro/go-micro/service/grpc"
"micro/Services"
"micro/ServicesImpl"
)
func main() {
//consulReg := consul.NewRegistry(registry.Addrs("localhost:8500"))
etcdReg := etcdv3.NewRegistry(registry.Addrs("106.12.72.181:23791"))
myservice := grpc.NewService( //原來是micro.NewService還支持http等其他訪問方式,但是grpc這種方法只支持grpc訪問,所以需要創建網關讓其支持http訪問
micro.Name("api.xiahualou.com.test"),
micro.Address(":8001"),
micro.Registry(etcdReg),
//micro.Registry(consulReg),
)
Services.RegisterTestServiceHandler(myservice.Server(), new(ServicesImpl.TestService))
myservice.Run()
}

先安裝下面幾個工具


因為grpc-gateway生成出來的文件會和go-micro生成的文件有幾個函數會同名,所以不能放在一個package下面,所以我們把新建一個文件夾serviceGW用來放網關文件,避免沖突
cd Services/protos
protoc --micro_out=../ --go_out=../ test.proto
protoc-go-inject-tag -input=../test.pb.go
#生成網關文件
protoc --go_out=plugins=grpc:../../ServiceGW test.proto
protoc --grpc-gateway_out=logtostderr=true:../../ServiceGW test.proto
cd .. && cd ..
把生成網關文件的package改成ServiceGW,原來是Services,因為我們proto文件中定義的是Services

啟動grpc服務
package main
import (
"github.com/micro/go-micro"
"github.com/micro/go-micro/registry"
"github.com/micro/go-micro/registry/etcd"
"github.com/micro/go-micro/service/grpc"
"micro/Services"
"micro/ServicesImpl"
)
func main() {
//consulReg := consul.NewRegistry(registry.Addrs("localhost:8500"))
etcdReg := etcd.NewRegistry(registry.Addrs("106.12.72.181:23791"))
myservice := grpc.NewService(
micro.Name("api.xiahualou.com.test"),
micro.Address(":8001"),
micro.Registry(etcdReg),
//micro.Registry(consulReg),
)
Services.RegisterTestServiceHandler(myservice.Server(), new(ServicesImpl.TestService))
myservice.Run()
}
啟動網關服務
package main
import (
"context"
"github.com/grpc-ecosystem/grpc-gateway/runtime"
"google.golang.org/grpc"
"log"
"micro/ServiceGW"
"net/http"
)
func main() {
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer cancel()
gRpcEndPoint := "localhost:8001"
mux := runtime.NewServeMux()
opts := []grpc.DialOption{grpc.WithInsecure()} //不使用證書校驗
err := ServiceGW.RegisterTestServiceHandlerFromEndpoint(ctx, mux, gRpcEndPoint, opts) //gRpcEndPoint在這里的作用是當有請求來到9000端口會轉發給8001端口
if err != nil {
log.Fatal(err)
}
http.ListenAndServe(":9000", mux)//通過postman訪問9000端口服務會轉發給8001端口的rpc服務
}
通過post使用http請求訪問可以拿到結果,這里請求的url就是我們proto文件中定義好的

