23.創建grpc網關的基本設置和運行方法


首先創建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()
}

先安裝下面幾個工具

image-20200102203807649

因為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文件中定義好的






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM