/node-apollo-client

node.js client for Ctrip Apollo written in typescript

Primary LanguageTypeScriptMIT LicenseMIT

node-apollo-client Build Status NPM Version node

node apollo client for Ctrip Apollo

Features:

  1. implement all APIs described in official documentation
  2. high availability by caching configs in local files which simulate JAVA SDK.
  3. written in TypeScript and typing support
  4. naturally async await function calling, no event or callback mixed-in.

client logic and availability

local configs object
  \-+= local cached config files
    \-+= fetch from Apollo DB at once
      \-+= fetch from Apollo cache periodically (default to 5 minutes)
        \-+= subscribe notification and fetch from Apollo DB if release tag changed
          \-+= update local configs by API: refreshConfigs
scene impact configs source
failed to connect apollo at begining x load local configs directly
failed to connect apollo x load cached apollo configs
failed to connect apollo and wish to update configs x update cached configs temporarily
failed to receive notifications x fetch configs periodically from apollo
failed to fetch from apollo cache x subscribe notification and fetch from DB

Usage

install package from npm

npm install node-apollo-client

const Apollo = require('node-apollo-client')

// Instantiate Apollo
const apollo = new Apollo({
  configServerUrl: 'your-config-server-url',
  appId: 'your-app-id',
  cluster: 'default', // [optional] default to `default`
  namespaces: ['application'],  // default to `['application']`, this is the namespaces that you want to use or maintain.
  initialConfigs: {
    application: {  // this is default namespace name
      foo: 'Mars',
      bar: 'Jupiter'
    },
  }, // [optional]
  listenOnNotification: true, // [optional] default to true
  fetchCacheInterval: 5 * 60e3, // [optional] default to 5 minutes. can be customize but 30s or shorter time are not acceptable.
  cachedConfigFilePath: '/tmp' // [optional] cached configs path, default to system's tmp directory, for linux it's basically '/tmp'.
});

// fetch single config
await apollo.fetchConfig({ key: 'foo' });
// return 'Mars'

// fetch multiple configs
await apollo.fetchConfigs({ keys: [ 'foo', 'bar' ] });
// return { foo: 'Mars', bar: 'Jupiter' }

// refresh local configs (merely used when Apollo is unavailable)
apollo.refreshConfigs({ configs: { foo: 'Mercury' } });
// check out key `foo`
await apollo.fetchConfig({ key: 'foo' });
// return { foo: 'Mercury' }

License

MIT