2024-06-04 22:40:43 +02:00
|
|
|
# Go Micro [![Go.Dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&logoColor=white&style=flat-square)](https://pkg.go.dev/go-micro.dev/v5?tab=doc) [![Go Report Card](https://goreportcard.com/badge/github.com/go-micro/go-micro)](https://goreportcard.com/report/github.com/go-micro/go-micro)
|
2015-01-14 01:31:27 +02:00
|
|
|
|
2020-04-13 23:15:21 +02:00
|
|
|
Go Micro is a framework for distributed systems development.
|
2016-06-20 03:52:38 +02:00
|
|
|
|
2018-11-27 21:43:57 +02:00
|
|
|
## Overview
|
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
Go Micro provides the core requirements for distributed systems development including RPC and Event driven communication.
|
2022-01-17 15:35:01 +02:00
|
|
|
The Go Micro philosophy is sane defaults with a pluggable architecture. We provide defaults to get you started quickly
|
2021-12-29 05:01:40 +02:00
|
|
|
but everything can be easily swapped out.
|
2018-11-27 21:43:57 +02:00
|
|
|
|
2016-12-07 18:54:19 +02:00
|
|
|
## Features
|
2016-07-03 03:49:13 +02:00
|
|
|
|
2017-06-15 20:57:27 +02:00
|
|
|
Go Micro abstracts away the details of distributed systems. Here are the main features.
|
2016-07-03 03:49:13 +02:00
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
- **Authentication** - Auth is built in as a first class citizen. Authentication and authorization enable secure
|
|
|
|
zero trust networking by providing every service an identity and certificates. This additionally includes rule
|
|
|
|
based access control.
|
2020-05-31 12:26:46 +02:00
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
- **Dynamic Config** - Load and hot reload dynamic config from anywhere. The config interface provides a way to load application
|
|
|
|
level config from any source such as env vars, file, etcd. You can merge the sources and even define fallbacks.
|
2020-05-31 12:26:46 +02:00
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
- **Data Storage** - A simple data store interface to read, write and delete records. It includes support for memory, file and
|
|
|
|
CockroachDB by default. State and persistence becomes a core requirement beyond prototyping and Micro looks to build that into the framework.
|
2020-05-31 12:26:46 +02:00
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
- **Service Discovery** - Automatic service registration and name resolution. Service discovery is at the core of micro service
|
|
|
|
development. When service A needs to speak to service B it needs the location of that service. The default discovery mechanism is
|
|
|
|
multicast DNS (mdns), a zeroconf system.
|
2018-12-02 15:23:46 +02:00
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
- **Load Balancing** - Client side load balancing built on service discovery. Once we have the addresses of any number of instances
|
|
|
|
of a service we now need a way to decide which node to route to. We use random hashed load balancing to provide even distribution
|
|
|
|
across the services and retry a different node if there's a problem.
|
2018-12-02 15:23:46 +02:00
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
- **Message Encoding** - Dynamic message encoding based on content-type. The client and server will use codecs along with content-type
|
|
|
|
to seamlessly encode and decode Go types for you. Any variety of messages could be encoded and sent from different clients. The client
|
|
|
|
and server handle this by default. This includes protobuf and json by default.
|
2018-12-02 15:23:46 +02:00
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
- **RPC Client/Server** - RPC based request/response with support for bidirectional streaming. We provide an abstraction for synchronous
|
|
|
|
communication. A request made to a service will be automatically resolved, load balanced, dialled and streamed.
|
2018-12-02 15:23:46 +02:00
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
- **Async Messaging** - PubSub is built in as a first class citizen for asynchronous communication and event driven architectures.
|
|
|
|
Event notifications are a core pattern in micro service development. The default messaging system is a HTTP event message broker.
|
2018-11-27 21:43:57 +02:00
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
- **Event Streaming** - PubSub is great for async notifications but for more advanced use cases event streaming is preferred. Offering
|
|
|
|
persistent storage, consuming from offsets and acking. Go Micro includes support for NATS Jetstream and Redis streams.
|
2021-11-08 11:03:37 +02:00
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
- **Synchronization** - Distributed systems are often built in an eventually consistent manner. Support for distributed locking and
|
|
|
|
leadership are built in as a Sync interface. When using an eventually consistent database or scheduling use the Sync interface.
|
2020-05-31 12:21:55 +02:00
|
|
|
|
2021-12-29 05:01:40 +02:00
|
|
|
- **Pluggable Interfaces** - Go Micro makes use of Go interfaces for each distributed system abstraction. Because of this these interfaces
|
|
|
|
are pluggable and allows Go Micro to be runtime agnostic. You can plugin any underlying technology.
|
2018-12-02 15:26:38 +02:00
|
|
|
|
2018-11-14 17:18:13 +02:00
|
|
|
## Getting Started
|
2017-02-10 14:36:42 +02:00
|
|
|
|
2023-04-12 12:09:40 +02:00
|
|
|
To make use of Go Micro import it
|
2020-04-19 01:44:52 +02:00
|
|
|
|
2020-04-19 01:45:29 +02:00
|
|
|
```golang
|
2024-06-04 22:40:43 +02:00
|
|
|
import "go-micro.dev/v5"
|
2023-04-12 12:09:40 +02:00
|
|
|
```
|
|
|
|
|
|
|
|
Define a handler (protobuf is optionally supported - see [example](https://github.com/go-micro/examples/blob/main/helloworld/main.go))
|
|
|
|
|
2023-04-12 12:09:56 +02:00
|
|
|
```golang
|
2023-04-12 12:09:40 +02:00
|
|
|
type Request struct {
|
|
|
|
Name string `json:"name"`
|
|
|
|
}
|
|
|
|
|
|
|
|
type Response struct {
|
|
|
|
Message string `json:"message"`
|
|
|
|
}
|
2020-05-31 12:27:54 +02:00
|
|
|
|
2023-04-12 12:09:40 +02:00
|
|
|
type Helloworld struct{}
|
|
|
|
|
|
|
|
func (h *Helloworld) Greeting(ctx context.Context, req *Request, rsp *Response) error {
|
|
|
|
rsp.Message = "Hello " + req.Name
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Create, initialise and run the service
|
|
|
|
|
|
|
|
```golang
|
2020-05-31 12:28:32 +02:00
|
|
|
// create a new service
|
2020-05-31 12:27:54 +02:00
|
|
|
service := micro.NewService(
|
|
|
|
micro.Name("helloworld"),
|
2023-04-12 12:09:40 +02:00
|
|
|
micro.Handle(new(Helloworld)),
|
2020-05-31 12:27:54 +02:00
|
|
|
)
|
|
|
|
|
2020-05-31 12:28:32 +02:00
|
|
|
// initialise flags
|
2020-05-31 12:27:54 +02:00
|
|
|
service.Init()
|
|
|
|
|
2020-05-31 12:28:32 +02:00
|
|
|
// start the service
|
2020-05-31 12:27:54 +02:00
|
|
|
service.Run()
|
2020-04-19 01:44:52 +02:00
|
|
|
```
|
|
|
|
|
2023-04-12 12:09:40 +02:00
|
|
|
Optionally set fixed address
|
|
|
|
|
|
|
|
```golang
|
|
|
|
service := micro.NewService(
|
|
|
|
// set address
|
2023-07-16 13:02:53 +02:00
|
|
|
micro.Address(":8080"),
|
2023-04-12 12:09:40 +02:00
|
|
|
)
|
|
|
|
```
|
|
|
|
|
|
|
|
Call it via curl
|
|
|
|
|
|
|
|
```
|
|
|
|
curl -XPOST \
|
|
|
|
-H 'Content-Type: application/json' \
|
|
|
|
-H 'Micro-Endpoint: Helloworld.Greeting' \
|
|
|
|
-d '{"name": "alice"}' \
|
|
|
|
http://localhost:8080
|
|
|
|
```
|
|
|
|
|
2022-04-07 12:44:47 +02:00
|
|
|
See the [examples](https://github.com/go-micro/examples) for detailed information on usage.
|
2021-08-31 10:27:36 +02:00
|
|
|
|
2022-07-23 12:25:07 +02:00
|
|
|
## Toolkit
|
2020-12-26 17:32:45 +02:00
|
|
|
|
2022-07-20 11:12:05 +02:00
|
|
|
See [github.com/go-micro](https://github.com/go-micro) for tooling.
|
2021-09-22 14:37:07 +02:00
|
|
|
|
2022-07-20 11:34:27 +02:00
|
|
|
- [API](https://github.com/go-micro/api)
|
2022-07-11 16:41:03 +02:00
|
|
|
- [CLI](https://github.com/go-micro/cli)
|
2022-07-02 09:44:32 +02:00
|
|
|
- [Demo](https://github.com/go-micro/demo)
|
2022-04-07 12:44:47 +02:00
|
|
|
- [Plugins](https://github.com/go-micro/plugins)
|
|
|
|
- [Examples](https://github.com/go-micro/examples)
|
|
|
|
- [Dashboard](https://github.com/go-micro/dashboard)
|
2022-07-11 10:11:59 +02:00
|
|
|
- [Generator](https://github.com/go-micro/generator)
|
2021-09-22 14:37:07 +02:00
|
|
|
|
2020-04-19 01:46:33 +02:00
|
|
|
## License
|
|
|
|
|
2024-06-04 22:40:43 +02:00
|
|
|
[Business Source License 1.1](LICENSE)
|
2024-06-05 19:28:17 +02:00
|
|
|
|
|
|
|
Purchase a license through the [Github Sponsorship Page](https://github.com/sponsors/go-micro)
|