初次理解服务调用

在微服务中,有一个难点就是:如果你想使用各个服务组件,你就得知道不同服务的地址和端口,也就是服务发现。

在传统应用我们是怎么做的?就是在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接口,代码类似:

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

使用命令 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初体验之服务调用的更多相关文章

  1. ASP.NET Core 6框架揭秘实例演示[03]:Dapr初体验

    也许你们可能没有接触过Dapr,但是一定对它"有所耳闻",感觉今年它一下子就火了,一时间很多人都在谈论它.我们从其命名(Dapr的全称是"分布式应用运行时Distribu ...

  2. web api 初体验 解决js调用跨域问题

    跨域界定 常见跨域: 同IP不同端口: http:IP:8001/api/user     http:IP:8002/api/user 不同IP不同端口: http://172.28.20.100:8 ...

  3. Webservice初体验:axis调用wsdl和document解析

    Neo君遇到了需要调用webservice接口的情况,然而作为一只小白对这方面了解困乏,经过摸索,完成了一个小的Demo,记录下. 一:背景 同事给了我一个webservice地址,打开后后缀是&qu ...

  4. SpringCloud初体验:三、Feign 服务间调用(FeignClient)、负载均衡(Ribbon)、容错/降级处理(Hystrix)

    FeignOpenFeign Feign是一种声明式.模板化的HTTP客户端. 看了解释过后,可以理解为他是一种 客户端 配置实现的策略,它实现 服务间调用(FeignClient).负载均衡(Rib ...

  5. 【阿里云产品公测】结构化数据服务OTS之JavaSDK初体验

    [阿里云产品公测]结构化数据服务OTS之JavaSDK初体验 作者:阿里云用户蓝色之鹰 一.OTS简单介绍 OTS 是构建在阿里云飞天分布式系统之上的NoSQL数据库服务,提供海量结构化数据的存储和实 ...

  6. ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)

    早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安 ...

  7. SpringCloud初体验:五、Sidecar 将 PHP 这类非 Java 生态语言的服务接入 Spring Cloud

    先起一个 Sidecar 服务,一个PHP服务一个应用,和PHP服务部署在同一台机子,通过 localhost 访问,这样就解决了网络开销,相当于本地进程间调用 Sidecar 服务比较简单, 1.这 ...

  8. # 初体验之腾讯位置服务彩云天气开发者api

    初体验 最近接触到了boxjs,看到了里面一个比较有意思的彩云天气的脚本,由于自己本身就是彩云天气pro的用户,日常使用过程中感觉到彩云的降雨提醒还是挺方便的,于是就准备开始使用这个天气的脚本. 脚本 ...

  9. 手把手教你学Dapr - 4. 服务调用

    上一篇:手把手教你学Dapr - 3. 使用Dapr运行第一个.Net程序 介绍 通过使用服务调用,您的应用程序可以使用标准的gRPC或HTTP协议与其他应用程序可靠.安全地通信. 为什么不直接用Ht ...

随机推荐

  1. javascriptRemke之原型的重要性

    前言:JavaScript的原型对象一直是新人学习js的一大重大阻碍,但是原型的知识往往又是面试中常常会被深挖的一个点,为什么会这样呢?本文带你揭秘JavaScript原型的重要性,了解重要性之后再进 ...

  2. 【学习转载】MyBatis源码解析——日志记录

    声明:转载自前辈:开心的鱼a1 一 .概述 MyBatis没有提供日志的实现类,需要接入第三方的日志组件,但第三方日志组件都有各自的Log级别,且各不相同,但MyBatis统一提供了trace.deb ...

  3. Spring的JDK动态代理如何实现的(源码解析)

    前言 上一篇文章中提到了SpringAOP是如何决断使用哪种动态代理方式的,本文接上文讲解SpringAOP的JDK动态代理是如何实现的.SpringAOP的实现其实也是使用了Proxy和Invoca ...

  4. NX开发库版本问题

    有做NX二次开发的朋友经常问我这样的问题:我在NX8.0上开发的程序,可以在NX9.0上运行吗? 由于NX的开发库随着版本的更新也会不断更新,会增加新的方法,同时有些也会过时或者消失. 如下图:NX8 ...

  5. 【二食堂】Beta - Scrum Meeting 7

    Scrum Meeting 7 例会时间:5.19 18:30~18:50 进度情况 组员 当前进度 今日任务 李健 1. 文本区域的前后端对接完成,bug已经修复issue2. 自定义关系的添加与删 ...

  6. 「笔记」$Min\_25$筛

    总之我也不知道这个奇怪的名字是怎么来的. \(Min\_25\)筛用来计算一类积性函数前缀和. 如果一个积性函数\(F(x)\)在质数单点是一个可以快速计算的关于此质数的多项式. 那么可以用\(Min ...

  7. 《基于SIRS模型的行人过街违章传播研究》

    My Focus: 行人违章过街 这一行为的传播与控制 Behavior definition in this paper: 人在生活中表现出来的生活态度及具体的生活方式 Title: Researc ...

  8. numpy.zeros()的作用和实操

    numpy.zeros()的作用: 通常是把数组转换成想要的矩阵 numpy.zeros()的使用方法: zeros(shape, dtype=float, order='C') shape:数据尺寸 ...

  9. [CSP-S2021] 回文

    链接: P7915 题意: 给出一个长度为 \(2n\) 的序列 \(a\),其中 \(1\sim n\) 每个数出现了 2 次.有 L,R 两种操作分别是将 \(a\) 的开头或末尾元素加入到初始为 ...

  10. Python NameError: name 'unicode' is not defined

    Python2 的unicode 函数在 Python3 中被命名为 str.在 Python3 中使用 ·str 来代替 Python2 中的 unicode.