IOC-golang - Golang依存性インジェクションフレームワークは、開発者がGoアプ​​リケーションを構築するのに役立ちます。

(一款服务于 Go 开发者的依赖注入框架,方便搭建任何 Go 应用。 A Golang depenedency injection framework, helps developers to build any go application.)

Created at: 2022-05-17 17:25:14
Language: Go
License: Apache-2.0

IOC-golang:golang依存性注入フレームワーク

  ___    ___     ____                           _                         
 |_ _|  / _ \   / ___|           __ _    ___   | |   __ _   _ __     __ _ 
  | |  | | | | | |      _____   / _` |  / _ \  | |  / _` | | '_ \   / _` |
  | |  | |_| | | |___  |_____| | (_| | | (_) | | | | (_| | | | | | | (_| |
 |___|  \___/   \____|          \__, |  \___/  |_|  \__,_| |_| |_|  \__, |
                                |___/                               |___/ 

IOC-golang CI ライセンス

IOC-golangドキュメント

中文文档

中文README

デモGIF

IOC-golangは、IoCコンテナーの完全な実装を提供する強力なgolang依存性注入フレームワークです。その機能は次のとおりです。

  • 依存性注入

    あらゆる構造とインターフェースの依存性注入をサポートし、オブジェクトのライフサイクル管理メカニズムもサポートします。

    オブジェクトの作成、パラメーターの挿入、ファクトリメソッドを引き継ぐことができます。カスタマイズ可能なオブジェクトパラメータソース。

  • 構造体プロキシレイヤー

    AOPの考え方に基づいて、ioc-golangに登録されているすべての構造体に構造体プロキシレイヤーを提供します。インターフェイス指向の開発のシーンでは、このプロキシAOPレイヤーの拡張性に基づいて多くの開発機能を使用できます。インターフェイスリスト、パラメータ値の監視、メソッドレベルのトレース、パフォーマンスの不良点分析、フォールトインジェクション、分散システムでのメソッドレベルのトレースなど。

  • 自動構造体記述子コード生成機能

    コード生成ツールを提供しており、開発者は構造登録コードを簡単に生成できるように、注釈を使用して構造に注釈を付けることができます。

  • スケーラビリティ

    挿入される構造体の拡張、autowireモデルの拡張、およびデバッグAOPレイヤーの拡張をサポートします。

  • 多くの事前定義されたコンポーネント

    インジェクション用の事前定義されたオブジェクトとミドルウェアSDKを直接提供します。

プロジェクト構造

  • autowire:シングルトンモデルとマルチインスタンスモデルの2つの基本的なインジェクションモデルを提供します

  • config:ユーザーyaml構成ファイルの解析を担当する構成ロードモジュール

  • debug:デバッグモジュール:デバッグAPIを提供し、デバッグインジェクションレイヤーの実装を提供します

  • 拡張:コンポーネント拡張ディレクトリ:さまざまなインジェクションモデルに基づいた事前設定された実装構造を提供します。

    • autowire:モデル拡張の自動ロード

      • grpc:grpcクライアントモデル定義

      • config:モデル定義を構成します

      • rpc:ioc-ネイティブrpcサポート

      • トリプル:Dubbo3プロトコルのサポート。

    • config:構成インジェクションモデル拡張構造

      • string、int、map、slice
    • 通常:マルチインスタンスモデル拡張構造

      • redis

      • http_server

      • mysql

      • rocketmq

      • ナコス

  • 例:リポジトリの例

  • iocli:コード生成/プログラムデバッグツール

クイックスタート

コード生成ツールをインストールする

% go install github.com/alibaba/ioc-golang/iocli@latest
% iocli
hello

依存性注入チュートリアル

次のトポロジでプロジェクトを開発します。このチュートリアルでは、次のことを示すことができます。

  1. レジストリコードの生成
  2. インターフェイスインジェクション
  3. 構造体ポインターインジェクション
  4. APIでオブジェクトを取得
  5. デバッグ機能、リストインターフェイス、実装、およびメソッド。リアルタイムのパラメータと戻り値を監視します。

ioc-golang-quickstart-structure

ユーザーが書く必要のあるすべてのコード:main.go

package main

import (
	"fmt"
	"time"

	"github.com/alibaba/ioc-golang"
)

// +ioc:autowire=true
// +ioc:autowire:type=singleton

type App struct {
	// inject main.ServiceImpl1 pointer to Service interface with proxy wrapper
	ServiceImpl1 Service `singleton:"main.ServiceImpl1"`

	// inject main.ServiceImpl2 pointer to Service interface with proxy wrapper
	ServiceImpl2 Service `singleton:"main.ServiceImpl2"`

	// inject ServiceImpl1 pointer to Service1 's own interface with proxy wrapper
	// this interface belongs to ServiceImpl1, there is no need to mark 'main.ServiceImpl1' in tag
	Service1OwnInterface ServiceImpl1IOCInterface `singleton:""`

	// inject ServiceStruct struct pointer
	ServiceStruct *ServiceStruct `singleton:""`
}

func (a *App) Run() {
	for {
		time.Sleep(time.Second * 3)
		fmt.Println(a.ServiceImpl1.GetHelloString("laurence"))
		fmt.Println(a.ServiceImpl2.GetHelloString("laurence"))

		fmt.Println(a.Service1OwnInterface.GetHelloString("laurence"))
		
		fmt.Println(a.ServiceStruct.GetString("laurence"))
	}
}

type Service interface {
	GetHelloString(string) string
}

// +ioc:autowire=true
// +ioc:autowire:type=singleton

type ServiceImpl1 struct {
}

func (s *ServiceImpl1) GetHelloString(name string) string {
	return fmt.Sprintf("This is ServiceImpl1, hello %s", name)
}

// +ioc:autowire=true
// +ioc:autowire:type=singleton

type ServiceImpl2 struct {
}

func (s *ServiceImpl2) GetHelloString(name string) string {
	return fmt.Sprintf("This is ServiceImpl2, hello %s", name)
}

// +ioc:autowire=true
// +ioc:autowire:type=singleton

type ServiceStruct struct {
}

func (s *ServiceStruct) GetString(name string) string {
	return fmt.Sprintf("This is ServiceStruct, hello %s", name)
}

func main() {
	// start
	if err := ioc.Load(); err != nil {
		panic(err)
	}

	// app, err := GetAppIOCInterface is also ok, to get proxy wrapped app struct.
	app, err := GetApp()
	if err != nil {
		panic(err)
	}
	app.Run()
}

上記のプロキシラップレイヤーは、開発者がオブジェクトをインターフェイスフィールドに挿入する場合、またはAPIによってインターフェイスを取得する場合に、デフォルトでioc-golangによって挿入されるプロキシレイヤーです。インターフェイスへの注入が推奨されています。プロキシラップレイヤーが注入されたすべてのオブジェクトには、devops機能があります。

書き込み後、次のcliコマンドを実行して、go modを初期化し、コードを生成できます。(コード生成中の権限により、macでsudoが必要になる場合があります)

% go mod init ioc-golang-demo
% export GOPROXY="https://goproxy.cn"
% go mod tidy
% go get github.com/alibaba/ioc-golang@master
% sudo iocli gen

これは現在のディレクトリに生成されます:zz_generated.ioc.go、開発者はこのファイルを気にする必要はありません。上記の「GetApp」メソッドは生成されたコードで定義されています。

//go:build !ignore_autogenerated
// +build !ignore_autogenerated

// Code generated by iocli

package main

import (
        autowire "github.com/alibaba/ioc-golang/autowire"
        normal "github.com/alibaba/ioc-golang/autowire/normal"
        "github.com/alibaba/ioc-golang/autowire/singleton"
        util "github.com/alibaba/ioc-golang/autowire/util"
)

func init() {
        normal.RegisterStructDescriptor(&autowire.StructDescriptor{
                Factory: func() interface{} {
                        return &app_{}
                },
        })
        singleton.RegisterStructDescriptor(&autowire.StructDescriptor{
                Factory: func() interface{} {
                        return &App{}
                },
        })
  ...
func GetServiceStructIOCInterface() (ServiceStructIOCInterface, error) {
        i, err := singleton.GetImplWithProxy(util.GetSDIDByStructPtr(new(ServiceStruct)), nil)
        if err != nil {
                return nil, err
        }
        impl := i.(ServiceStructIOCInterface)
        return impl, nil
}

ファイルツリーを参照してください。

% tree
.
├── go.mod
├── go.sum
├── main.go
└── zz_generated.ioc.go

0 directories, 4 files

プログラムを実行する

go run .

コンソールのプリントアウト:

  ___    ___     ____                           _                         
 |_ _|  / _ \   / ___|           __ _    ___   | |   __ _   _ __     __ _ 
  | |  | | | | | |      _____   / _` |  / _ \  | |  / _` | | '_ \   / _` |
  | |  | |_| | | |___  |_____| | (_| | | (_) | | | | (_| | | | | | | (_| |
 |___|  \___/   \____|          \__, |  \___/  |_|  \__,_| |_| |_|  \__, |
                                |___/                               |___/ 
Welcome to use ioc-golang!
[Boot] Start to load ioc-golang config
[Config] Load default config file from ../conf/ioc_golang.yaml
[Config] Load ioc-golang config file failed. open /Users/laurence/Desktop/workplace/alibaba/conf/ioc_golang.yaml: no such file or directory
 The load procedure is continue
[Boot] Start to load debug
[Debug] Debug port is set to default :1999
[Boot] Start to load autowire
[Autowire Type] Found registered autowire type normal
[Autowire Struct Descriptor] Found type normal registered SD main.serviceStruct_
[Autowire Struct Descriptor] Found type normal registered SD main.app_
[Autowire Struct Descriptor] Found type normal registered SD main.serviceImpl1_
[Autowire Struct Descriptor] Found type normal registered SD main.serviceImpl2_
[Autowire Type] Found registered autowire type singleton
[Autowire Struct Descriptor] Found type singleton registered SD main.App
[Autowire Struct Descriptor] Found type singleton registered SD main.ServiceImpl1
[Autowire Struct Descriptor] Found type singleton registered SD main.ServiceImpl2
[Autowire Struct Descriptor] Found type singleton registered SD main.ServiceStruct
[Debug] Debug server listening at :1999
This is ServiceImpl1, hello laurence
This is ServiceImpl2, hello laurence
This is ServiceImpl1, hello laurence
This is ServiceStruct, hello laurence
...

インジェクションが成功し、プログラムが正常に実行されていることを示しています。

アプリをデバッグする

コンソール出力には、次のログがあります。

[Debug] Debug server listening at :1999

新しいコンソールを開き、iocliのデバッグ機能を使用して、プロキシレイヤーを持つすべての構造体とそのメソッドを一覧表示します。デフォルトのポートは1999です。

% iocli list
main.ServiceImpl1
[GetHelloString]

main.ServiceImpl2
[GetHelloString]

リアルタイムのパラメータと戻り値を監視します。例として、main.ServiceImplの'GetHelloString'メソッドを取り上げます。メソッドは3秒ごとに2回呼び出されます:

% iocli watch main.ServiceImpl1 GetHelloString
========== On Call ==========
main.ServiceImpl1.GetHelloString()
Param 1: (string) (len=8) "laurence"

========== On Response ==========
main.ServiceImpl1.GetHelloString()
Response 1: (string) (len=36) "This is ServiceImpl1, hello laurence"

========== On Call ==========
main.ServiceImpl1.GetHelloString()
Param 1: (string) (len=8) "laurence"

========== On Response ==========
main.ServiceImpl1.GetHelloString()
Response 1: (string) (len=36) "This is ServiceImpl1, hello laurence"
...

注釈分析

// +ioc:autowire=true
The code generation tool recognizes objects marked with the +ioc:autowire=true annotation

// +ioc:autowire:type=singleton
The marker autowire model is the singleton, as well as the normal multi-instance model, the config configuration model, the grpc client model and other extensions.

もっと

より多くのコード生成アノテーションは、ioc-golang-cliで表示できます。

その他の例と高度な使用法については、ioc-golang-exampleにアクセスしてください。

ライセンス

IOC-golangはAlibabaによって開発され、Apache License(バージョン2.0)の下でライセンスされています。詳細については、NOTICEファイルを参照してください。

私たちに接続する

プロジェクトに興味がある場合は、dingtalkグループ44638289に参加することをお勧めします。