diff --git a/README.md b/README.md index cd38b846..1322c246 100644 --- a/README.md +++ b/README.md @@ -43,60 +43,6 @@ Join us to discuss, learn and contribute: By default go-micro only provides a few implementation of each interface at the core but it's completely pluggable. There's already dozens of plugins which are available at [github.com/micro/go-plugins](https://github.com/micro/go-plugins). Contributions are welcome! -## How does it work? - -

- -

- -Go Micro is a framework that addresses the fundamental requirements to write microservices. - -Let's dig into the core components. - -### Registry - -The registry provides a service discovery mechanism to resolve names to addresses. It can be backed by consul, etcd, zookeeper, dns, gossip, etc. -Services should register using the registry on startup and deregister on shutdown. Services can optionally provide an expiry TTL and reregister -on an interval to ensure liveness and that the service is cleaned up if it dies. - -### Selector - -The selector is a load balancing abstraction which builds on the registry. It allows services to be "filtered" using filter functions and "selected" -using a choice of algorithms such as random, roundrobin, leastconn, etc. The selector is leveraged by the Client when making requests. The client -will use the selector rather than the registry as it provides that built in mechanism of load balancing. - -### Transport - -The transport is the interface for synchronous request/response communication between services. It's akin to the golang net package but provides -a higher level abstraction which allows us to switch out communication mechanisms e.g http, rabbitmq, websockets, NATS. The transport also -supports bidirectional streaming. This is powerful for client side push to the server. - -### Broker - -The broker provides an interface to a message broker for asynchronous pub/sub communication. This is one of the fundamental requirements of an event -driven architecture and microservices. By default we use an inbox style point to point HTTP system to minimise the number of dependencies required -to get started. However there are many message broker implementations available in go-plugins e.g RabbitMQ, NATS, NSQ, Google Cloud Pub Sub. - -### Codec - -The codec is used for encoding and decoding messages before transporting them across the wire. This could be json, protobuf, bson, msgpack, etc. -Where this differs from most other codecs is that we actually support the RPC format here as well. So we have JSON-RPC, PROTO-RPC, BSON-RPC, etc. -It separates encoding from the client/server and provides a powerful method for integrating other systems such as gRPC, Vanadium, etc. - -### Server - -The server is the building block for writing a service. Here you can name your service, register request handlers, add middeware, etc. The service -builds on the above packages to provide a unified interface for serving requests. The built in server is an RPC system. In the future there maybe -other implementations. The server also allows you to define multiple codecs to serve different encoded messages. - -### Client - -The client provides an interface to make requests to services. Again like the server, it builds on the other packages to provide a unified interface -for finding services by name using the registry, load balancing using the selector, making synchronous requests with the transport and asynchronous -messaging using the broker. - - -The above components are combined at the top-level of micro as a **Service**. ## Getting Started @@ -276,6 +222,61 @@ go run client.go Hello John ``` +## How does it work? + +

+ +

+ +Go Micro is a framework that addresses the fundamental requirements to write microservices. + +Let's dig into the core components. + +### Registry + +The registry provides a service discovery mechanism to resolve names to addresses. It can be backed by consul, etcd, zookeeper, dns, gossip, etc. +Services should register using the registry on startup and deregister on shutdown. Services can optionally provide an expiry TTL and reregister +on an interval to ensure liveness and that the service is cleaned up if it dies. + +### Selector + +The selector is a load balancing abstraction which builds on the registry. It allows services to be "filtered" using filter functions and "selected" +using a choice of algorithms such as random, roundrobin, leastconn, etc. The selector is leveraged by the Client when making requests. The client +will use the selector rather than the registry as it provides that built in mechanism of load balancing. + +### Transport + +The transport is the interface for synchronous request/response communication between services. It's akin to the golang net package but provides +a higher level abstraction which allows us to switch out communication mechanisms e.g http, rabbitmq, websockets, NATS. The transport also +supports bidirectional streaming. This is powerful for client side push to the server. + +### Broker + +The broker provides an interface to a message broker for asynchronous pub/sub communication. This is one of the fundamental requirements of an event +driven architecture and microservices. By default we use an inbox style point to point HTTP system to minimise the number of dependencies required +to get started. However there are many message broker implementations available in go-plugins e.g RabbitMQ, NATS, NSQ, Google Cloud Pub Sub. + +### Codec + +The codec is used for encoding and decoding messages before transporting them across the wire. This could be json, protobuf, bson, msgpack, etc. +Where this differs from most other codecs is that we actually support the RPC format here as well. So we have JSON-RPC, PROTO-RPC, BSON-RPC, etc. +It separates encoding from the client/server and provides a powerful method for integrating other systems such as gRPC, Vanadium, etc. + +### Server + +The server is the building block for writing a service. Here you can name your service, register request handlers, add middeware, etc. The service +builds on the above packages to provide a unified interface for serving requests. The built in server is an RPC system. In the future there maybe +other implementations. The server also allows you to define multiple codecs to serve different encoded messages. + +### Client + +The client provides an interface to make requests to services. Again like the server, it builds on the other packages to provide a unified interface +for finding services by name using the registry, load balancing using the selector, making synchronous requests with the transport and asynchronous +messaging using the broker. + + +The above components are combined at the top-level of micro as a **Service**. + ## Sponsors