持续创造,加快成长!这是我参与「日新方案 10 月更文挑战」的第5天,点击检查活动详情

Don’t Repeat Yourself 不要重复自己,这是软件开发的一个基本原则,意图就是削减重复。可是在系统中不同的部分,或许会有不同的事务逻辑,若运用相同的功用来解决不同上下文中的问题,那应该运用公共方法来避免代码重复吗?

同享库

运用同享库能够协助咱们办理代码重用的问题,可是需求考虑同享库依靠和改变控制的问题。

假如有几个服务都运用了一个同享库:

  • 同享库产生改变,每个服务都需求运用新版别同享库。旧版别的同享库假如被弃用就会导致服务不行运用,所以在这种情况下,每次产生改变时就需求从头测验和从头部署服务。
  • 服务产生改变就需求更改同享库,这样同享库就失去通用性的特征。说明同享库包含服务相关的服务的事务逻辑。但这样是过错的,同享库不应该与服务有任何关联的代码块

假如有几个服务都有运用多个同享库:

不同的服务运用不同的库,依靠多个库。同享库越多,依靠就越多,就会导致依靠办理变得困难。

创立库

Go 操作 RabbitMQ 创立一个同享库为比如,需求初始化 MQ实例,创立衔接,重连机制、关闭,消费者通道,创立行列,行列绑定交换机等等功用。

type RabbitMQ struct {
    connection   *amqp.Connection
    channel      *amqp.Channel
    connURL      string
    errCh        <-chan *amqp.Error
    messageChan  <-chan amqp.Delivery
    retryAttempt int
}
// 初始化 MQ 实例
func NewRabbitMQ(options RabbitMQOptions) (*RabbitMQ, error) {
    rabbitMQ := &RabbitMQ{
        connURL:      options.URL,
        retryAttempt: options.RetryAttempt,
    }
    if err := rabbitMQ.connect(); err != nil {
        return nil, err
    }
    return rabbitMQ, nil
}
func (rmq *RabbitMQ) connect() error {}
func (rmq *RabbitMQ) reconnect() {}
func (rmq *RabbitMQ) Close() {}
func (rmq *RabbitMQ) ConsumeMessageChannel() (jsonBytes []byte, err error) {
func (rmq *RabbitMQ) CreateQueue(name string, durable bool, autoDelete bool, exclusive bool, noWait bool, args map[string]interface{}) (amqp.Queue, error) }

创立完之后需求再创立一个合适的标签 tag 或版别号来同享该代码。运用过 github 都能够在 release 中看到版别号和 tag 。

运用库

首要,咱们需求运用 go get 装置这个同享库。 之后,咱们必须在咱们的项目中导入咱们的库,如下所示。

package main
import (
    "fmt"
    rabbitmq_sdk "github.com/nanlv/rabbitmq-sdk"
)
func main() {
    fmt.Println("connect MQ")
    options := rabbitmq_sdk.RabbitMQOptions{
        URL:          "amqp://root:root@localhost:5672/",
        RetryAttempt: 5,
    }
    rabbitMQ, err := rabbitmq_sdk.NewRabbitMQ(options)
    if err != nil {
        return
    }
    queue, err := rabbitMQ.CreateQueue("queue1", true, true, false, false, nil)
    if err != nil {
        fmt.Println(err.Error())
        return
    }
}

假如你想测验你的库而不发布它,你能够运用 replace 指令。 将依靠库的地址指向本地的文件的地址。

replace github.com/nanlv/rabbitmq-sdk v1.0.0 => 项目在本地的地址

总结

若两个部分运用相同的库或许会增加依靠和耦合。因为它们具有不同的事务逻辑,在事务独立演进时,就会增加耦合和维护成本。耦合是衡量两个组件间了解和相互依靠程度的目标。耦合度越高,依靠性越高。

同享库能够解决代码重复的问题。但需求做好版别办理和改变控制。运用 Go 能够创立一个同享库然后上传到 github。就能够将其作为一个同享库运用。