README

Hiboot - web/cli application framework

hiboot

Build Status

About

Hiboot is a cloud native web and cli application framework written in Go.

Hiboot is not trying to reinvent everything, it integrates the popular libraries but make them simpler, easier to use. It borrowed some of the Spring features like dependency injection, aspect oriented programming, and auto configuration. You can integrate any other libraries easily by auto configuration with dependency injection support.

If you are a Java developer, you can start coding in Go without learning curve.

Overview

  • Web MVC (Model-View-Controller).
  • Auto Configuration, pre-create instance with properties configs for dependency injection.
  • Dependency injection with struct tag name `inject:""`, Constructor func, or Method.

Getting Started

Community Contributions Guide

Thank you for considering contributing to the Hiboot framework, The contribution guide can be found here.

License

© John Deng, 2017 ~ time.Now

Released under the Apache License 2.0

Documentation

Overview

Package hiboot is a web/cli app application framework

Hiboot is a cloud native web and cli application framework written in Go.

Hiboot integrates the popular libraries but make them simpler, easier to use. It borrowed some of the Spring features like dependency injection, aspect oriented programming, and auto configuration. You can integrate any other libraries easily by auto configuration with dependency injection support. hiboot-data is the typical project that implement customized hiboot starters. see https://godoc.org/hidevops.io/hiboot-data

Overview

Web MVC - (Model-View-Controller).
Auto Configuration - pre-create instance with properties configs for dependency injection.
Dependency injection - with struct tag name `inject:""` or Constructor func.

Introduction to Hiboot

One of the most significant feature of Hiboot is Dependency Injection. Hiboot implements JSR-330 standard.

Let's say that we have two implementations of AuthenticationService, below will explain how does Hiboot work.

type AuthenticationService interface {
	Authenticate(credential Credential) error
}

type basicAuthenticationService struct {
}

func newBasicAuthenticationService() AuthenticationService {
	return &basicAuthenticationService{}
}

func (s *basicAuthenticationService) Authenticate(credential Credential) error {
	// business logic ...
	return nil
}

type oauth2AuthenticationService struct {
}

func newOauth2AuthenticationService() AuthenticationService {
	return &oauth2AuthenticationService{}
}

func (s *oauth2AuthenticationService) Authenticate(credential Credential) error {
	// business logic ...
	return nil
}

func init() {
	app.Register(newBasicAuthenticationService, newOauth2AuthenticationService)
}

Field Injection

In Hiboot the injection into fields is triggered by `inject:""` struct tag. when inject tag is present on a field, Hiboot tries to resolve the object to inject by the type of the field. If several implementations of the same service interface are available, you have to disambiguate which implementation you want to be injected. This can be done by naming the field to specific implementation.

type userController struct {
	at.RestController

	BasicAuthenticationService AuthenticationService	`inject:""`
	Oauth2AuthenticationService AuthenticationService	`inject:""`
}

func newUserController() {
	return &userController{}
}

func init() {
	app.Register(newUserController)
}

Constructor Injection

Although Field Injection is pretty convenient, but the Constructor Injection is the first-class citizen, we usually advise people to use constructor injection as it has below advantages,

* It's testable, easy to implement unit test.
* Syntax validation, with syntax validation on most of the IDEs to avoid typo.
* No need to use a dedicated mechanism to ensure required properties are set.

type userController struct {
	at.RestController

	basicAuthenticationService AuthenticationService
}

// Hiboot will inject the implementation of AuthenticationService
func newUserController(basicAuthenticationService AuthenticationService) {
	return &userController{
		basicAuthenticationService: basicAuthenticationService,
	}
}

func init() {
	app.Register(newUserController)
}

Features

App
	cli - command line application
	web - web application

Starters
	actuator - health check
	locale - locale starter
	logging - customized logging settings
	jwt - jwt starter
	grpc - grpc application starter

Tags
	inject - inject generic instance into object
	default - inject default value into struct object
	value - inject string value or references / variables into struct string field

