您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么從零開始使用Dapr簡化微服務”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么從零開始使用Dapr簡化微服務”吧!
現有的微服務模式需要再業務代碼中集成大量基礎設施模塊,比如注冊中心,服務發現,服務調用鏈路追蹤,請求熔斷,重試限流等等,使得系統過于臃腫重量級。
Dapr作為新一代微服務模式,使用sidecar模式,簡化了現有微服務系統代碼,將基礎設施層以sidecar模式分離,使得開發人員更集中于業務邏輯編寫。
本文以net6和dapr1.5為基礎,搭建一個dapr的簡單使用示例。
Dapr的運行依賴于Docker環境。
作為學習環境,使用Centos 7系統安裝Docker。
安裝Docker推薦使用daocloud一鍵安裝命令:
curl -sSL https://get.daocloud.io/docker | sh
安裝完成后運行命令:
[root@localhost ~]# docker -v Docker version 20.10.11, build dea9396
顯示對應的Docker版本即安裝成功。
官方解釋:Dapr CLI 是您用于各種 Dapr 相關任務的主要工具。 您可以使用它來運行一個帶有Dapr sidecar的應用程序, 以及查看sidecar日志、列出運行中的服務、運行 Dapr 儀表板。
下載Dapr CLI
wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash
驗證安裝情況
dapr -v
輸出以下內容即安裝成功。
CLI version: 1.5.0 Runtime version: 1.5.0
由于國內網絡問題,使用官方的Dapr安裝方法一般會遇到各種問題,因此把dapr下載下來,通過腳本進行安裝。
修改hosts文件
vi /etc/hosts 140.82.114.4 github.com 199.232.69.194 github.global.ssl.fastly.net 140.82.114.9 codeload.github.com
刷新緩存
yum install -y nscd service nscd restart
首先需要安裝Git,然后執行以下命令:
git clone -v https://gitee.com/Two-Twoone/dapr-installer.git cd dapr-installer/ ./install.sh
雖然還是很慢,但是總比下不了好多了。
上面命令啟動了幾個容器,運行下列操作來驗證:
[root@localhost dapr-installer]# docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Ports}}" CONTAINER ID NAMES PORTS a0565f609846 dapr_placement 0.0.0.0:50005->50005/tcp, :::50005->50005/tcp c392f5cf7a18 dapr_redis 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp 2ee68c450b29 dapr_zipkin 9410/tcp, 0.0.0.0:9411->9411/tcp, :::9411->9411/tcp
rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm yum update yum install dotnet-sdk-6.0
創建2個項目分別為 product,cart 引用Dapr
dotnet add package Dapr.AspNetCore
Program.cs中對 的 AddDapr
調用將 DaprClient
類注冊到 ASP.NET Core注入系統。 注冊客戶端后,現在可以將 的實例注入服務代碼, DaprClient
以與 Dapr sidecar、構建基塊和組件進行通信。
builder.Services.AddControllers().AddDapr();
在微服務系統中,服務與服務間的調用必不可少,難點主要集中在服務所在位置,發生錯誤時如何重試,負載均衡等問題。
Dapr中使用sidecar 作為服務的反向代理模塊來解決這些問題。
prodcut項目增加下列代碼
[Route("api/[controller]")] [ApiController] public class ProductController : ControllerBase { private ILogger<ProductController> _logger; public ProductController(ILogger<ProductController> logger) { _logger = logger; } private static readonly List<string> products = new List<string> { "aa", "bb", "cc", "dd", "ee", "ff", "gg", "hh", "ii", "jj", "kk", "ll", "mm", "nn" }; [HttpGet] public ActionResult Get() { _logger.LogInformation($"調用了獲取商品方法"); string[] temps = new string[5]; for (int i = 0; i < 5; i++) { Random random = new Random(Guid.NewGuid().GetHashCode()); temps[i] = products[random.Next(0, products.Count - 1)]; } return Ok( temps); } }
# 啟動Product 項目 dapr run --app-id ProductDemo --app-port 5010 --dapr-http-port 7015 -- dotnet /root/www/product/Dapr.Product.Sample.dll --urls http://*:5010
cart項目增加下列代碼,dapr支持http,grpc調用方式,這里以常用的webapi為例,使用http方式調用。
InvokeMethodAsync方法中appid對應的就是dapr run 中的appid,無需關系調用地址。
[Route("api/[controller]")] [ApiController] public class CartController : ControllerBase { private readonly DaprClient _daprClient; private readonly ILogger<CartController> _logger; public CartController(DaprClient daprClient, ILogger<CartController> logger) { _daprClient = daprClient; _logger = logger; } [HttpGet] [Route("GetProducts")] public async Task<IActionResult> GetProducts() { _logger.LogInformation($" Cart 獲取商品"); var products = await _daprClient.InvokeMethodAsync<List<string>>(HttpMethod.Get, "ProductDemo", "/api/Product/GetAll"); return Ok(products); } }
將程序上傳到linux服務器,運行程序
# 啟動 Cart 項目 dapr run --app-id CartDemo --app-port 5020 --dapr-http-port 7025 -- dotnet /root/www/cart/Dapr.Cart.Sample.dll --urls http://*:5020
調用接口,可以看到Cart項目幾乎沒有代碼入侵就實現了接口調用。
[root@localhost ~]# curl -X 'GET' 'http://192.168.2.110:5020/api/Cart/GetProducts' ["aa","bb","cc","dd","ee","ff","gg","hh","ii","jj","kk","ll","mm","nn"]
Dapr內部使用了mDns進行了服務注冊發現和負載均衡,部署多個product后調用,可以看到輪詢調用效果。
在自承載模式下,Dapr 使用 mDNS 查找它。在 Kubernetes 模式下運行時,Kubernetes DNS 服務確定地址。
在調用失敗和瞬態錯誤的情況下,服務調用會執行自動重試,Dapr 默認是開啟了重試,所以接口不支持冪等是十分危險的行為。
發布訂閱模式,主要是用于微服務間基于消息進行相互通信。你可能也會說,這也要拿出來說,我搞個RabbitMQ/Kafka就是了,
原來我們都會根據使用的組件引入不同的sdk,不同的消息隊列監聽、消費模式還不一樣。
Dapr 提供了一個構建基塊,可顯著簡化實現發布/訂閱功能,從而和底層基礎設施解耦,編寫業務邏輯時不需要關心是什么消息隊列。
再Program中添加發布訂閱支持
app.UseCloudEvents(); app.UseEndpoints(endpoints => { endpoints.MapSubscribeHandler(); });
訂閱消息,使用Topic特性,傳遞pubsub和主題名稱
[Topic("pubsub", "newUser")] public ActionResult subUserInfo(UserInfo us) { _logger.LogInformation($"接收到訂閱消息 id:{us.id} name:{us.name},age:{us.age},sex:{us.sex}"); return Ok("處理完畢"); }
發布消息,使用dapr公開方法PublishEventAsync,傳遞pubsub和主題名稱,以及消息體
[HttpPost] public async Task<IActionResult> PubUserInfo(UserInfo us) { await _daprClient.PublishEventAsync("pubsub", "newUser", us); return Ok(); }
消息發布訂閱組件支持RabbitMQ,Redis,Kafka等。
Dapr 默認使用 Redis 作為狀態存儲。它也支持MongoDB,PostgreSQL,SQL Server等。
它不會對上層暴露底層用的那個中間件,也就是說在不同環境下可以使用同一套代碼來使用不同的中間件。
[HttpPost] [Route("SaveUserList")] public async Task<IActionResult> SaveUserList() { var temps = new List<UserInfo> { new UserInfo("小紅",1,true,Guid.NewGuid().ToString()), new UserInfo("小黃",1,true,Guid.NewGuid().ToString()), new UserInfo("小藍",1,true,Guid.NewGuid().ToString()) }; await _daprClient.SaveStateAsync("statestore", "UserList", temps); return Ok(1); } [HttpGet] [Route("GetUserList")] public async Task<IActionResult> GetUserList() { var list = await _daprClient.GetStateAsync<List<UserInfo>>("statestore", "UserList"); return Ok(list); } [HttpGet] [Route("DeleteUserList")] public async Task<IActionResult> DeleteUserList() { await _daprClient.DeleteStateAsync("statestore", "UserList"); return Ok(1); } public record UserInfo(string name, int age, bool sex, string id);
傳統微服務中,要實現鏈路追蹤,對代碼的侵入強。
Dapr 在 Sidecar 中添加了一個 http/grpc中間件。攔截所有應用程序流量,并自動注入關聯 ID 以跟蹤分布式事務。
使用 Zipkin 協議進行分布式跟蹤,無需代碼檢測,使用可配置的跟蹤級別自動跟蹤所有流量。
到此,相信大家對“怎么從零開始使用Dapr簡化微服務”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。