@Override
    public void start() throws ModuleStartException {
        grpcServer.addHandler(new RemoteServiceHandler(getManager()));
        grpcServer.addHandler(new HealthCheckServiceHandler());
        grpcServer.addInterceptor(WatermarkGRPCInterceptor.INSTANCE);

        endpointNameGrouping.prepareForHTTPUrlRecognition(
            getService(MetadataQueryService.class),
            moduleConfig.getSyncPeriodHttpUriRecognitionPattern(),
            moduleConfig.getTrainingPeriodHttpUriRecognitionPattern(),
            moduleConfig.getMaxHttpUrisNumberPerService()
        );

        // Disable OAL script has higher priority
        oalEngineLoaderService.load(DisableOALDefine.INSTANCE);

        try {
            receiver.scan();
            annotationScan.scan();
        } catch (IOException | IllegalAccessException | InstantiationException | StorageException e) {
            throw new ModuleStartException(e.getMessage(), e);
        }

        Address gRPCServerInstanceAddress = new Address(moduleConfig.getGRPCHost(), moduleConfig.getGRPCPort(), true);
        TelemetryRelatedContext.INSTANCE.setId(gRPCServerInstanceAddress.toString());
        ClusterCoordinator coordinator = this.getManager()
                                             .find(ClusterModule.NAME)
                                             .provider()
                                             .getService(ClusterCoordinator.class);
        coordinator.registerWatcher(remoteClientManager);
        coordinator.start();
        if (CoreModuleConfig.Role.Mixed.name()
                                       .equalsIgnoreCase(
                                           moduleConfig.getRole())
            || CoreModuleConfig.Role.Aggregator.name()
                                               .equalsIgnoreCase(
                                                   moduleConfig.getRole())) {
            RemoteInstance gRPCServerInstance = new RemoteInstance(gRPCServerInstanceAddress);
            coordinator.registerRemote(gRPCServerInstance);
        }

        OAPNodeChecker.setROLE(CoreModuleConfig.Role.fromName(moduleConfig.getRole()));

        DynamicConfigurationService dynamicConfigurationService = getManager().find(ConfigurationModule.NAME)
                                                                              .provider()
                                                                              .getService(
                                                                                  DynamicConfigurationService.class);
        dynamicConfigurationService.registerConfigChangeWatcher(apdexThresholdConfig);
        dynamicConfigurationService.registerConfigChangeWatcher(endpointNameGroupingRuleWatcher);
        dynamicConfigurationService.registerConfigChangeWatcher(loggingConfigWatcher);
        if (moduleConfig.isEnableEndpointNameGroupingByOpenapi()) {
            dynamicConfigurationService.registerConfigChangeWatcher(endpointNameGroupingRule4OpenapiWatcher);
        }
        dynamicConfigurationService.registerConfigChangeWatcher(moduleConfig.getSearchableTracesTagsWatcher());
    }
Core module provider includes the recommended and default implementations of {@link CoreModule#services()}. All
services with these default implementations are widely used including data receiver, data analysis, streaming
process, storage and query.
<p>
NOTICE: In our experience, no one should re-implement the core module service implementations, unless they are very
familiar with all mechanisms of SkyWalking.
oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/CoreModuleProvider.java