如果说Actor是dapr有状态服务的内部体现的话,那绑定应该是dapr对serverless这部分的体现了。我们可以通过绑定极大的扩展应用的能力,甚至未来会成为serverless的基础。最开始接触dapr的时候,会在其官方首页看到这么一句话“Dapr is a portable, serverless, event-driven runtime ” 一个可移植的,服务器的,事件驱动的运行时。可移植很容易理解,事件驱动也有所体现。那这个无服务器(serverless)呢?今天我们就讲讲dapr是如何serverless的。

目录:

一、通过Dapr实现一个简单的基于.net的微服务电商系统

二、通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

三、通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr

四、通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理

通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务

通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流

通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪

通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权

通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权-百度版

附录:(如果你觉得对你有用,请给个star)
一、电商Demo地址:https://github.com/sd797994/Oxygen-Dapr.EshopSample

二、通讯框架地址:https://github.com/sd797994/Oxygen-Dapr

  serverless还是有必要提两嘴,知道的同学可以直接略过。直接翻开CNCF对serverless的定义:“Serverless 是指构建和运行不需要服务器管理的应用程序的概念”,这个概念说起来非常的大哈,实际上根据各家云平台提供的serverless服务来看,其主要作用是将开发者的应用程序和服务器操作系统环境进行了隔离,让开发人员不再关心服务器(而不是完全不需要服务器!),只需要通过云函数的方式编写特定的业务代码即可对外提供服务。每一个函数会被编译成一个容器镜像,当外部请求过来时Serverless会激活这个函数运行我们的镜像实例,当请求量激增时,Serverless会帮我们横向扩容多个实例来抗住请求。当一段时间没有请求后,Serverless又会帮我们逐步缩容云函数实例直到实例变为0。这样当没有请求时的大部分时间里云服务商不会收取你的CPU/内存/网络的费用,仅仅收取一个磁盘费用(托管云函数镜像需要)。这里面涉及到两个问题,一个是云函数的扩容/缩容机制,一个就是云函数本身如何调用其他服务比如我要持久化数据/发送邮件/写短信/订阅?在各家云商提供的Serverless架构里,扩容缩容自然是通过k8s来实现的,而调用外部服务则被封装成了自家的云服务(比如阿里云可以调用RDS读写数据库。调用OSS读写对象,相应的自家的Serverless架构都提供了相关函数的功能)。

  那Dapr如何实现Serverless的呢?但凡熟悉k8s的同学应该对自动化扩容、缩容这部分比较容易理解,其基于k8s的HPA机制运作,dapr通过对KEDA集成实现了这部分的功能,不过这不是今天我们要讲的重点。另外一个问题,云函数如何调用外部服务?这就是今天我们要讲的重点——绑定机制的实现。dapr的绑定提供了非常多的外部组件访问支持,访问这个列表可以查询具体的支持情况,随着dapr的逐步迭代我相信这个列表还会逐步增加最终将覆盖主流的大部分我们会用到的服务组件。这样最终我们将无需和某个云服务商的Serverless做技术绑定,只需要dapr即可实现Serverless!而我们的应用程序将会变得非常轻量级,几乎不需要集成特定组件sdk(比如数据库访问sdk、sms短信sdk、ios消息推送sdk等等等等)。只需要提供一个对外服务的restapi,内部完成业务操作后其余的部分交给dapr帮我们完成即可。

  今天就来看看我们通过dapr是如何完成对数据库访问的,这里依然使用我们的eshop进行举例,在eshop中我们试着访问我们的用户数据库的Account表。首先我们需要创建一个bingding类型的component,比较简单只需要申明这是一个bindings.postgres的Component,包含一个链接字符串指向我们的infrastructure下的postgres这个k8s service。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:name: accountpostgresnamespace: dapreshop
