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
Dapr初体验之服务调用的更多相关文章
- ASP.NET Core 6框架揭秘实例演示[03]:Dapr初体验
也许你们可能没有接触过Dapr,但是一定对它"有所耳闻",感觉今年它一下子就火了,一时间很多人都在谈论它.我们从其命名(Dapr的全称是"分布式应用运行时Distribu ...
- web api 初体验 解决js调用跨域问题
跨域界定 常见跨域: 同IP不同端口: http:IP:8001/api/user http:IP:8002/api/user 不同IP不同端口: http://172.28.20.100:8 ...
- Webservice初体验:axis调用wsdl和document解析
Neo君遇到了需要调用webservice接口的情况,然而作为一只小白对这方面了解困乏,经过摸索,完成了一个小的Demo,记录下. 一:背景 同事给了我一个webservice地址,打开后后缀是&qu ...
- SpringCloud初体验:三、Feign 服务间调用(FeignClient)、负载均衡(Ribbon)、容错/降级处理(Hystrix)
FeignOpenFeign Feign是一种声明式.模板化的HTTP客户端. 看了解释过后,可以理解为他是一种 客户端 配置实现的策略,它实现 服务间调用(FeignClient).负载均衡(Rib ...
- 【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验
[阿里云产品公测]结构化数据服务OTS之JavaSDK初体验 作者:阿里云用户蓝色之鹰 一.OTS简单介绍 OTS 是构建在阿里云飞天分布式系统之上的NoSQL数据库服务,提供海量结构化数据的存储和实 ...
- ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)
早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安 ...
- SpringCloud初体验:五、Sidecar 将 PHP 这类非 Java 生态语言的服务接入 Spring Cloud
先起一个 Sidecar 服务,一个PHP服务一个应用,和PHP服务部署在同一台机子,通过 localhost 访问,这样就解决了网络开销,相当于本地进程间调用 Sidecar 服务比较简单, 1.这 ...
- # 初体验之腾讯位置服务彩云天气开发者api
初体验 最近接触到了boxjs,看到了里面一个比较有意思的彩云天气的脚本,由于自己本身就是彩云天气pro的用户,日常使用过程中感觉到彩云的降雨提醒还是挺方便的,于是就准备开始使用这个天气的脚本. 脚本 ...
- 手把手教你学Dapr - 4. 服务调用
上一篇:手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 介绍 通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠.安全地通信. 为什么不直接用Ht ...
随机推荐
- javascriptRemke之原型的重要性
前言:JavaScript的原型对象一直是新人学习js的一大重大阻碍,但是原型的知识往往又是面试中常常会被深挖的一个点,为什么会这样呢?本文带你揭秘JavaScript原型的重要性,了解重要性之后再进 ...
- 【学习转载】MyBatis源码解析——日志记录
声明:转载自前辈:开心的鱼a1 一 .概述 MyBatis没有提供日志的实现类,需要接入第三方的日志组件,但第三方日志组件都有各自的Log级别,且各不相同,但MyBatis统一提供了trace.deb ...
- Spring的JDK动态代理如何实现的(源码解析)
前言 上一篇文章中提到了SpringAOP是如何决断使用哪种动态代理方式的,本文接上文讲解SpringAOP的JDK动态代理是如何实现的.SpringAOP的实现其实也是使用了Proxy和Invoca ...
- NX开发库版本问题
有做NX二次开发的朋友经常问我这样的问题:我在NX8.0上开发的程序,可以在NX9.0上运行吗? 由于NX的开发库随着版本的更新也会不断更新,会增加新的方法,同时有些也会过时或者消失. 如下图:NX8 ...
- 【二食堂】Beta - Scrum Meeting 7
Scrum Meeting 7 例会时间:5.19 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 文本区域的前后端对接完成,bug已经修复issue2. 自定义关系的添加与删 ...
- 「笔记」$Min\_25$筛
总之我也不知道这个奇怪的名字是怎么来的. \(Min\_25\)筛用来计算一类积性函数前缀和. 如果一个积性函数\(F(x)\)在质数单点是一个可以快速计算的关于此质数的多项式. 那么可以用\(Min ...
- 《基于SIRS模型的行人过街违章传播研究》
My Focus: 行人违章过街 这一行为的传播与控制 Behavior definition in this paper: 人在生活中表现出来的生活态度及具体的生活方式 Title: Researc ...
- numpy.zeros()的作用和实操
numpy.zeros()的作用: 通常是把数组转换成想要的矩阵 numpy.zeros()的使用方法: zeros(shape, dtype=float, order='C') shape:数据尺寸 ...
- [CSP-S2021] 回文
链接: P7915 题意: 给出一个长度为 \(2n\) 的序列 \(a\),其中 \(1\sim n\) 每个数出现了 2 次.有 L,R 两种操作分别是将 \(a\) 的开头或末尾元素加入到初始为 ...
- Python NameError: name 'unicode' is not defined
Python2 的unicode 函数在 Python3 中被命名为 str.在 Python3 中使用 ·str 来代替 Python2 中的 unicode.