设为首页 收藏本站
查看: 1585|回复: 0

[经验分享] Go语言学习笔记(八)golang 操作 Redis & Mysql & RabbitMQ

[复制链接]

尚未签到

发表于 2018-9-19 12:06:05 | 显示全部楼层 |阅读模式
package main  

  
import (
  

"fmt"  
"log"
  
"math/rand"
  
"os"
  
"strconv"
  
"strings"
  
"time"
  

  
"github.com/streadway/amqp"
  
)
  

  
/*
  
RPC模式
  
请求方
  
*/
  

  
func failOnError(err error, msg string) {
  
if err != nil {
  
log.Fatalf("%s: %s", msg, err)
  
panic(fmt.Sprintf("%s: %s", msg, err))
  
}
  
}
  

  
func randomString(l int) string {
  
bytes := make([]byte, l)
  
for i := 0; i < l; i++ {
  
bytes = byte(randInt(65, 90))
  
}
  
return string(bytes)
  
}
  

  
func randInt(min int, max int) int {
  
return min + rand.Intn(max-min)
  
}
  

  
func fibonacciRPC(n int) (res int, err error) {
  

  
conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
  
failOnError(err, "Failed to connect to RabbitMQ")
  
defer conn.Close()
  

  
ch, err := conn.Channel()
  
failOnError(err, "Failed to open a channel")
  
defer ch.Close()
  

  
// 队列声明
  
q, err := ch.QueueDeclare(
  
"",    // name
  
false, // durable
  
false, // delete when usused
  
true,  // exclusive 为真即连接断开就删除
  
false, // noWait
  
nil,   // arguments
  
    )
  
failOnError(err, "Failed to declare a queue")
  

  
msgs, err := ch.Consume(
  
q.Name, // queue
  
"",     // consumer
  
true,   // auto-ack
  
false,  // exclusive   这个为真,服务器会认为这是该队列唯一的消费者
  
false,  // no-local
  
false,  // no-wait
  
nil,    // args
  
    )
  
failOnError(err, "Failed to register a consumer")
  

  
corrId := randomString(32)
  

  
err = ch.Publish(
  
"",          // exchange
  
"rpc_queue", // routing key
  
false,       // mandatory
  
false,       // immediate
  
        amqp.Publishing{
  
ContentType:   "text/plain",
  
CorrelationId: corrId,
  
ReplyTo:       q.Name,
  
Body:          []byte(strconv.Itoa(n)),
  
})
  
failOnError(err, "Failed to publish a message")
  

  
for d := range msgs {
  
if corrId == d.CorrelationId {
  
res, err = strconv.Atoi(string(d.Body))
  
failOnError(err, "Failed to convert body to integer")
  
break
  
}
  
}
  

  
return
  
}
  

  
func main() {
  
rand.Seed(time.Now().UTC().UnixNano())
  

  
n := bodyFrom(os.Args)
  

  
log.Printf(" [x] Requesting fib(%d)", n)
  
res, err := fibonacciRPC(n)
  
failOnError(err, "Failed to handle RPC request")
  

  
log.Printf(" [.] Got %d", res)
  
}
  

  
func bodyFrom(args []string) int {
  
var s string
  
if (len(args) < 2) || os.Args[1] == "" {
  
s = "30"
  
} else {
  
s = strings.Join(args[1:], " ")
  
}
  
n, err := strconv.Atoi(s)
  
failOnError(err, "Failed to convert arg to integer")
  
return n
  
}



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-594245-1-1.html 上篇帖子: Asp.net core与golang web简单对比测试 下篇帖子: Golang学习 - regexp 包
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表