spec:type: bindings.postgresversion: v1metadata:- name: urlvalue: user=postgres password=Mytestpwd#123 host=postgres.infrastructure port=5432 dbname=AccountDb sslmode=disable

  接着我们编写代码来实现对该component进行访问,通过查询Account获取用户信息并打印到postman中

  首先我们实现一个简单的http请求用于查询我们的绑定服务:

    public class HttpHelper{private static async Task<string> GetResultAsync(string componentName, string sql){var req = new HttpRequestMessage(HttpMethod.Post, $"http://localhost:3500/v1.0/bindings/{componentName}");req.Content = new StringContent(JsonSerializer.Serialize(new { operation = "query", metadata = new { sql = sql } }));var resp = await new HttpClient().SendAsync(req);if (resp.IsSuccessStatusCode){var result = await resp.Content.ReadAsStringAsync();return result;}elsethrow new NotSupportedException($"component无效或不支持的sql查询语句");}public static async Task<List<T>> GetResultAsync<T>(string componentName, string sql) where T:class{var str = await GetResultAsync(componentName, sql);var obj = JsonSerializer.Deserialize<List<object>>(str);var result = new List<T>();foreach (JsonElement item in obj){result.Add(AccountConvetor(item) as T);}return result;}static Infrastructure.PersistenceObject.Account AccountConvetor(JsonElement item){var t = new Infrastructure.PersistenceObject.Account();t.Id = Guid.Empty;//由于不知名的原因uuid的键读取出来的值并不是uuid而是一个数组t.LoginName = item[1].GetString();t.Password = item[2].GetString();t.NickName = item[3].GetString();t.State = (Domain.Enums.AccountState)item[4].GetInt32();return t;}}

  接着在AccountQueryService中创建一个GetAccountListByDapr用于暴露该服务到外部:

        [AuthenticationFilter(false)]public async Task<ApiResult> GetAccountListByDapr(){var result = await HttpHelper.GetResultAsync<Infrastructure.PersistenceObject.Account>("accountpostgres", "select * from public.\"Account\"");return ApiResult.Ok(result);}

  然后我们通过postman发起一个访问:

  可以看到成功的通过httpclient调用dapr获取到了数据库里的数据。这里还有些小的问题比如我的id是一个uuid格式,通过dapr读取出来变成了一个数组,还不知道是什么原因。不过大体思路就是这样了,至少目前通过dapr可以和阿里云oss、ios消息推送、mysql、kafka、mqtt、postgresql、rabbitmq、redis等等等等我们常用的耳熟能详的服务/组件进行集成,而你唯一需要关心的只是通过访问dapr的api来发送操作/获取数据仅此而已,dapr将组件集成的复杂度从应用层面迁移后,对于开发者来讲通过dapr要实现一个serverless至少从技术层面来看已经没有多少阻碍了。好了,今天的分享就到这里~

相关文章:

  • Dapr能否引领云原生中间件的未来?

  • 云原生 | 阿里巴巴的Dapr实践与探索

  • Dapr | 云原生的抽象与实现

  • Dapr 可视化指南

  • Dapr 知多少 | 分布式应用运行时

  • Dapr 正式发布 1.0

  • Dapr 交通流量控制示例

  • Dapr是如何简化微服务的开发和部署

  • 微软开源微服务运行时Dapr,赋能云原生应用开发

  • YARP实现Dapr服务调用的反向代理

  • Dapr微服务应用开发系列0:概述

  • Dapr微服务应用开发系列1:环境配置

  • Dapr微服务应用开发系列2:Hello World与SDK初接触

  • Dapr微服务应用开发系列3:服务调用构件块

  • Dapr微服务应用开发系列4:状态管理构件块

  • Dapr微服务应用开发系列5:发布订阅构建块

  • Windows环境下Dapr入门

  • 云原生 | .NET 5 with Dapr 初体验

  • 通过Dapr实现一个简单的基于.net的微服务电商系统

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权

  • 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权-百度版

  • WebAssembly + Dapr = 下一代云原生运行时?

  • dapr 应用开发 | 环境配置

  • 乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时

  • Dapr案例之高德 Serverless 平台建设及实践

通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定...相关推荐

  1. 通过Dapr实现一个简单的基于.net的微服务电商系统(十九)——分布式事务之Saga模式...

    目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务 ...

  2. 通过Dapr实现一个简单的基于.net的微服务电商系统(十八)——服务保护之多级缓存...

    很久没有更新dapr系列了.今天带来的是一个小的组件集成,通过多级缓存框架来实现对服务的缓存保护,依旧是一个简易的演示以及对其设计原理思路的讲解,欢迎大家转发留言和star 目录: 一.通过Dapr实 ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(十六)——dapr+sentinel中间件实现服务保护...

    dapr目前更新到了1.2版本,在之前4月份的时候来自阿里的开发工程师发起了一个dapr集成Alibaba Sentinel的提案,很快被社区加入到了1.2的里程碑中并且在1.2 release 相关 ...

  4. 通过Dapr实现一个简单的基于.net的微服务电商系统(十二)——istio+dapr构建多运行时服务网格...

    多运行时是一个非常新的概念.在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华.那到 ...

  5. 通过Dapr实现一个简单的基于.net的微服务电商系统(十七)——服务保护之动态配置与热重载...

    在上一篇文章里,我们通过注入sentinel component到apigateway实现了对下游服务的保护,不过受限于目前变更component需要人工的重新注入配置以及重启应用更新componen ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...

    上一篇我们讲到了dapr提供的bindings,通过绑定可以让我们的程序轻装上阵,在极端情况下几乎不需要集成任何sdk,仅需要通过httpclient+text.json即可完成对外部组件的调用,这样 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权-百度版...

    目录: 一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务 ...

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(九)——一步一步教你如何撸Dapr之OAuth2授权...

    Oauth2授权,熟悉微信开发的同学对这个东西应该不陌生吧.当我们的应用系统需要集成第三方授权时一般都会做oauth集成,今天就来看看在Dapr的语境下我们如何仅通过配置无需修改应用程序的方式让第三方 ...

  9. 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪

    Dapr提供了一些开箱即用的分布式链路追踪解决方案,今天我们来讲一讲如何通过dapr的configuration来实现非侵入式链路追踪的 目录: 一.通过Dapr实现一个简单的基于.net的微服务电商 ...

最新文章

  1. tomcat安全机制j_security_check(简单版)
  2. 剑指offer之树的子结构
  3. Android之DrawText详解
  4. opencv-api getAffineTransform()
  5. 大数据分析为啥越来越重要
  6. 服务器虚拟机镜像怎么设置ip,风云OL虚拟机镜像一键服务端+配套客户端+启动教程+GM命令+IP修改等...
  7. SPSS统计术语与思维【SPSS 002期】
  8. 插件合并css,Yii安装EClientScript插件扩展实现css,js文件代码压缩合并加载功能
  9. java编程自学app_Java编程自学软件
  10. 控制系统分析与设计(一):控制系统分类及建模
  11. NB-IoT 基于蜂窝的窄带物联网
  12. 小程序 实名信息_公告丨DUNK PLUS 小程序实名认证开启
  13. helper java_Helper 类在Java和C++中的设计
  14. android降低屏幕分辨率,让游戏更尽兴 手动调低Android手机屏幕分辨率
  15. 父亲有过目不忘的本事
  16. 如何让梯形变成平行四边形_把梯形转化成平行四边形.ppt
  17. jQuery菜鸟教程03
  18. 深度:老年旅游市场迎来转折点,50/60新老年消费升级带来结构性创新机会—营销/产品/运营
  19. 主板aspm关闭_主板ASpm功能是什么模式
  20. 怎么使用PS一键抠图?

热门文章

  1. java 友元_C++ 友元函数 | 菜鸟教程
  2. Laravel 5 多个视图共享数据的方法
  3. 【codevs1230】元素查找
  4. 查看linux版本的三种常用方法
  5. C#字符串、字节数组和内存流间的相互转换 - IT浪潮之巅
  6. FFT算法的完整DSP实现(转)
  7. WinXP中鲜为人知的28项隐藏功能
  8. 北京科技计算机与通信工程学院,北京科技大学计算机与通信工程学院-任超
  9. android 小黄车首页,android采用MVP漫画APP、适配刘海屏、小黄车主界面、录音波浪动画、综合APP等源码...
  10. 从Boxee的Amie Street访问音乐