Utils
	cmap - concurrent map
	copier - copy between struct
	crypto - aes, base64, md5, and rsa encryption / decryption
	gotest - go test util
	idgen - twitter snowflake id generator
	io - file io util
	mapstruct - convert map to struct
	replacer - replacing stuct field value with references or environment variables
	sort - sort slice elements
	str - string util enhancement util
	validator - struct field validation

Getting started

This section will show you how to create and run a simplest hiboot application. Let’s get started!

Getting started with Hiboot web application

Get the source code

go get -u hidevops.io/hiboot
cd $GOPATH/src/hidevops.io/hiboot/examples/web/helloworld/

Source Code

Example

    This is a simple hello world example

    Output:
    
    

    Source Files

    Directories

    Path Synopsis
    examples
    cli
    Package cli provides hiboot command line application examples
    Package cli provides hiboot command line application examples
    web
    Package web provides hiboot web application examples
    Package web provides hiboot web application examples
    web/grpc
    Package grpc provides hiboot web application service examples that communicate with gRpc protocol
    Package grpc provides hiboot web application service examples that communicate with gRpc protocol
    web/grpc/helloworld/mock
    Package mock_protobuf is a generated GoMock package.
    Package mock_protobuf is a generated GoMock package.
    web/helloworld
    Package helloworld provides the quick start web application example main package
    Package helloworld provides the quick start web application example main package
    web/httpserver/statik/statik
    Package statik contains static assets.
    Package statik contains static assets.
    web/jaeger/formatter
    Package jaeger provides the quick start jaeger application example main package
    Package jaeger provides the quick start jaeger application example main package
    web/jaeger/hello
    Package jaeger provides the quick start jaeger application example main package
    Package jaeger provides the quick start jaeger application example main package
    web/jaeger/publisher
    Package jaeger provides the quick start jaeger application example main package
    Package jaeger provides the quick start jaeger application example main package
    web/router
    Package router provides the web application example that handle customized router in controller main package
    Package router provides the web application example that handle customized router in controller main package
    pkg
    app
    Package app provides abstract layer for cli/web application Package app provides hiboot app application interface
    Package app provides abstract layer for cli/web application Package app provides hiboot app application interface
    app/cli
    Package cli provides quick start framework for command line application.
    Package cli provides quick start framework for command line application.
    app/fake
    Package fake provides fake.ApplicationContext for unit testing
    Package fake provides fake.ApplicationContext for unit testing
    app/web
    Package web provides quick start framework for web application.
    Package web provides quick start framework for web application.
    app/web/statik
    Package statik contains static assets.
    Package statik contains static assets.
    at
    Package at provides annotations for struct, function, or method Package at provides annotations for web RestController Copyright 2018~now John Deng (hi.devops.io@gmail.com).
    Package at provides annotations for struct, function, or method Package at provides annotations for web RestController Copyright 2018~now John Deng (hi.devops.io@gmail.com).
    factory
    Package factory provides hiboot factory interface Package factory provides InstantiateFactory and ConfigurableFactory interface
    Package factory provides hiboot factory interface Package factory provides InstantiateFactory and ConfigurableFactory interface
    factory/autoconfigure
    Package autoconfigure implement ConfigurableFactory
    Package autoconfigure implement ConfigurableFactory
    factory/depends
    Package depends provides dependency resolver for factory
    Package depends provides dependency resolver for factory
    factory/depends/bar
    Package bar is the test package for package depends
    Package bar is the test package for package depends
    factory/depends/fake
    Package fake is the test package for package depends
    Package fake is the test package for package depends
    factory/depends/foo
    Package foo is the test package for package depends
    Package foo is the test package for package depends
    factory/instantiate
    Package instantiate implement InstantiateFactory
    Package instantiate implement InstantiateFactory
    inject
    Package inject implements dependency injection.
    Package inject implements dependency injection.
    log
    Package log provides logging with level debug, info, warn, error, fatal.
    Package log provides logging with level debug, info, warn, error, fatal.
    model
    Package model provides common request and response models.
    Package model provides common request and response models.
    starter
    Package starter provides quick starters for hiboot cli/web application.
    Package starter provides quick starters for hiboot cli/web application.
    starter/actuator
    Package actuator provide the health check endpoint for web application Package controller provide the controller for health check
    Package actuator provide the health check endpoint for web application Package controller provide the controller for health check
    starter/grpc
    Package grpc provides the hiboot starter for injectable grpc client and server dependency
    Package grpc provides the hiboot starter for injectable grpc client and server dependency
    starter/grpc/mockgrpc
    Package mockgrpc is a generated GoMock package.
    Package mockgrpc is a generated GoMock package.
    starter/jaeger
    Package jaeger provides the hiboot starter for injectable jaeger dependency
    Package jaeger provides the hiboot starter for injectable jaeger dependency
    starter/jwt
    Package jwt provides the hiboot starter for injectable jwt dependency
    Package jwt provides the hiboot starter for injectable jwt dependency
    starter/locale
    Package locale provides the hiboot starter for injectable locale (i18n) dependency
    Package locale provides the hiboot starter for injectable locale (i18n) dependency
    starter/logging
    Package logging provides the hiboot starter for injectable logging dependency
    Package logging provides the hiboot starter for injectable logging dependency
    starter/swagger
    package swagger auto serve open api doc with swagger 2.0 annotations
    package swagger auto serve open api doc with swagger 2.0 annotations
    starter/websocket
    Package websocket provides web socket auto configuration for web/cli application
    Package websocket provides web socket auto configuration for web/cli application
    starter/websocket/ws
    Package websocket provides rich websocket support for the iris web framework.
    Package websocket provides rich websocket support for the iris web framework.
    system
    Package system provides system builder which response for properties dependency injection.
    Package system provides system builder which response for properties dependency injection.
    system/types
    Package types provides all const types name
    Package types provides all const types name
    utils
    Package utils provides useful utilities
    Package utils provides useful utilities
    utils/cmap
    Package cmap provides concurrent map
    Package cmap provides concurrent map
    utils/copier
    Package copier provides utility that copy element between structs
    Package copier provides utility that copy element between structs
    utils/crypto
    Package crypto provides crypto encryption/decryption utilities
    Package crypto provides crypto encryption/decryption utilities
    utils/crypto/aes
    Package aes provides aes encryption/decryption utilities
    Package aes provides aes encryption/decryption utilities
    utils/crypto/base64
    Package base64 provides base64 encryption/decryption utilities
    Package base64 provides base64 encryption/decryption utilities
    utils/crypto/md5
    Package md5 provides md5 encryption utilities
    Package md5 provides md5 encryption utilities
    utils/crypto/rsa
    Package rsa provides rsa encryption/decryption utilities
    Package rsa provides rsa encryption/decryption utilities
    utils/gotest
    Package gotest provides function to check whether is running in go test mode.
    Package gotest provides function to check whether is running in go test mode.
    utils/idgen
    Package idgen provides unique id generation utilities that use twitter's snowflake algorithm
    Package idgen provides unique id generation utilities that use twitter's snowflake algorithm
    utils/io
    Package io provides file or directory io utilities.
    Package io provides file or directory io utilities.
    utils/mapstruct
    Package mapstruct provides utilities that decode map and inject values into struct
    Package mapstruct provides utilities that decode map and inject values into struct
    utils/reflector
    Package reflector provides utilities for reflection
    Package reflector provides utilities for reflection
    utils/replacer
    Package replacer provides utilities that replace the reference and environment variables with its value
    Package replacer provides utilities that replace the reference and environment variables with its value
    utils/sort
    Package sort provides utility that sort slice by length
    Package sort provides utility that sort slice by length
    utils/str
    Package str provides enhanced string utilities
    Package str provides enhanced string utilities
    utils/structtag
    package structtag provides struct tag utils (from https://github.com/fatih/structtag)
    package structtag provides struct tag utils (from https://github.com/fatih/structtag)
    utils/validator
    Package validator provides data validation utilities
    Package validator provides data validation utilities