微服务

栏目: IT技术 · 发布时间: 4年前

内容简介:官方net/rpc包多参数new struct

微服务简介

微服务
微服务
微服务
微服务
微服务

RPC

官方net/rpc包

微服务
微服务
微服务
微服务
package main

import (
    "fmt"
    "net/rpc"
)

//客户端逻辑实现
func main() {

    client,err := rpc.DialHTTP("tcp","localhost:8081")
    if err != nil {
        panic(err.Error())
    }

    var req float32 //请求值
    req = 3

    //var resp *float32 //返回值
    ////同步的调用方式
    //err = client.Call("MathUtil.CalculateCircleArea",req,&resp)
    //if err != nil {
    //  panic(err.Error())
    //}
    //fmt.Println(*resp)

    var respSync *float32
    //异步的调用方式 最后一个参数是一个通道变量
    syncCall := client.Go("MathUtil.CalculateCircleArea",req,&respSync,nil)
    replayDone := <-syncCall.Done
    fmt.Println(replayDone)
    fmt.Println(*respSync)


}
微服务
微服务

多参数

new struct

package param

type AddParam struct {
    Args1 float32
    Args2 float32
}

client:

var result *float32
    addparam := &param.AddParam{1.2,2.3}
    err = client.Call("MathUtil.Add",addparam,&result)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println("计算结果:",*result)

rpc和protobuf结合使用

微服务

gRPC

gRPC介绍

微服务
微服务
微服务

protobuf

网络通信数据交换协议,比json,xml更好一点

微服务

https://github.com/protocolbuffers/protobuf/releases

微服务

命令行

微服务

打开的访达,把解压的protoc文件复制进来

微服务

此时protoc编译器可用

微服务

安装库

微服务

go get github.com/golang/protobuf/protoc-gen-go

微服务
微服务

test.proto

syntax = "proto2";
package example;

message Order{
  required string order_id = 1; //1代表字段顺序
  optional int64 num = 2;
  optional int32 timestamp = 3;
}
微服务

这个pb.go就可以使用了

main.go

package main

import (
    "fmt"
    "gPRCCode/example"
    "github.com/golang/protobuf/proto"
    "os"
)

func main() {
    fmt.Println("hello world")

    msg_test := &example.Order{
        OrderId:              proto.String("abcd1234"),
        Num:                  proto.Int64(123),
        Timestamp:            proto.Int32(123456),
    }

    //序列化
    msgDataEncoding,err := proto.Marshal(msg_test)
    if err != nil {
        panic(err.Error())
        return
    }

    //反序列化
    msgEntity := example.Order{}
    err = proto.Unmarshal(msgDataEncoding,&msgEntity)
    if err != nil {
        fmt.Println(err.Error())
        os.Exit(1)
        return
    }

    fmt.Println("orderId:",msgEntity.GetOrderId())
    fmt.Println("num:",msgEntity.GetNum())
    fmt.Println("timestamp:",msgEntity.GetTimestamp())



}
微服务

grpc实现rpc服务调用

.proto文件服务定义

编译.proto文件

gPRC实现RPC调用编程

微服务
微服务
微服务
微服务
微服务
微服务

gPRC实现PRC编程

微服务
微服务

server.go

package main

import (
    "context"
    "errors"
    "fmt"
    "gPRCCode/message"
    "google.golang.org/grpc"
    "net"
    "time"
)

type OrderServiceImpl struct {

}

//GetOrderInfo(context.Context, *OrderRequest) (*OrderInfo, error)
func (os *OrderServiceImpl) GetOrderInfo(ctx context.Context,request *message.OrderRequest) (*message.OrderInfo, error) {

    OrderMap := map[string]message.OrderInfo{
        "20200328001" : message.OrderInfo{OrderId:"20200328001",OrderNum:"衣服",OrderStatus:"已付款"},
        "20200328002" : message.OrderInfo{OrderId:"20200328002",OrderNum:"零食",OrderStatus:"已付款"},
        "20200328003" : message.OrderInfo{OrderId:"20200328003",OrderNum:"玩具",OrderStatus:"未付款"},
    }

    var response *message.OrderInfo
    current := time.Now().Unix()
    if request.Timestamp > current {
        *response = message.OrderInfo{
            OrderId:              "0",
            OrderNum:             "",
            OrderStatus:          "订单信息异常",
            XXX_NoUnkeyedLiteral: struct{}{},
            XXX_unrecognized:     nil,
            XXX_sizecache:        0,
        }
    }else {
        result := OrderMap[request.Order]
        if result.OrderId != "" {
            fmt.Println(result)
            return &result,nil
        }else {
            return nil,errors.New("server error")
        }
    }

    return response,nil

}

func main() {

    server := grpc.NewServer()

    message.RegisterOrderServiceServer(server,new(OrderServiceImpl))

    lis,err := net.Listen("tcp",":8090")

    if err != nil {
        panic(err.Error())
    }
    server.Serve(lis)

}

client.go

package main

import (
    "context"
    "fmt"
    "gPRCCode/message"
    "google.golang.org/grpc"
    "time"
)

func main() {

    //1. Dail链接
    conn,err := grpc.Dial("localhost:8090",grpc.WithInsecure())
    if err != nil {
        panic(err.Error())
    }
    defer conn.Close()

    orderServiceClient := message.NewOrderServiceClient(conn)

    //call("service.method") go
    orderRequest := &message.OrderRequest{
        Order:                "20200328001",
        Timestamp:            time.Now().Unix(),
    }
    orderInfo, err := orderServiceClient.GetOrderInfo(context.Background(),orderRequest)

    if orderInfo != nil {
        fmt.Println(orderInfo.GetOrderId())
        fmt.Println(orderInfo.OrderNum)
        fmt.Println(orderInfo.OrderStatus)
    }

}
微服务
微服务

以上所述就是小编给大家介绍的《微服务》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

MySQL技术内幕

MySQL技术内幕

姜承尧 / 机械工业出版社 / 2013-5 / 79.00元

《MySQL技术内幕:InnoDB存储引擎(第2版)》由国内资深MySQL专家亲自执笔,国内外多位数据库专家联袂推荐。作为国内唯一一本关于InnoDB的专著,《MySQL技术内幕:InnoDB存储引擎(第2版)》的第1版广受好评,第2版不仅针对最新的MySQL 5.6对相关内容进行了全面的补充,还根据广大读者的反馈意见对第1版中存在的不足进行了完善,《MySQL技术内幕:InnoDB存储引擎(第2......一起来看看 《MySQL技术内幕》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具