电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

从零开始,使用Dapr简化微服务

来源:金蝶云社区作者:金蝶2024-09-162

从零开始,使用Dapr简化微服务

序言

现有的微服务模式需要再业务代码中集成大量基础设施模块,比如注册中心,服务发现,服务调用链路追踪,请求熔断,重试限流等等,使得系统过于臃肿重量级。

Dapr作为新一代微服务模式,使用sidecar模式,简化了现有微服务系统代码,将基础设施层以sidecar模式分离,使得开发人员更集中于业务逻辑编写。

本文以net6和dapr1.5为基础,搭建一个dapr的简单使用示例。

1、安装Docker

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版本即安装成功。

2、安装Dapr CLI

官方解释: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

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、创建应用程序

创建2个项目分别为 product,cart 引用Dapr

dotnet add package Dapr.AspNetCore

Program.cs中对 的 AddDapr 调用将 DaprClient 类注册到 ASP.NET Core注入系统。 注册客户端后,现在可以将 的实例注入服务代码, DaprClient 以与 Dapr sidecar、构建基块和组件进行通信。

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

4.1、服务调用

在微服务系统中,服务与服务间的调用必不可少,难点主要集中在服务所在位置,发生错误时如何重试,负载均衡等问题。

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简化微服务

序言现有的微服务模式需要再业务代码中集成大量基础设施模块,比如注册中心,服务发现,服务调用链路追踪,请求熔断,重试限流等等,使得系...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

已经是第一篇
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信