Skip to content

Service Provider

APP 的开发者可在应用的 Chart 中配置 ProviderRegistry 或者请求调用其他 Provider 的权限。

申明 Provider

yaml
apiVersion: sys.bytetrade.io/v1alpha1
kind: ProviderRegistry
metadata:
  # provider 名称,需要加入namespace,避免重复
  name: provider-{{ .Release.Namespace }}

  # provider registry需要安装到user-system下面
  namespace: user-system-{{ .Values.bfl.username}}
spec:
  version: v2   # 最新版本是 v2,系统同时兼容 v1 版本

  # provider 的 dataType。建议加上 app name 避免重复
  dataType: legacy_{{ .Release.Name }}
  deployment: {{ .Release.Name }}
  description: {{ .Release.Name }} legacy api v2

  # provider 可访问的服务。格式通常为 <appServiceName>.<appNameSpace>:<servicePort>
  endpoint: {{ .Release.Name }}-svc.{{ .Release.Namespace }}:1234

  # provider 的组名。建议加上 app name 避免重复
  group: api.{{ .Release.Name }}
  kind: provider
  namespace: "{{ .Release.Namespace }}"
  opApis:
    # API 的名称
    - name: AppApi
      # API 的 URL
      uri: /api  
status:
  state: active

申请 Provider 的访问权限

可在 OlaresManifest.yaml 中配置:

Yaml
sysData:
- appName: providerapp  # API provider 的 app name。ProviderRegistry v2 版本必填 
  port: 8888  # provider service 的端口号

  # provider 的默认域名格式为 <appName>-svc.<appName>-<username>:<port>。如果 service name 和 app namespace 不是默认格式,可以在以下字段中指定 
  svc: app-svc  # service 名称。ProviderRegistry v2 版本可选
  namespace: ns # app 的 namespace。ProviderRegistry v2版本可选

  version: v2   # ProviderRegistry 的版本
  dataType: legacy_{{ .Release.Name }}  # ProviderRegistry 中定义的 dataType
  group: api.{{ .Release.Name }}   # ProviderRegistry 中定义的组名
  ops:
  - AppApi   # ProviderRegistry 中定义的 opApis 名称

配置完成后,您可以将访问密钥(access key)和访问密钥(access secret)添加到应用 chart 的模板中。它们将在安装过程中被注入以供授权使用。

yaml
env:
  - name: OS_SYSTEM_SERVER
    value: system-server.user-system-{{ .Values.bfl.username }}
  - name: OS_APP_SECRET

    # 应用名称在应用 chart 中定义
    value: "{{ .Values.os.<appnane>.appSecret }}"
  - name: OS_APP_KEY
    value: "{{ .Values.os.<appname>.appKey }}"

你可以在代码中使用这三个环境变量来调用 Provider。以 curl 为例:

  1. 获取 access token,有效时间 5 分钟。token 加密算法:bcrypt(app key timestamp app secret) 。默认成本值为 10。

    sh
    now=$(date +%s)
    token=$(htpasswd -nbBC 10 USER "${OS_APP_KEY}${now}${OS_APP_SECRET}"|awk -F":" '{print $2}')
    
    curl -X POST http://${OS_SYSTEM_SERVER}/permission/v1alpha1/access -H "content-type: application/json" \
      -d "{ \
      \"app_key\": \"${OS_APP_KEY}\",         \
      \"timestamp\": ${now},                  \
      \"token\": \"${token}\",                \
      \"perm\": {                             \
          \"group\": \"service.bfl\",         \
          \"dataType\": \"app\",              \
          \"version\": \"v1\",                \
          \"ops\": [                          \
          \"InstallDevApp\"                   \
          ]                                   \
      }                                       \
    }'
  2. 系统将返回:

    json
    {
      "code": 0,
      "message": "success",
      "data": {
        "access_token": "JDJ5JDEwJE5Wbk9vbFpoLjJlSGxhUUpRY1IwRmVZVjFBWmUxUi5LOXNuQWJmVjRnN29xNWVVaFhPWmV5"
      }
    }
  3. 你可以用返回的 token 去调用 provider 的接口:

    sh
    # 地址格式 http://${OS_SYSTEM_SERVER}/system-server/v1alpha1/<dataType>/<group>/<version>/<op>
    curl http://${OS_SYSTEM_SERVER}/system-server/v1alpha1/app/service.bfl/v1/InstallDevApp \
      -H "content-type: application/json" \
      -H "X-Access-Token: ${access_token}"  \
      -d '{"data":"post to provider"}'