像使用本地函数一样使用http

249 阅读1分钟

通过内容寻址的方式,获取接口的唯一hash,这样就可以实现像本地函数一样的使用远程接口。

接口

import { Observable } from 'ims-rxjs';
export abstract class ImsDemo {
  abstract getIndex(name: string): Observable<any>;
  abstract getIndex2(name: string): Observable<any>;
}

nodejs

import { Injectable, Logger } from 'ims-core';
import { of } from 'ims-rxjs';
@Injectable()
export class ImsDemoImplClient extends ImsDemo {
  constructor(public logger: Logger) {
    super();
  }
  getIndex(name: string) {
    this.logger.info(`request ImsDemo getIndex: ${name}`);
    return of({
      demo: 'test',
      name: name,
    });
  }

  getIndex2(name: string) {
    this.logger.info(`request ImsDemo getIndex2: ${name}`);
    return of({
      demo: 'test',
      name: name,
    });
  }
}

// 服务端大体过程
// 1.将ImsDemo提取hash特征,获取服务端地址hash
// 2.实例化接口实例
// 3.注册服务地址
// 4.返回服务处理结果
let instance = new ImsDemoImplClient(logger)
app.use(`/${hash}/:method`,(req,res,next)=>{
    let method = req.params.method;
    let result = instance[method](...req.body);
    res.end(result)
})

客户端

// 1.将ImsDemo提取hash特征,获取服务端地址
// 2.拼接地址`/${hash}/${method}`
// 3.发送请求,请求附带参数是params
// 4.收到回复得到结果
injector.get(ImsDemo).getIndex('ims').subscribe(res=>{
    console.log('http请求结果是',res)
})