[原创]Dapr入门教程之一:Dapr初识
Dapr(Distributed Application Runtime)是微软于2019年10月16日首次发布的分布式程序运行时,到现在已经过去1年多,从最初的v0.1.0到现在的v1.0.0-rc2,加入了好多新的功能。支持的中间件越来越多,基本上主流的中间件(本地版和各云提供商的托管版)都可以被支持。Dapr运行时也从原来的只支持单Instance变成了v1.0.0-rc1以后的支持多Instance(HA mode)。让我们一起进入精彩的Dapr的世界。
Dapr是什么?
参考Dapr官方网站,"An event-driven, portable runtime for building microservices on cloud and edge",或者复杂点说,"Dapr is a portable, event-driven runtime that makes it easy for any developer to build resilient, stateless and stateful applications that run on the cloud and edge and embraces the diversity of languages and developer frameworks"。翻译过来就是,"Dapr是一个在云和边缘构建微服务用的事件驱动的,可移植的运行时"。更复杂的来说,"Dapr是一个可移植的,事件驱动的运行时,使开发人员可以轻松创建在云和边缘上运行的有弹性,无状态和有状态的应用程序,支持语言和开发人员框架的多样性"。听起来让人一头雾水,让我解释一下它到底是什么意思。
分布式程序(Distributed Application)指的是什么?
- 跟微服务是一个意思。大的系统分成彼此独立的小的模块,模块和模块之间通过API互相通信,这样每个模块可以用不同的语言开发,一个模块升级的时候不会影响到别的模块。
云和边缘(cloud and edge)指的是什么?
- 这里的云和边缘指的是Dapr的App可以跑在AWS,Azure,GCP等云服务器上,也可以跑在本地的服务器上。
事件驱动(event-driven)指的是什么?
- 可以理解成Dapr在没有监听(Listening)到请求到来的时候会一直处于待机的状态,什么也不做,只有监听到请求事件来了才开始处理。
可移植(portable)指的是什么?
- 就是说写的程序和运行的环境,用的中间件无关。比如说原来跑在AWS上,现在想跑在Azure上,Nosql数据库原来用DynamoDB,现在想用CosmosDB,消息中间件原来用SNS/SQS,现在想用Service Bus,没问题,只要在Dapr设定这边做一下切换,程序无需改动。
运行时(runtime)指的是什么?
- 运行时指的是Dapr的运行环境。Dapr的Control Plane(不知道怎么翻译,直接用英文,就是Dapr管理用的模块)会单独启动,同时你的程序在启动的时候Dapr会在你的程序上挂一个Sidecar(所谓的边车模式),你的程序就可以通过Sidecar和Dapr的Control Plane联系上。所有挂有Dapr Sidecar的各个微服务之间就可以互相调用了,也可以通过Dapr调用各种中间件。
有弹性(resilient)指的是什么?
- 指的是可以从故障中自动恢复的能力,比如说超时(Timeout),重试(retry)等。不会卡住或陷入一种死循环。
无状态和有状态(stateless and stateful)指的是什么?
- 无状态指的是一个微服务经过计算得到结果,返回给调用者以后这个值在微服务这边是不保存的(DB,内存等)。有状态指的是在微服务这边要把这个结果保存起来。
支持语言的多样性(the diversity of languages)指的是什么?
- 指的是Dapr有各种语言的SDK,比如java,python,go,.net等都支持。
开发人员框架(developer frameworks)指的是什么?
- 指的是Dapr跟框架无关,你可以把各种语言的各种框架(比如java的spring boot框架)和Dapr(API或者SDK)混合使用。
说了这么多,Dapr到底是个什么东西?
- 我的理解是Dapr就是一个代理。什么意思呢,就是说它把不同组件(Component)的接口隐藏了起来,给你提供一个统一的接口让你来通信。这样做的好处不言而喻,不管你的组件怎么变,平台怎么变,我Dapr这边只要接口是不变的,你程序就不用变。所以它是Makes it easy for any developer。从程序来看我只是把数据交给Dapr就可以了,由Dapr来处理,这块的逻辑不写在我的程序逻辑里。所以通过Dapr可以做到平台无关,中间件无关。打个比方,如果你不用Dapr,而是用springboot redis库来实现的Message Queue,忽然有一天让你不用redis而是RebbitMQ,你怎么办,是不是只能用springboot rebbitmq重写程序。不同于工作在网络层的Service Mesh(如Istio和Linkerd),Dapr算是一个App Mesh,工作于APP层,专注于提供构建模块(Building blocks),使开发人员更容易构建微服务。可以说Dapr以开发人员为中心,而Service Mesh则以基础架构为中心。两者可以共存。
Dapr能为我做什么?
Dapr提供如下的Building blocks:
- Service-to-service invocation,服务间调用,指的是一个微服务可以通过Dapr调用另一个微服务。
- State management,状态管理,指的是一个微服务通过Dapr把状态数据保存到某个地方(PostgreSQL,Redis,DynamoDB等等)。
- Publish and subscribe,就是所谓的消息总线(Message Bus),或者说发布者/订阅者模式。一个微服务把消息通过Dapr发布(Publish)给某个Topic,所有订阅(Subscribe)这个Topic的微服务都能通过Dapr收到这个消息。
- Resource bindings,就是所谓的消息队列(Message Queue,或者叫消息代理,Message Broker),分为两种绑定,一种是输出绑定(Output Binding),一种是输入绑定(Input Binding)。出和入是看数据的流向,输出绑定就是作为Producer的App把消息通过Dapr传给消息队列,输入绑定就是作为Consumer的App通过Dapr从消息队列里得到消息。补充一点,这里的消息队列和Pub/Sub里的消息总线有什么区别呢?可以这样理解:一个消息进入消息总线的话,所有订阅者都能得到这个消息。而一个消息进入消息队列的话,由Consumer来取,一次只有一个人能得到。此外,消息总线是不要求处理顺序的,两个消息进入消息总线,谁先被拿到顺序是不一定的,而消息队列可以保证是先入先出的。
- Actors,实现了Actor Model。
- Observability, 可观测性,就是Dapr提供了模板让你方便的进行观测,比如说用Prometheus+Grafana来看系统的Metrics,用Zipkin来进行分布链路追踪,用Elasticsearch+Fluentd+Kibana(俗称EFK)来对日志进行检索。
- Secrets,就是密钥,指的是一个微服务通过Dapr从Secret Store取得密钥。
本章到此结束。下一章讲解如何配置Dapr的运行环境。