You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
4.3 KiB
Markdown
149 lines
4.3 KiB
Markdown
[![Build Status](https://drone.fk.jochum.dev/api/badges/jo-micro/router/status.svg)](https://drone.fk.jochum.dev/jo-micro/router) [![Go Reference](https://pkg.go.dev/badge/jochum.dev/jo-micro/router.svg)](https://pkg.go.dev/jochum.dev/jo-micro/router)
|
|
|
|
# router
|
|
|
|
A dynamic router (API Gatway) for go-micro.
|
|
|
|
It looks for services that host "proto/routerclientpb/routerclientpb.RouterClientService" and ask's them for routes/endpoints, then it registers that endpoints via a proxy method within gin.
|
|
|
|
## Caveats
|
|
|
|
- gin doesn't allow to delete routes, so if you want to delete a route you have to restart go-micro/router.
|
|
|
|
## Usage
|
|
|
|
docker-compose:
|
|
|
|
```yaml
|
|
services:
|
|
router:
|
|
restart: unless-stopped
|
|
image: docker.io/jomicro/router:0.2.3
|
|
environment:
|
|
- MICRO_TRANSPORT=grpc
|
|
- MICRO_REGISTRY=nats
|
|
- MICRO_REGISTRY_ADDRESS=nats:4222
|
|
- MICRO_BROKER=nats
|
|
- MICRO_BROKER_ADDRESS=nats:4222
|
|
- SERVER_ADDRESS=:8080
|
|
- LOG_LEVEL=info
|
|
ports:
|
|
- 8080:8080
|
|
depends_on:
|
|
- nats
|
|
```
|
|
|
|
See [cmd/microrouterd/plugins.go](cmd/microrouterd/plugins.go) for a list of availabel transports, registries and brokers.
|
|
|
|
## Todo
|
|
|
|
- Add (more) examples.
|
|
- Add support for Streams / WebSockets.
|
|
- Add support for [debug](https://github.com/asim/go-micro/tree/master/debug).
|
|
- Maybe add optional support for [auth](https://github.com/asim/go-micro/blob/master/auth/auth.go).
|
|
|
|
## Integration examples
|
|
|
|
Have a look at [internalService](cmd/microrouterd/main.go#L35) or the author's FOSS project [microlobby](https://github.com/pcdummy/microlobby).
|
|
|
|
Here's some code from the microlobby project
|
|
|
|
```go
|
|
import (
|
|
"jochum.dev/jo-micro/router"
|
|
"github.com/urfave/cli/v2"
|
|
"go-micro.dev/v4"
|
|
"wz2100.net/microlobby/shared/proto/authservicepb/v1"
|
|
)
|
|
|
|
func main() {
|
|
service := micro.NewService()
|
|
|
|
service.Init(
|
|
micro.Action(func(c *cli.Context) error {
|
|
s := service.Server()
|
|
r := router.NewHandler(
|
|
config.RouterURI,
|
|
router.NewRoute(
|
|
router.Method(router.MethodGet),
|
|
router.Path("/"),
|
|
router.Endpoint(authservicepb.AuthV1Service.UserList),
|
|
router.Params("limit", "offset"),
|
|
router.AuthRequired(),
|
|
),
|
|
router.NewRoute(
|
|
router.Method(router.MethodPost),
|
|
router.Path("/login"),
|
|
router.Endpoint(authservicepb.AuthV1Service.Login),
|
|
),
|
|
router.NewRoute(
|
|
router.Method(router.MethodPost),
|
|
router.Path("/register"),
|
|
router.Endpoint(authservicepb.AuthV1Service.Register),
|
|
),
|
|
router.NewRoute(
|
|
router.Method(router.MethodPost),
|
|
router.Path("/refresh"),
|
|
router.Endpoint(authservicepb.AuthV1Service.Refresh),
|
|
),
|
|
router.NewRoute(
|
|
router.Method(router.MethodDelete),
|
|
router.Path("/:userId"),
|
|
router.Endpoint(authservicepb.AuthV1Service.UserDelete),
|
|
router.Params("userId"),
|
|
router.AuthRequired(),
|
|
),
|
|
router.NewRoute(
|
|
router.Method(router.MethodGet),
|
|
router.Path("/:userId"),
|
|
router.Endpoint(authservicepb.AuthV1Service.UserDetail),
|
|
router.Params("userId"),
|
|
router.AuthRequired(),
|
|
),
|
|
router.NewRoute(
|
|
router.Method(router.MethodPut),
|
|
router.Path("/:userId/roles"),
|
|
router.Endpoint(authservicepb.AuthV1Service.UserUpdateRoles),
|
|
router.Params("userId"),
|
|
router.AuthRequired(),
|
|
),
|
|
)
|
|
r.RegisterWithServer(s)
|
|
}
|
|
)
|
|
}
|
|
```
|
|
|
|
## Developers corner
|
|
|
|
### Build podman/docker image
|
|
|
|
#### Prerequesits
|
|
|
|
- podman
|
|
- [Task](https://taskfile.dev/#/installation)
|
|
|
|
#### Build
|
|
|
|
```bash
|
|
cp .env.sample .env
|
|
task
|
|
```
|
|
|
|
#### Remove everything
|
|
|
|
```bash
|
|
task rm
|
|
```
|
|
|
|
## Authors
|
|
|
|
- René Jochum - rene@jochum.dev
|
|
|
|
## License
|
|
|
|
Its dual licensed:
|
|
|
|
- Apache-2.0
|
|
- GPL-2.0-or-later
|