多运行时是一个非常新的概念。在 2020 年,Bilgin Ibryam 提出了 Multi-Runtime(多运行时)的理念,对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华。那到底什么是多运行时呢?首先还是得从分布式应用的四大类基本需求讲起。简单来讲任何分布式应用都存在的四大类基本需求:

    1、生命周期:包括部署,健康检查,水平扩展,配置管理等,目前这些需求的最佳实践,都陆续在 kubernetes 上有了落地。

    2、网络:网络方面的需求 是 service Mesh 的主战场,比如 istio 可以满足这里绝大部分需求,除了 pub/sub。

    3、状态:包括数据的读写,状态其实是非常难以管理的,涉及幂等,缓存,数据流等等。

    4、绑定:主要是指和系统外部资源的交互。

  在传统软件时代,是耦合在应用代码里的,但现如今,有越来越多的分布式能力从应用中剥离,而剥离的方式也在逐渐变化,从最早期,这些能力从业务代码剥离到依赖库中,然后有一些特性剥离到平台层(kubernetes)。而如今会有更多的非业务能力,剥离到 sidecar 中。作者预测:理论上每个微服务可以有多个 runtime: 一个业务运行时,和多个分布式能力运行时,但最理想的情况是,或者最可能出现的情况是:在业务之外的运行时合并为一个,通过高度模块化、标准化和可配置的方式,给业务提供所有分布式能力。而dapr则在很早之前就完成了对istio的集成,理论上我们可以通过运行两个sidecar来提供分布式能力,istio关注网络侧,包括不限于服务注册发现、A/B测、金丝雀部署、流量镜像,监控链路等等。当然dapr这部分有一定重叠,但是没有istio做的那么细致,这两者可以互补。而dapr则可以提供istio并不具备的网络功能比如订阅/发布、状态管理包括状态幂等,一致性,actor等等,也包括绑定,通过绑定和外部系统交互这部分。

目录:
一、通过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之绑定

十一、通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容
附录:(如果你觉得对你有用,请给个star)
一、电商Demo地址

二、通讯框架地址

  istio是什么呢?简单来讲istio是一个service mesh,和dapr的结构类似,都是通过在应用之上插入sidecar来提供分布式能力,同时通过控制平面来对这些sidecar进行具体的调度和管控,只不过istio更倾向于提供网络能力,其官网的一句话描述可以概括:“通过领先的服务网格简化可观测性,流量管理,安全及策略。”其功能包括以下几点:

    1、使用 TLS 加密、强身份认证和授权的集群内服务到服务的安全通信

    2、自动负载均衡的 HTTP, gRPC, WebSocket,和 TCP 流量

    3、通过丰富的路由规则、重试、故障转移和故障注入对流量行为进行细粒度控制

    4、一个可插入的策略层和配置 API,支持访问控制、速率限制和配额

    5、对集群内的所有流量(包括集群入口和出口)进行自动度量、日志和跟踪

  说了那么多,我们还是聊聊如何通过dapr+istio对我们的电商demo进行多运行时集成吧。首先是安装,安装可以参考istio官方中文文档,默认安装profile=demo会帮我们安装istiod+ingressgateway+egressgateway,istiod就是我们的控制平面核心,不同于dapr将控制平面分散在多个容器的做法,istio经历过1.5的版本迭代后将所有的功能又合并到了一个容器中。而ingressgateway则是用于替代ingress-controller的,而egress是出口网关,由于istio默认对入口和出口流量都有管控,这里我们不需要限制出口流量,所以设置为ALLOW_ANY。同时这是不需要每次都拉取sidecar镜像。

istioctl install --set profile=demo  --set meshConfig.outboundTrafficPolicy.mode=ALLOW_ANY  --set values.global.imagePullPolicy=IfNotPresent

  同样的我们需要将ingressgateway作为nodeport指向我们的30882,记住这里需要先把之前安装的ingress-controller的svc的30882修改为其他端口,否则会冲突。

 kubectl edit svc istio-ingressgateway -n istio-system
-> 文件内容改动如下:
...
- name: http2 #只需要修改http2即可
nodePort: 30882
port: 80
protocol: TCP
...
type: NodePort #改成NodePort,下面的部分删除
status:
loadBalancer:
ingress:
- hostname: localhost

  接着我们看看kubectl get po -n istio-system 确保三个pod都已经running即可,接着我们安装一些dashboard需要等下通过这些来观察istio,进入安装的istio根目录,找到\samples\addons,执行kubectl apply -f . 即可将Kiali 和其他插件安装完毕,其中kiali是istio的官方仪表板,安装完成后可以通过istioctl dashboard kiali 将kiali启动起来,当然你也可以通过修改kubectl edit svc kiali -n istio-system 设置nodeport来永久暴露kiali面板,这里不赘述。可以看到我们的dapreshop里所有的pod目前状态都是missing sidecar,说明sidecar尚未注入。

  接着我们来注入istio的sidecar到我们的电商demo。很简单,只需要执行 kubectl label ns dapreshop istio-injection=enabled 在我们的dapreshop这个namespace打上自动注入的标签,接着我们kubectl delete po --all -n dapreshop重启所有pod即可将该空间下的pod都自动注入sidecar。如果你不需要某些pod注入sidecar,则禁用它即可:

  template:
metadata:
labels:
app: accountservice
version: v1
annotations:
sidecar.istio.io/inject: "false"

  如果一切顺利,等待一段时间后,我们可以看到每一个pod都会被正确的注入istio的sidcar,而istio sidecar工作原理和dapr不一样,它是通过修改ip规则转发流量的方式强制拦截,流量模型如下:

  接着我们需要编写入口流量,让我们的流量通过istio的网关接管,yaml如下:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: dapreshop-gateway
