打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Apache Thrift  Go Tutorial

Go Tutorial


Introduction

All Apache Thrift tutorials require that you have:

  1. Built and installed the Apache Thrift Compiler and Libraries, see Building from source for more details.
  2. Generated the tutorial.thrift and shared.thrift files as discussed here.

    thrift -r --gen go tutorial.thrift
  3. Followed all prerequisites listed below.

Prerequisites

  • At least Go 1.1.x is required to run the tutorial code.
  • The GOPATH may need to be adjusted, alternatively manually put the Go Thrift library files into a suitable location.

Client

import (    "crypto/tls"    "fmt"    "git.apache.org/thrift.git/lib/go/thrift"    "tutorial")func handleClient(client *tutorial.CalculatorClient) (err error) {    client.Ping()    fmt.Println("ping()")    sum, _ := client.Add(1, 1)    fmt.Print("1+1=", sum, "\n")    work := tutorial.NewWork()    work.Op = tutorial.Operation_DIVIDE    work.Num1 = 1    work.Num2 = 0    quotient, err := client.Calculate(1, work)    if err != nil {        switch v := err.(type) {        case *tutorial.InvalidOperation:            fmt.Println("Invalid operation:", v)        default:            fmt.Println("Error during operation:", err)        }        return err    } else {        fmt.Println("Whoa we can divide by 0 with new value:", quotient)    }    work.Op = tutorial.Operation_SUBTRACT    work.Num1 = 15    work.Num2 = 10    diff, err := client.Calculate(1, work)    if err != nil {        switch v := err.(type) {        case *tutorial.InvalidOperation:            fmt.Println("Invalid operation:", v)        default:            fmt.Println("Error during operation:", err)        }        return err    } else {        fmt.Print("15-10=", diff, "\n")    }    log, err := client.GetStruct(1)    if err != nil {        fmt.Println("Unable to get struct:", err)        return err    } else {        fmt.Println("Check log:", log.Value)    }    return err}func runClient(transportFactory thrift.TTransportFactory, protocolFactory thrift.TProtocolFactory, addr string, secure bool) error {    var transport thrift.TTransport    var err error    if secure {        cfg := new(tls.Config)        cfg.InsecureSkipVerify = true        transport, err = thrift.NewTSSLSocket(addr, cfg)    } else {        transport, err = thrift.NewTSocket(addr)    }    if err != nil {        fmt.Println("Error opening socket:", err)        return err    }    transport = transportFactory.GetTransport(transport)    defer transport.Close()    if err := transport.Open(); err != nil {        return err    }    return handleClient(tutorial.NewCalculatorClientFactory(transport, protocolFactory))}

This snippet was generated by Apache Thrift's source tree docs: <="" a="">tutorial/go/src/client.go

Server

import (    "crypto/tls"    "fmt"    "git.apache.org/thrift.git/lib/go/thrift"    "tutorial")func runServer(transportFactory thrift.TTransportFactory, protocolFactory thrift.TProtocolFactory, addr string, secure bool) error {    var transport thrift.TServerTransport    var err error    if secure {        cfg := new(tls.Config)        if cert, err := tls.LoadX509KeyPair("server.crt", "server.key"); err == nil {            cfg.Certificates = append(cfg.Certificates, cert)        } else {            return err        }        transport, err = thrift.NewTSSLServerSocket(addr, cfg)    } else {        transport, err = thrift.NewTServerSocket(addr)    }    if err != nil {        return err    }    fmt.Printf("%T\n", transport)    handler := NewCalculatorHandler()    processor := tutorial.NewCalculatorProcessor(handler)    server := thrift.NewTSimpleServer4(processor, transport, transportFactory, protocolFactory)    fmt.Println("Starting the simple server... on ", addr)    return server.Serve()}

This snippet was generated by Apache Thrift's source tree docs: <="" a="">tutorial/go/src/server.go

Server Handler

import (    "fmt"    "shared"    "strconv"    "tutorial")type CalculatorHandler struct {    log map[int]*shared.SharedStruct}func NewCalculatorHandler() *CalculatorHandler {    return &CalculatorHandler{log: make(map[int]*shared.SharedStruct)}}func (p *CalculatorHandler) Ping() (err error) {    fmt.Print("ping()\n")    return nil}func (p *CalculatorHandler) Add(num1 int32, num2 int32) (retval17 int32, err error) {    fmt.Print("add(", num1, ",", num2, ")\n")    return num1 + num2, nil}func (p *CalculatorHandler) Calculate(logid int32, w *tutorial.Work) (val int32, err error) {    fmt.Print("calculate(", logid, ", {", w.Op, ",", w.Num1, ",", w.Num2, "})\n")    switch w.Op {    case tutorial.Operation_ADD:        val = w.Num1 + w.Num2        break    case tutorial.Operation_SUBTRACT:        val = w.Num1 - w.Num2        break    case tutorial.Operation_MULTIPLY:        val = w.Num1 * w.Num2        break    case tutorial.Operation_DIVIDE:        if w.Num2 == 0 {            ouch := tutorial.NewInvalidOperation()            ouch.WhatOp = int32(w.Op)            ouch.Why = "Cannot divide by 0"            err = ouch            return        }        val = w.Num1 / w.Num2        break    default:        ouch := tutorial.NewInvalidOperation()        ouch.WhatOp = int32(w.Op)        ouch.Why = "Unknown operation"        err = ouch        return    }    entry := shared.NewSharedStruct()    entry.Key = logid    entry.Value = strconv.Itoa(int(val))    k := int(logid)    /*       oldvalue, exists := p.log[k]       if exists {         fmt.Print("Replacing ", oldvalue, " with ", entry, " for key ", k, "\n")       } else {         fmt.Print("Adding ", entry, " for key ", k, "\n")       }    */    p.log[k] = entry    return val, err}func (p *CalculatorHandler) GetStruct(key int32) (*shared.SharedStruct, error) {    fmt.Print("getStruct(", key, ")\n")    v, _ := p.log[int(key)]    return v, nil}func (p *CalculatorHandler) Zip() (err error) {    fmt.Print("zip()\n")    return nil}

This snippet was generated by Apache Thrift's source tree docs: <="" a="">tutorial/go/src/handler.go

Additional Information

  • Try using one of the other available protocols, default is binary.
  • Try using the buffered and/or framed transport options.
  • Note that both server and client must use the exact same protocol and transport stack.
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
Go语言错误处理异常捕获+异常抛出
如何快速写出高质量的 Go 代码?
Go 自定义error错误
使用Golang开发微信公众平台
Go 语言简介(下)— 特性
用Golang实现 echo服务器/客户端
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服