Integrating with Golang Apps
In some cases, it can be useful to embed a RoadRunner server inside another GO program. This is often the case in microservice architectures where you may have a mandated GO framework for all the apps. In such cases it might not be possible to run a stock roadrunner instance, and the only choice is to run roadrunner inside the main app framework / program.
Here's an example of how to embed RoadRunner into a Go program with an HTTP handler:
Import RoadRunner library via go get
command into your Go project:
Create an RR instance
Here we use the default list of plugins. The same list of plugin you would get if you were to run rr serve
with a stock roadrunner binary.
You can, however, choose only the plugins you want and add your own private plugins as well:
Passing requests to RoadRunner
Roadrunner can respond to HTTP requests, but also gRPC ones or many more. Because this is all done via plugins that each listen to different types of requests, ports, etc...
So when we talk about passing a request to roadrunner, we're actually talking about passing the request to roadrunner's HTTP plugin. To do this, we need to keep a handle on the http plugin.
The HTTP plugin is itself an http.Handler
so it's now very easy to use it to let roadrunner and PHP handle the request:
Starting & Stopping Embedded Roadrunner
Once everything is ready, we can start the roadrunner instance:
rr.Serve()
will block until it returns an error or nil
if it was stopped gracefully.
To gracefully stop the server, we simply call rr.Stop()
Roadrunner State
When you run roadrunner, it goes through multiple phases of initialization, running, stopping etc... Sometimes it is useful to know about those, be it for debugging, to know if you're ready to accept requests, or if you can gracefully shutdown the main program.
You can call rr.CurrentState()
on your roadrunner instance to retrieve one of the following states:
Additionally, the actual status name can be obtained via rr.CurrentState().String()
.
Last updated