namespace: dapreshop
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: apigateway
namespace: dapreshop
spec:
hosts:
- "api.dapreshop.com"
gateways:
- dapreshop-gateway
http:
- route:
- destination:
port:
number: 80
host: apigateway
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: mobiledapreshop
namespace: dapreshop
spec:
hosts:
- "m.dapreshop.com"
gateways:
- dapreshop-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
port:
number: 80
host: mobilefrontend
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: admindapreshop
namespace: dapreshop
spec:
hosts:
- "admin.dapreshop.com"
gateways:
- dapreshop-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
port:
number: 80
host: adminfrontend
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: oauthdapreshop
namespace: dapreshop
spec:
hosts:
- "oauth.dapreshop.com"
gateways:
- dapreshop-gateway
http:
- match:
- uri:
prefix: /
route:
- destination:
port:
number: 80
host: oauthservice-dapr

  apply以后,我们可以通过kugectl get gw,vs -n dapreshop。可以看到相关资源已经注入成功了,接着就可以访问我们的http://admin.dapreshop.com:30882/,可以看到页面被正确打开了,说明流量已经通过istio正确转发了。接着我们操作一下平台,然后登录kiali即可看到正确的链路调用情况了

  今天的分享就到这里,这只是一个简单的demo级别的演示,其他的还需要大家多自行摸索,照例欢迎fork+star~

  

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

  1. 通过Dapr实现一个简单的基于.net的微服务电商系统(十三)——istio+dapr构建多运行时服务网格之生产环境部署

    之前所有的演示都是在docker for windows上进行部署的,没有真正模拟生产环境,今天我们模拟真实环境在公有云上用linux操作如何实现istio+dapr+电商demo的部署. 目录:一. ...

  2. 通过Dapr实现一个简单的基于.net的微服务电商系统(十四)——开发环境容器调试小技巧

    之前有很多同学提到如何做容器调试,特别是k8s环境下的容器调试,今天就讲讲我是如何调试的.大家都知道在vs自带的创建项目模板里勾选docker即可通过F5启动docker容器调试.但是对于启动在k8s ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(十五)——集中式接口文档实现

    之前有小伙伴在评论区留言说如何集成swagger,最开始没有想透给了对方一个似是而非的回答.实际上后来下来想了一下,用.NET5 提供的Source Generator其实可以很方便的实现接口集成.今 ...

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

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

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

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

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

    在之前的系列文章中聊过分布式事务的一种实现方案,即通过在集群中暴露actor服务来实现分布式事务的本地原子化.但是actor服务本身有其特殊性,场景上并不通用.所以今天来讲讲分布式事务实现方案之sag ...

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

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

  8. 通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享

    今天这篇博文的主要目的是分享一下我设计Saga的实现思路来抛砖引玉,其实Saga本身非常的类似于一个简单的工作流体系,相比工作流不一样的部分在于它没有工作流的复杂逻辑处理机制(比如会签),没有条件分支 ...

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

    之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...

随机推荐

  1. SQL排名问题,100% leetcode答案大公开!

    (首先原谅我最近新番看多了,起了一个中二的名字) 最近在找实习,所以打算系统总结(复习)一下sql中经常遇到问题.不管是刷leetcode还是牛客的sql题,有一个问题总是绕不开的,那就是排名问题.其 ...

  2. Android Studio 待看博文

    •前言 学习过程中找到的一些好的博文,有些可能当时就看完了并解决了我的问题,有些可能需要好几天的事件才能消化. 特此记录,方便查阅. •CSDN 给新人的一些基础常识 TextView的文字长度测量及 ...

  3. ASP.NET网页开发基础(7)

    整理了一点的小知识点: 1.ASP.NET网页扩展名:    .asax 全局应用程序类的扩展名     .xml 访问网页时的扩展名     .htm     .ascx Web用户控件的扩展名   ...

  4. Dynamic CRM登陆界面的客制化(持续更新)

    Dynamic CRM的登陆页面比较西化,不是很适合中国人使用.目前先把注销跳转的问题解决了. 服务端使用下面命令,将文件导出来 Export-AdfsWebTheme –Name default – ...

  5. 使用Vanilla框架制作时间倒数器 ——JavaScript

    一.制作时间倒数器要求以及思路:   1.首先创建三个输入字段,分别是小时,分钟和秒,以及"开始"按钮.输入的初始值必须为0h 5m 0s.当用户输入小时,分钟和秒并单击" ...

  6. python中栈的实现

    栈是一种线性数据结构,用先进后出或者是后进先出的方式存储数据,栈中数据的插入删除操作都是在栈顶端进行,常见栈的函数操作包括 empty() – 返回栈是否为空 – Time Complexity : ...

  7. Java刷题-stack

    一.getMin栈 题目描述 实现一个特殊功能的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. 输入描述: 第一行输入一个整数N,表示对栈进行的操作总数. 下面N行每行输入一个字符串S ...

  8. JFX11+IDEA跨平台打包发布的完美解决办法

    1 概述 IDEA2020.1的文档中提到只有JFX8的工程才支持打成jar包,并且,如果直接使用Build Artifacts的话,会如下提示: IDEA文档有提到这个的解决办法,是使用一些第三方工 ...

  9. Day02_15_方法重载

    方法重载 1.什么是方法重载? * 方法重载又被称为 OverLoad,是指在同一个类中,具有相同方法名的不同方法,各个方法虽然方法名相同,但是各自的形式参数不同. 2.什么时候考虑使用方法重载? * ...

  10. Review: JQuery

    1.DOM access with jQuery 1 $("h1"); //select all the h1s 2 $("#heading"); // sel ...