Dapr初体验之服务调用

初次理解服务调用

在微服务中,有一个难点就是:如果你想使用各个服务组件,你就得知道不同服务的地址和端口,也就是服务发现。
在传统应用我们是怎么做的?就是在web项目里配置上api地址,如下:

在一个web对应一个api的时候,这种方式非常简单并且实用。但是,这不适用微服务项目,在超过三个服务部署的时候,光记住各个服务的地址和端口就给部署带来不小的困难。
于是,微服务框架的服务发现和调用就排上了用场。

Dapr中的服务注册


在上一篇 Dapr初体验之Hello World 我们使用了命令 dapr run --app-id nodeapp --app-port 3000 --dapr-http-port 3500 node app.js 启动了一个nodejs应用。

  • --app-id指定了注册到dapr的应用名称
  • --app-port指定了注册到dapr的应用端口号

Dapr采用边车(Sidecar)方式,在不修改原服务代码的方式,就能通过这两种参数完成服务的注册。

Dapr中的调用逻辑

下图描述了Dapr服务调用是如何工作的
https://docs.dapr.io/developing-applications/building-blocks/service-invocation/service-invocation-overview/

这个是Dapr官方手册服务调用的例子,具体调用步骤大家直接访问连接来阅读,我不在做官方文档的搬运工了。这里,我只提取一下要点信息:

  • 服务A和服务B是两个api服务,通过dapr边车方式进行了服务注册
  • Dapr通过服务A和服务B的--app-id,来确定不同的组件
  • 所有的请求首先到dapr上之后有dapr转发到应用
  • 所以,这些请求都需要使用dapr的api才能完成

Dapr服务调用API

通过Dapr服务调用的api,就可以调用注册到Dapr的服务方法

请求地址

POST/GET/PUT/DELETE http://localhost:<daprPort>/v1.0/invoke/<appId>/method/<method-name>

  • daprPort : dapr服务的端口
  • appId:注册到dapr服务的应用id,也就是 --app-id指定的参数
  • method-name:方法名称

来举个例子
一个api服有get方法请求数据的接口/mydata吗,通过命令dapr run --app-id myapi --app-port 5000 --dapr-http-port 3500 dotnet MyApi.dll注册了到了dapr。
那么你访问http://localhost:3500/v1.0/invoke/myapi/method/mydata 就可以访问到这个api的接口。

写个实例

利用官方quickstarts库中的hello-world项目,增加一get接口,代码类似:

app.get('/test',(_req, res)=>{
    return res.status(200).send({message: 'server 1'});;
});

使用命令 dapr run --app-id nodeapp --app-port 3000 node app.js启动应用,那么使用dapr访问此应用的接口就应该是http://localhost:3500/v1.0/invoke/nodeapp/method/test
使用postman访问如下图所示:

总结

这次我们简单体验了一下Dapr中服务发现和调用。通过Dapr边车(sidecar)方式,我们在不修改原项目代码的情况下部署项目。通过这种方式,我们有很多优势:

  • 无感知的进行服务发现和调用,向其他服务提供了一种友好的接口调用方式
  • 通过阅读dapr文档,dapr能够友好的为我们提供服务间安全性、接口重试、mDNS轮训负载均衡和接口调用追踪等高级功能

https://docs.dapr.io/zh-hans/developing-applications/building-blocks/service-invocation/service-invocation-overview/
https://github.com/dapr/quickstarts

posted @ 2021-11-24 11:57  蓝曈魅  阅读(1328)  评论(2编辑  收藏  举报