通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定...
如果說Actor是dapr有狀態(tài)服務(wù)的內(nèi)部體現(xiàn)的話,那綁定應(yīng)該是dapr對serverless這部分的體現(xiàn)了。我們可以通過綁定極大的擴(kuò)展應(yīng)用的能力,甚至未來會成為serverless的基礎(chǔ)。最開始接觸dapr的時候,會在其官方首頁看到這么一句話“Dapr is a portable, serverless, event-driven runtime ” 一個可移植的,服務(wù)器的,事件驅(qū)動的運行時。可移植很容易理解,事件驅(qū)動也有所體現(xiàn)。那這個無服務(wù)器(serverless)呢?今天我們就講講dapr是如何serverless的。
目錄:
一、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)
二、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(二)——通訊框架講解
三、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(三)——一步一步教你如何擼Dapr
四、通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(四)——一步一步教你如何擼Dapr之訂閱發(fā)布
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(五)——一步一步教你如何擼Dapr之狀態(tài)管理
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(六)——一步一步教你如何擼Dapr之Actor服務(wù)
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(七)——一步一步教你如何擼Dapr之服務(wù)限流
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(八)——一步一步教你如何擼Dapr之鏈路追蹤
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(九)——一步一步教你如何擼Dapr之OAuth2授權(quán)
通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(九)——一步一步教你如何擼Dapr之OAuth2授權(quán)-百度版
附錄:(如果你覺得對你有用,請給個star)
一、電商Demo地址:https://github.com/sd797994/Oxygen-Dapr.EshopSample
二、通訊框架地址:https://github.com/sd797994/Oxygen-Dapr
serverless還是有必要提兩嘴,知道的同學(xué)可以直接略過。直接翻開CNCF對serverless的定義:“Serverless 是指構(gòu)建和運行不需要服務(wù)器管理的應(yīng)用程序的概念”,這個概念說起來非常的大哈,實際上根據(jù)各家云平臺提供的serverless服務(wù)來看,其主要作用是將開發(fā)者的應(yīng)用程序和服務(wù)器操作系統(tǒng)環(huán)境進(jìn)行了隔離,讓開發(fā)人員不再關(guān)心服務(wù)器(而不是完全不需要服務(wù)器!),只需要通過云函數(shù)的方式編寫特定的業(yè)務(wù)代碼即可對外提供服務(wù)。每一個函數(shù)會被編譯成一個容器鏡像,當(dāng)外部請求過來時Serverless會激活這個函數(shù)運行我們的鏡像實例,當(dāng)請求量激增時,Serverless會幫我們橫向擴(kuò)容多個實例來抗住請求。當(dāng)一段時間沒有請求后,Serverless又會幫我們逐步縮容云函數(shù)實例直到實例變?yōu)?。這樣當(dāng)沒有請求時的大部分時間里云服務(wù)商不會收取你的CPU/內(nèi)存/網(wǎng)絡(luò)的費用,僅僅收取一個磁盤費用(托管云函數(shù)鏡像需要)。這里面涉及到兩個問題,一個是云函數(shù)的擴(kuò)容/縮容機(jī)制,一個就是云函數(shù)本身如何調(diào)用其他服務(wù)比如我要持久化數(shù)據(jù)/發(fā)送郵件/寫短信/訂閱?在各家云商提供的Serverless架構(gòu)里,擴(kuò)容縮容自然是通過k8s來實現(xiàn)的,而調(diào)用外部服務(wù)則被封裝成了自家的云服務(wù)(比如阿里云可以調(diào)用RDS讀寫數(shù)據(jù)庫。調(diào)用OSS讀寫對象,相應(yīng)的自家的Serverless架構(gòu)都提供了相關(guān)函數(shù)的功能)。
那Dapr如何實現(xiàn)Serverless的呢?但凡熟悉k8s的同學(xué)應(yīng)該對自動化擴(kuò)容、縮容這部分比較容易理解,其基于k8s的HPA機(jī)制運作,dapr通過對KEDA集成實現(xiàn)了這部分的功能,不過這不是今天我們要講的重點。另外一個問題,云函數(shù)如何調(diào)用外部服務(wù)?這就是今天我們要講的重點——綁定機(jī)制的實現(xiàn)。dapr的綁定提供了非常多的外部組件訪問支持,訪問這個列表可以查詢具體的支持情況,隨著dapr的逐步迭代我相信這個列表還會逐步增加最終將覆蓋主流的大部分我們會用到的服務(wù)組件。這樣最終我們將無需和某個云服務(wù)商的Serverless做技術(shù)綁定,只需要dapr即可實現(xiàn)Serverless!而我們的應(yīng)用程序?qū)兊梅浅]p量級,幾乎不需要集成特定組件sdk(比如數(shù)據(jù)庫訪問sdk、sms短信sdk、ios消息推送sdk等等等等)。只需要提供一個對外服務(wù)的restapi,內(nèi)部完成業(yè)務(wù)操作后其余的部分交給dapr幫我們完成即可。
今天就來看看我們通過dapr是如何完成對數(shù)據(jù)庫訪問的,這里依然使用我們的eshop進(jìn)行舉例,在eshop中我們試著訪問我們的用戶數(shù)據(jù)庫的Account表。首先我們需要創(chuàng)建一個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接著我們編寫代碼來實現(xiàn)對該component進(jìn)行訪問,通過查詢Account獲取用戶信息并打印到postman中
首先我們實現(xiàn)一個簡單的http請求用于查詢我們的綁定服務(wù):
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而是一個數(shù)組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中創(chuàng)建一個GetAccountListByDapr用于暴露該服務(wù)到外部:
[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發(fā)起一個訪問:
可以看到成功的通過httpclient調(diào)用dapr獲取到了數(shù)據(jù)庫里的數(shù)據(jù)。這里還有些小的問題比如我的id是一個uuid格式,通過dapr讀取出來變成了一個數(shù)組,還不知道是什么原因。不過大體思路就是這樣了,至少目前通過dapr可以和阿里云oss、ios消息推送、mysql、kafka、mqtt、postgresql、rabbitmq、redis等等等等我們常用的耳熟能詳?shù)姆?wù)/組件進(jìn)行集成,而你唯一需要關(guān)心的只是通過訪問dapr的api來發(fā)送操作/獲取數(shù)據(jù)僅此而已,dapr將組件集成的復(fù)雜度從應(yīng)用層面遷移后,對于開發(fā)者來講通過dapr要實現(xiàn)一個serverless至少從技術(shù)層面來看已經(jīng)沒有多少阻礙了。好了,今天的分享就到這里~
相關(guān)文章:
- Dapr能否引領(lǐng)云原生中間件的未來? 
- 云原生 | 阿里巴巴的Dapr實踐與探索 
- Dapr | 云原生的抽象與實現(xiàn) 
- Dapr 可視化指南 
- Dapr 知多少 | 分布式應(yīng)用運行時 
- Dapr 正式發(fā)布 1.0 
- Dapr 交通流量控制示例 
- Dapr是如何簡化微服務(wù)的開發(fā)和部署 
- 微軟開源微服務(wù)運行時Dapr,賦能云原生應(yīng)用開發(fā) 
- YARP實現(xiàn)Dapr服務(wù)調(diào)用的反向代理 
- Dapr微服務(wù)應(yīng)用開發(fā)系列0:概述 
- Dapr微服務(wù)應(yīng)用開發(fā)系列1:環(huán)境配置 
- Dapr微服務(wù)應(yīng)用開發(fā)系列2:Hello World與SDK初接觸 
- Dapr微服務(wù)應(yīng)用開發(fā)系列3:服務(wù)調(diào)用構(gòu)件塊 
- Dapr微服務(wù)應(yīng)用開發(fā)系列4:狀態(tài)管理構(gòu)件塊 
- Dapr微服務(wù)應(yīng)用開發(fā)系列5:發(fā)布訂閱構(gòu)建塊 
- Windows環(huán)境下Dapr入門 
- 云原生 | .NET 5 with Dapr 初體驗
- 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng) 
- 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(二)——通訊框架講解 
- 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(三)——一步一步教你如何擼Dapr 
- 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(四)——一步一步教你如何擼Dapr之訂閱發(fā)布 
- 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(五)——一步一步教你如何擼Dapr之狀態(tài)管理 
- 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(六)——一步一步教你如何擼Dapr之Actor服務(wù) 
- 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(七)——一步一步教你如何擼Dapr之服務(wù)限流 
- 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(八)——一步一步教你如何擼Dapr之鏈路追蹤 
- 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(九)——一步一步教你如何擼Dapr之OAuth2授權(quán) 
- 通過Dapr實現(xiàn)一個簡單的基于.net的微服務(wù)電商系統(tǒng)(九)——一步一步教你如何擼Dapr之OAuth2授權(quán)-百度版 
- WebAssembly + Dapr = 下一代云原生運行時? 
- dapr 應(yīng)用開發(fā) | 環(huán)境配置 
- 乘風(fēng)破浪,.Net Core遇見Dapr,為云原生而生的分布式應(yīng)用運行時 
- Dapr案例之高德 Serverless 平臺建設(shè)及實踐 
總結(jié)
以上是生活随笔為你收集整理的通过Dapr实现一个简单的基于.net的微服务电商系统(十)——一步一步教你如何撸Dapr之绑定...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: .NET Core 基于 Grafana
- 下一篇: 网络协议,没有想象中那么难
