溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么從零開(kāi)始使用Dapr簡(jiǎn)化微服務(wù)

發(fā)布時(shí)間:2021-11-29 15:05:31 來(lái)源:億速云 閱讀:348 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容主要講解“怎么從零開(kāi)始使用Dapr簡(jiǎn)化微服務(wù)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么從零開(kāi)始使用Dapr簡(jiǎn)化微服務(wù)”吧!

    序言

    現(xiàn)有的微服務(wù)模式需要再業(yè)務(wù)代碼中集成大量基礎(chǔ)設(shè)施模塊,比如注冊(cè)中心,服務(wù)發(fā)現(xiàn),服務(wù)調(diào)用鏈路追蹤,請(qǐng)求熔斷,重試限流等等,使得系統(tǒng)過(guò)于臃腫重量級(jí)。

    Dapr作為新一代微服務(wù)模式,使用sidecar模式,簡(jiǎn)化了現(xiàn)有微服務(wù)系統(tǒng)代碼,將基礎(chǔ)設(shè)施層以sidecar模式分離,使得開(kāi)發(fā)人員更集中于業(yè)務(wù)邏輯編寫(xiě)。

    本文以net6和dapr1.5為基礎(chǔ),搭建一個(gè)dapr的簡(jiǎn)單使用示例。

    1、安裝Docker

    Dapr的運(yùn)行依賴于Docker環(huán)境。

    作為學(xué)習(xí)環(huán)境,使用Centos 7系統(tǒng)安裝Docker。

    安裝Docker推薦使用daocloud一鍵安裝命令:

    curl -sSL https://get.daocloud.io/docker | sh

    安裝完成后運(yùn)行命令:

    [root@localhost ~]# docker -v
    Docker version 20.10.11, build dea9396

    顯示對(duì)應(yīng)的Docker版本即安裝成功。

    2、安裝Dapr CLI

    官方解釋:Dapr CLI 是您用于各種 Dapr 相關(guān)任務(wù)的主要工具。 您可以使用它來(lái)運(yùn)行一個(gè)帶有Dapr sidecar的應(yīng)用程序, 以及查看sidecar日志、列出運(yùn)行中的服務(wù)、運(yùn)行 Dapr 儀表板。

    下載Dapr CLI

    wget -q https://raw.githubusercontent.com/dapr/cli/master/install/install.sh -O - | /bin/bash

    驗(yàn)證安裝情況

    dapr -v

    輸出以下內(nèi)容即安裝成功。

    CLI version: 1.5.0
    Runtime version: 1.5.0

    由于國(guó)內(nèi)網(wǎng)絡(luò)問(wèn)題,使用官方的Dapr安裝方法一般會(huì)遇到各種問(wèn)題,因此把dapr下載下來(lái),通過(guò)腳本進(jìn)行安裝。

    修改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,然后執(zhí)行以下命令:

    git clone -v https://gitee.com/Two-Twoone/dapr-installer.git
    cd dapr-installer/
    ./install.sh

    雖然還是很慢,但是總比下不了好多了。

    上面命令啟動(dòng)了幾個(gè)容器,運(yùn)行下列操作來(lái)驗(yàn)證:

    [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

    3、安裝Net6 SDK

    rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
     yum update
     yum install dotnet-sdk-6.0

    4、創(chuàng)建應(yīng)用程序

    創(chuàng)建2個(gè)項(xiàng)目分別為 product,cart 引用Dapr

    dotnet add package Dapr.AspNetCore

    Program.cs中對(duì) 的 AddDapr 調(diào)用將 DaprClient 類注冊(cè)到 ASP.NET Core注入系統(tǒng)。 注冊(cè)客戶端后,現(xiàn)在可以將 的實(shí)例注入服務(wù)代碼, DaprClient 以與 Dapr sidecar、構(gòu)建基塊和組件進(jìn)行通信。

    builder.Services.AddControllers().AddDapr();

    4.1、服務(wù)調(diào)用

    在微服務(wù)系統(tǒng)中,服務(wù)與服務(wù)間的調(diào)用必不可少,難點(diǎn)主要集中在服務(wù)所在位置,發(fā)生錯(cuò)誤時(shí)如何重試,負(fù)載均衡等問(wèn)題。

    Dapr中使用sidecar 作為服務(wù)的反向代理模塊來(lái)解決這些問(wèn)題。

    prodcut項(xiàng)目增加下列代碼

    [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($"調(diào)用了獲取商品方法");
                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);
            }
        }
    # 啟動(dòng)Product 項(xiàng)目
    dapr run --app-id ProductDemo --app-port 5010 --dapr-http-port 7015 -- dotnet /root/www/product/Dapr.Product.Sample.dll --urls http://*:5010

    cart項(xiàng)目增加下列代碼,dapr支持http,grpc調(diào)用方式,這里以常用的webapi為例,使用http方式調(diào)用。

    InvokeMethodAsync方法中appid對(duì)應(yīng)的就是dapr run 中的appid,無(wú)需關(guān)系調(diào)用地址。

    [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服務(wù)器,運(yùn)行程序

    # 啟動(dòng) Cart 項(xiàng)目
    dapr run --app-id CartDemo --app-port 5020 --dapr-http-port 7025 -- dotnet /root/www/cart/Dapr.Cart.Sample.dll --urls http://*:5020

    調(diào)用接口,可以看到Cart項(xiàng)目幾乎沒(méi)有代碼入侵就實(shí)現(xiàn)了接口調(diào)用。

    [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內(nèi)部使用了mDns進(jìn)行了服務(wù)注冊(cè)發(fā)現(xiàn)和負(fù)載均衡,部署多個(gè)product后調(diào)用,可以看到輪詢調(diào)用效果。

    在自承載模式下,Dapr 使用 mDNS 查找它。在 Kubernetes 模式下運(yùn)行時(shí),Kubernetes DNS 服務(wù)確定地址。

    怎么從零開(kāi)始使用Dapr簡(jiǎn)化微服務(wù)

    在調(diào)用失敗和瞬態(tài)錯(cuò)誤的情況下,服務(wù)調(diào)用會(huì)執(zhí)行自動(dòng)重試,Dapr 默認(rèn)是開(kāi)啟了重試,所以接口不支持冪等是十分危險(xiǎn)的行為。

    4.2、發(fā)布訂閱

    發(fā)布訂閱模式,主要是用于微服務(wù)間基于消息進(jìn)行相互通信。你可能也會(huì)說(shuō),這也要拿出來(lái)說(shuō),我搞個(gè)RabbitMQ/Kafka就是了,

    原來(lái)我們都會(huì)根據(jù)使用的組件引入不同的sdk,不同的消息隊(duì)列監(jiān)聽(tīng)、消費(fèi)模式還不一樣。

    Dapr 提供了一個(gè)構(gòu)建基塊,可顯著簡(jiǎn)化實(shí)現(xiàn)發(fā)布/訂閱功能,從而和底層基礎(chǔ)設(shè)施解耦,編寫(xiě)業(yè)務(wù)邏輯時(shí)不需要關(guān)心是什么消息隊(duì)列。

    再Program中添加發(fā)布訂閱支持

     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("處理完畢");
            }

    發(fā)布消息,使用dapr公開(kāi)方法PublishEventAsync,傳遞pubsub和主題名稱,以及消息體

    [HttpPost]
            public async Task<IActionResult> PubUserInfo(UserInfo us)
            {
                await _daprClient.PublishEventAsync("pubsub", "newUser", us);
                return Ok();
            }

    消息發(fā)布訂閱組件支持RabbitMQ,Redis,Kafka等。

    4.3、狀態(tài)管理

    Dapr 默認(rèn)使用 Redis 作為狀態(tài)存儲(chǔ)。它也支持MongoDB,PostgreSQL,SQL Server等。

    它不會(huì)對(duì)上層暴露底層用的那個(gè)中間件,也就是說(shuō)在不同環(huán)境下可以使用同一套代碼來(lái)使用不同的中間件。

    [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("小藍(lán)",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);

    4.4、鏈路追蹤

    傳統(tǒng)微服務(wù)中,要實(shí)現(xiàn)鏈路追蹤,對(duì)代碼的侵入強(qiáng)。

    Dapr 在 Sidecar 中添加了一個(gè) http/grpc中間件。攔截所有應(yīng)用程序流量,并自動(dòng)注入關(guān)聯(lián) ID 以跟蹤分布式事務(wù)。

    使用 Zipkin 協(xié)議進(jìn)行分布式跟蹤,無(wú)需代碼檢測(cè),使用可配置的跟蹤級(jí)別自動(dòng)跟蹤所有流量。

    怎么從零開(kāi)始使用Dapr簡(jiǎn)化微服務(wù)

    怎么從零開(kāi)始使用Dapr簡(jiǎn)化微服務(wù)

    到此,相信大家對(duì)“怎么從零開(kāi)始使用Dapr簡(jiǎn)化微服務(wù)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI