微服务

作者: isuntong | 来源:发表于2020-03-28 22:27 被阅读0次

微服务简介

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介绍

https://grpc.io/
https://github.com/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)
    }

}

相关文章

  • 菜鸟带你看传说中的微信开发!

    1.微信开发原理微信客户端->微信服务器->开发绑定的服务器。微信开发步骤: 2.微信验证服务器原理(验证服务器的...

  • 胡健豪:如何运营微信矩阵

    微信矩阵是怎么回事,其实就是1个微信服务号+N个微信订阅号。微信服务号和订阅号的差别在于,服务号提供公司服务,订阅...

  • zabbix微信 | 微信对接自己服务器(2)

    上接使用微信告警 企业号微信对接自己服务器 1.本地服务器与微信服务器的信任 本地具有独立外网ip服务器获取微信服...

  • 微服务的微

    微服务的微,是指服务粒度的微么? 微服务可能是由此得名的。但在微服务架构思想中,服务粒度的微,不应该放在首要强调的...

  • 微信服务

    1.微信sdk 样例 http://demo.open.weixin.qq.com/jssdk/

  • 实战 Docker+Kubernetes 微服务容器化(一)-初

    1 微服务-导学 2 软件架构的进化 3 什么是微服务 多微才算微 微服务的特征 微服务诞生背景 4 画出微服务架...

  • SDtalk-10:阿里茶山服务设计实践-4

    2015年的茶山:服务设计微日记 《服务设计微日记》以微日记的故事写作形式,引用每天生活和工作的真实服务设计案例及...

  • 微服务应该具备的功能

    微服务应该具备的功能 >> 微服务应该具备的功能微服务,可以拆分为“微”和“服务”二字。“微”即小的意思,那到底多...

  • 微信开发——内网穿透

    微信开发需要与微信服务器交互,要保证微信服务器能向我们的服务器POST数据,我们的服务器需要能够在公网访问。这里简...

  • 【服务设计】服务设计微日记

    服务设计如同一部电影,有各个角色,出场顺序也不一样,服务流程贯穿应用场景,且有故事性,各个利益相关者都有主次之分。...

网友评论

      本文标题:微服务

      本文链接:https://www.haomeiwen.com/subject/jwxduhtx.html