欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從零開始使用Dapr簡(jiǎn)化微服務(wù)的示例

 更新時(shí)間:2021年11月27日 09:32:53   作者:福祿網(wǎng)絡(luò)研發(fā)團(tuán)隊(duì)  
本文以net6和dapr1.5為基礎(chǔ),搭建一個(gè)dapr的簡(jiǎn)單使用示例。對(duì)Dapr簡(jiǎn)化微服務(wù)的簡(jiǎn)單使用感興趣的朋友跟隨小編一起學(xué)習(xí)下吧

序言

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

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

本文以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ù)的主要工具。 您可以使用它來運(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ò)問題,使用官方的Dapr安裝方法一般會(huì)遇到各種問題,因此把dapr下載下來,通過腳本進(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)行下列操作來驗(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ù)載均衡等問題。

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

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,無需關(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)目幾乎沒有代碼入侵就實(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ù)確定地址。

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

4.2、發(fā)布訂閱

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

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

? Dapr 提供了一個(gè)構(gòu)建基塊,可顯著簡(jiǎn)化實(shí)現(xiàn)發(fā)布/訂閱功能,從而和底層基礎(chǔ)設(shè)施解耦,編寫業(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公開方法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è)中間件,也就是說在不同環(huán)境下可以使用同一套代碼來使用不同的中間件。

[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)行分布式跟蹤,無需代碼檢測(cè),使用可配置的跟蹤級(jí)別自動(dòng)跟蹤所有流量。

5、總結(jié)

?本文只是對(duì)Dapr做了一個(gè)簡(jiǎn)單示例,對(duì)各個(gè)組件具體的實(shí)現(xiàn)原理沒有做過多深入講解。

?Dapr區(qū)別于傳統(tǒng)微服務(wù)框架最大的優(yōu)點(diǎn)就是Sidecar 。以前的微服務(wù)框架都需要代碼項(xiàng)目引用微服務(wù)相關(guān)的一些類庫(kù),無論是服務(wù)注冊(cè)發(fā)現(xiàn)、熔斷、配置等都是要調(diào)用對(duì)應(yīng)類庫(kù)實(shí)現(xiàn),這些類庫(kù)是運(yùn)行在微服務(wù)的進(jìn)程中的,因此這些類庫(kù)都需要使用和業(yè)務(wù)代碼一樣(或者兼容)的語言來開發(fā),因此是比較重的。

?而Sidecar 這種模式,把“注冊(cè)發(fā)現(xiàn)、熔斷、配置”等這些微服務(wù)的功能都剝離到一個(gè)和業(yè)務(wù)代碼的進(jìn)程相伴而行的獨(dú)立進(jìn)程中,業(yè)務(wù)代碼通過http或者grpc等方式和這個(gè)Sidecar 進(jìn)程通訊來完成微服務(wù)的相關(guān)服務(wù)的調(diào)用。

?顯而易見,在Sidecar 這種模式中,業(yè)務(wù)代碼中只有極少數(shù)和Sidecar 進(jìn)程通訊的代碼,因此非常輕量級(jí)。這樣Sidecar 進(jìn)程中的服務(wù)可以獨(dú)立升級(jí),模塊可以自由組合,不會(huì)干擾業(yè)務(wù)代碼。同時(shí)由于Sidecar 的進(jìn)程是獨(dú)立的進(jìn)程,業(yè)務(wù)代碼和Sidecar 進(jìn)程通訊是采用http、grpc這樣語言無關(guān)的協(xié)議,因此業(yè)務(wù)代碼可以采用任何語言來進(jìn)行開發(fā)。

到此這篇關(guān)于從零開始使用Dapr簡(jiǎn)化微服務(wù)的文章就介紹到這了,更多相關(guān)Dapr簡(jiǎn)化微服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Docker安裝RabbitMQ并安裝延時(shí)隊(duì)列插件

    Docker安裝RabbitMQ并安裝延時(shí)隊(duì)列插件

    本文主要介紹了Docker安裝RabbitMQ并安裝延時(shí)隊(duì)列插件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • docker在windows創(chuàng)建卷后本地找不到的完美解決方法

    docker在windows創(chuàng)建卷后本地找不到的完美解決方法

    這篇文章主要介紹了docker在windows創(chuàng)建卷后本地找不到的完美解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-02-02
  • docker鏡像與傳統(tǒng)vm虛擬機(jī)區(qū)別及分析

    docker鏡像與傳統(tǒng)vm虛擬機(jī)區(qū)別及分析

    這篇文章主要是內(nèi)容分享系列,為大家用大白話通俗的講解docker鏡像與傳統(tǒng)vm虛擬機(jī)區(qū)別以及分析,有需要的朋友可以借鑒參考想,希望能夠有所幫助
    2022-03-03
  • 基于Docker版本squid搭建代理服務(wù)器的過程詳解

    基于Docker版本squid搭建代理服務(wù)器的過程詳解

    這篇文章主要介紹了基于Docker版本squid搭建代理服務(wù)器的配置方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下本文給大家介紹的非常詳細(xì)
    2024-03-03
  • 基于docker-compose構(gòu)建Mongodb副本集的示例詳解

    基于docker-compose構(gòu)建Mongodb副本集的示例詳解

    副本集是?MongoDB?高可用性和數(shù)據(jù)安全性策略的基礎(chǔ),適用于對(duì)數(shù)據(jù)安全性和服務(wù)可用性有較高要求的場(chǎng)景,本文給大家介紹了如何基于docker-compose構(gòu)建Mongodb副本集,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • Docker命令讓普通用戶能夠執(zhí)行的實(shí)現(xiàn)

    Docker命令讓普通用戶能夠執(zhí)行的實(shí)現(xiàn)

    這篇文章主要介紹了Docker命令讓普通用戶能夠執(zhí)行的實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • 關(guān)于Docker網(wǎng)絡(luò)配置及部署SpringCloud項(xiàng)目詳解

    關(guān)于Docker網(wǎng)絡(luò)配置及部署SpringCloud項(xiàng)目詳解

    這篇文章主要介紹了關(guān)于Docker網(wǎng)絡(luò)配置及部署SpringCloud項(xiàng)目詳解,Docker在創(chuàng)建容器時(shí)有四種網(wǎng)絡(luò)模式,bridge為默認(rèn)不需要去指定,其他三種模式需要在創(chuàng)建容器時(shí)使用–net去指定,需要的朋友可以參考下
    2023-07-07
  • docker安裝es與kibana的過程及遇到問題

    docker安裝es與kibana的過程及遇到問題

    這篇文章主要介紹了docker安裝es與kibana的過程及遇到問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-02-02
  • Docker如何制作自己鏡像并上傳dockerhub

    Docker如何制作自己鏡像并上傳dockerhub

    這篇文章主要介紹了Docker如何制作自己鏡像并上傳dockerhub,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Docker 常用命令整理及使用注意事項(xiàng)總結(jié)

    Docker 常用命令整理及使用注意事項(xiàng)總結(jié)

    這篇文章主要介紹了Docker 常用命令整理及使用注意事項(xiàng)總結(jié)的相關(guān)資料,這里整理了Docker 的常用命令,說明這些命令是什么意思及使用方法,需要的朋友可以參考下
    2016-12-12

最新評(píng)論