服务端目录
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yToLg8SX-1656157179131)(C:/Users/86158/AppData/Roaming/Typora/typora-user-images/image-20220625192733577.png)]](https://1000bd.com/contentImg/2022/06/27/121058475.png)
Services/protos/Models.proto
syntax = "proto3";
package Services;
option go_package = "./;Services";
// 商品模型
message ProdModel{
int32 ProdID = 1;
string ProdName = 2;
}
Services/protos/ProdService.proto
syntax = "proto3";
package Services;
option go_package = "./;Services";
import "Models.proto";
message ProdsRequest {
int32 Size = 1;
}
message ProdListResponse{
repeated ProdModel data = 1;
}
service ProdService {
rpc GetProdsList(ProdsRequest) returns (ProdListResponse);
}
启动gen.bat脚本
cd Services/protos
protoc --micro_out=../ --go_out=../ Models.proto
protoc --micro_out=../ --go_out=../ ProdService.proto
protoc-go-inject-tag -input=../Models.pb.go
protoc-go-inject-tag -input=../ProdService.pb.go
cd .. && cd ..
ServiceImpl/ProdService.go 模拟数据
package ServiceImpl
import (
"context"
"fmt"
"go_micro_grpc/Services"
"strconv"
)
func NewProd(id int32, pname string) *Services.ProdModel {
return &Services.ProdModel{
ProdID: id,
ProdName: pname,
}
}
type ProdService struct {
}
func (p *ProdService) GetProdsList(ctx context.Context, req *Services.ProdsRequest, resp *Services.ProdListResponse) error {
ret := make([]*Services.ProdModel, 0)
var i int32
for i = 0; i < req.Size; i++ {
ret = append(ret, NewProd(100+i, "prodname"+strconv.Itoa(100+int(i))))
}
resp.Data = ret
fmt.Println(ret)
return nil
}
main.go
package main
import (
"github.com/asim/go-micro/plugins/registry/consul/v4"
"go-micro.dev/v4"
"go-micro.dev/v4/registry"
"go_micro_grpc/ServiceImpl"
"go_micro_grpc/Services"
)
func main() {
consulReg := consul.NewRegistry(
registry.Addrs("118.178.242.230:8500"),
)
prodService := micro.NewService(
micro.Name("prodservice"),
micro.Address(":8011"),
micro.Registry(consulReg),
)
prodService.Init()
Services.RegisterProdServiceHandler(prodService.Server(), new(ServiceImpl.ProdService))
prodService.Run()
}
客户端目录
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cMMAGQgY-1656157179133)(C:/Users/86158/AppData/Roaming/Typora/typora-user-images/image-20220625193401090.png)]](https://1000bd.com/contentImg/2022/06/27/121058738.png)
Services/protos/Models.proto
syntax = "proto3";
package Services;
option go_package = "./;Services";
// 商品模型
message ProdModel{
int32 ProdID = 1;
string ProdName = 2;
}
Services/protos/ProdService.proto
syntax = "proto3";
package Services;
option go_package = "./;Services";
import "Models.proto";
message ProdsRequest {
int32 Size = 1;
}
message ProdListResponse{
repeated ProdModel data = 1;
}
service ProdService {
rpc GetProdsList(ProdsRequest) returns (ProdListResponse);
}
启动gen.bat脚本
cd Services/protos
protoc --micro_out=../ --go_out=../ Models.proto
protoc --micro_out=../ --go_out=../ ProdService.proto
protoc-go-inject-tag -input=../Models.pb.go
protoc-go-inject-tag -input=../ProdService.pb.go
cd .. && cd ..
main.go
package main
import (
"github.com/asim/go-micro/plugins/registry/consul/v4"
"go-micro.dev/v4"
"go-micro.dev/v4/registry"
"go-micro.dev/v4/web"
"go_micro1/Services"
"go_micro1/Weblib"
)
func main() {
consulReg := consul.NewRegistry(
registry.Addrs("118.178.242.230:8500"),
)
myService := micro.NewService(
micro.Name("prodservice.client"),
)
prodService := Services.NewProdService("prodservice", myService.Client())
httpServer := web.NewService(
web.Name("httpprodservice"),
web.Address(":8001"),
web.Handler(Weblib.NewGinRouter(prodService)),
web.Registry(consulReg),
)
httpServer.Init()
httpServer.Run()
}
Weblib/router.go
package Weblib
import (
"github.com/gin-gonic/gin"
"go_micro1/Services"
)
func NewGinRouter(prodService Services.ProdService) *gin.Engine {
ginRouter := gin.Default()
ginRouter.Use(InitMiddleware(prodService))
v1Group := ginRouter.Group("/v1")
{
v1Group.Handle("POST", "/prods", GetProdsList)
}
return ginRouter
}
Weblib.handlers.go
package Weblib
import (
"context"
"fmt"
"github.com/gin-gonic/gin"
"go_micro1/Services"
)
func GetProdsList(ginCtx *gin.Context) {
prodService := ginCtx.Keys["prodservice"].(Services.ProdService)
var prodReq Services.ProdsRequest
err := ginCtx.Bind(&prodReq)
if err != nil {
ginCtx.JSON(500, gin.H{"status": err.Error()})
} else {
prodResp, err := prodService.GetProdsList(context.Background(), &prodReq)
if err != nil {
fmt.Println(err)
}
ginCtx.JSON(200, gin.H{"data": prodResp.GetData()})
}
}
Weblib.middlewares.go
package Weblib
import (
"github.com/gin-gonic/gin"
"go_micro1/Services"
)
func InitMiddleware(prodService Services.ProdService) gin.HandlerFunc {
return func(context *gin.Context) {
context.Keys = make(map[string]interface{})
context.Keys["prodservice"] = prodService
context.Next()
}
}
注 : 使用中间件传递prodService.
package main
import (
"context"
"fmt"
"github.com/asim/go-micro/plugins/registry/consul/v4"
"go-micro.dev/v4"
"go-micro.dev/v4/client"
"go-micro.dev/v4/registry"
"go-micro.dev/v4/web"
"go_micro1/Services"
"go_micro1/Weblib"
)
type logWrapper struct {
client.Client
}
func (this *logWrapper) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error {
fmt.Println("调用接口")
return this.Client.Call(ctx, req, rsp)
}
func NewLogWrapper(c client.Client) client.Client {
return &logWrapper{c}
}
func main() {
consulReg := consul.NewRegistry(
registry.Addrs("118.178.242.230:8500"),
)
myService := micro.NewService(
micro.Name("prodservice.client"),
micro.WrapClient(NewLogWrapper),
)
prodService := Services.NewProdService("prodservice", myService.Client())
httpServer := web.NewService(
web.Name("httpprodservice"),
web.Address(":8001"),
web.Handler(Weblib.NewGinRouter(prodService)),
web.Registry(consulReg),
)
httpServer.Init()
httpServer.Run()
}