MarginaliaSearch/code/common/service/readme.md
Viktor Lofgren 0307c55f9f (refac) Zookeeper for service-discovery, kill service-client lib (WIP)
To avoid having to either hard-code or manually configure service addresses (possibly several dozen), and to reduce the project's dependency on docker to deal with routing and discovery, the option to use [Zookeeper](https://zookeeper.apache.org/) to manage services and discovery has been added.

A service registry interface was added, with a Zookeeper implementation and a basic implementation that only works on docker and hard-codes everything.

The last remaining REST service, the assistant-service, has been migrated to gRPC.

This also proved a good time to clear out primordial technical debt from the root of the codebase.  The 'service-client' library has been taken behind the barn and given a last farewell.  It's replaced by a small library for managing gRPC channels.

Since it's no longer used by anything, RxJava has been removed as a dependency from the project.

Although the current state seems reasonably stable, this is a work-in-progress commit.
2024-02-20 11:41:14 +01:00

1.5 KiB

Service

Contains the base classes for the services. This is where port configuration, and common endpoints are set up.

Creating a new Service

The minimal service needs a MainClass and a Service class.

For proper initiation, the main class should look like this:

public class FoobarMain extends MainClass {

    @Inject
    public FoobarMain(FoobarService service) {}

    public static void main(String... args) {
        init(ServiceId.Foobar, args);

        Injector injector = Guice.createInjector(
                new FoobarModule(), /* optional custom bindings go here */
                new DatabaseModule(),
                new ConfigurationModule(ServiceId.Foobar));

        injector.getInstance(FoobarMain.class);
        
        // set the service as ready so that delayed tasks can be started
        injector.getInstance(Initialization.class).setReady();
    }
}

A service class has a boilerplate set-up that looks like this:

@Singleton
public class FoobarService extends Service {

    @Inject
    public FoobarService(BaseServiceParams params) {
        super(params);
        
        // set up Spark endpoints here
    }
}

Further the new service needs to be added to the ServiceId enum in service-discovery.

Central Classes