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