首页 > 其他分享 >心酸部署dapr经历,最后一步莫名的遗憾

心酸部署dapr经历,最后一步莫名的遗憾

时间:2023-02-18 00:44:23浏览次数:58  
标签:调用 服务 -- app 莫名 心酸 dapr public

dapr大概的了解,个人理解他就是一个分布式服务的管理,把微服务常用的组件(缓存,消息中间件、分布式锁、安全id4等)和监控以及服务注册、发现等等一系列功能以一个很抽象的方式管理起来。

可能我们部署微服务用consul、ocelot、polly套件、orleans等去实现,但是不可避免的会遇到服务之间的调用等问题,更不用说服务本身的一些列骚操作,dapr刚好帮助我们解决了这些,

服务之间调用Dapr.AspNetCore库,客户端调用的都是dapr管理库Dapr.Client,netcore使用就这两大库,再加上各种yaml配置等,当然它是不局限语言限制。

下面用一个简单的例子来揭露一下他的真面目,项目也很直白,一个client对外,server就是提供服务的一方。

至于代码更是简单的出奇,服务端就只需要一行注入的代码,业务代码不需要做任何改动。

namespace Server
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers().AddDapr(); //关键的服务注册,只需要引入Dapr.AspNetCore包
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            //app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

  

using Microsoft.AspNetCore.Mvc;

namespace Server.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}
namespace Server
{
    public class WeatherForecast
    {
        public DateTime Date { get; set; }

        public int TemperatureC { get; set; }

        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

        public string? Summary { get; set; }
    }
}

 

下面就是客户端调用的代码,只需要引入包Dapr.Client包,当然consul作为服务之间调用就是httpclient调用了。

namespace Client
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
            builder.Services.AddEndpointsApiExplorer();
            builder.Services.AddSwaggerGen();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.UseSwagger();
                app.UseSwaggerUI();
            }

            //app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}
using Dapr.Client;
using Microsoft.AspNetCore.Mvc;

namespace Client.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            //服务之间没有用httpclient调用,用特有的dapr调用。
            var daprClient = new DaprClientBuilder().Build();
            var content = daprClient.InvokeMethodAsync<IEnumerable<WeatherForecast>>(HttpMethod.Get, "getwf", "WeatherForecast").Result;
            _logger.LogInformation($"获取wf成功:{content.ToArray().ToString()}");
            return content.ToArray();
        }
    }
}
namespace Client
{
    public class WeatherForecast
    {
        public DateTime Date { get; set; }

        public int TemperatureC { get; set; }

        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);

        public string? Summary { get; set; }
    }
}

这个例子仅仅只说明了用Dapr微服务之间的调用,这个不是很服务,但是部署和配置等一系列操作就需要docker基础了。

首先要有虚拟机,linux系统,安装好docker,本文没有用到任何yaml文件,所以没用docker-compose。

dapr的安装看官网,还有初始化,安装完docker ps看看这几个服务在不在。

 安装 Dapr CLI 脚手架工具 | Dapr 文档库

aspnetcore发布代码掠过,下面是发布后的代码,我直接拷贝到我的虚拟机home目录下面。

开三个窗口,打开Server

、Client文件夹,分别在对应文件夹执行命令, --app-id 后面就是dapr内部指定的唯一识别,相当于httpclient的IP地址, --dapr-http-port就是dapr的地址端口,--app-port就是dapr服务提供给外部的调用地址端口。

打个比方一个dapr利弊一个docker,部署一个服务起一个docker,服务之间通信那么也就成了docker之间的通信,而且他负责自己服务的一切事情。

看调用代码getwf就是Server在dapr起的唯一名字--app-id, WeatherForecast就是控制器,类似于httpclient的 http://*:port/weatherforecast get调用。

dapr run --app-id clientservice --dapr-http-port 5882 --app-port 5883 dotnet Client.dll
dapr run --app-id getwf --dapr-http-port 5880 --app-port 5881 dotnet Server.dll
  //服务之间没有用httpclient调用,用特有的dapr调用。
            var daprClient = new DaprClientBuilder().Build();
            var content = daprClient.InvokeMethodAsync<IEnumerable<WeatherForecast>>(HttpMethod.Get, "getwf", "WeatherForecast").Result;
            _logger.LogInformation($"获取wf成功:{content.ToArray().ToString()}");

 

查看dapr list可以看到有两个服务在运行中。正常情况我们调用虚拟机ip:5883/weatherforecast就可以了正常访问客户端拿到数据,但是很不幸我失败了,而且还没找到原因。

部署的server服务后会有下面的打印信息,而且我是可以通过5096端口访问的,这说明问题出在dapr上,而不是我们部署的问题。

 

官方文档介绍的不是很多,而且我也只是近期才研究这个,所以这个问题如果有能解答的万分感谢!

配置文件appsettings.json需要指定端口,否则两个以上服务部署会默认5000冲突。

以上的部署仅仅体现它的服务之间是怎么调用的代码实现。

它的其他核心功能状态管理、缓存、异步通信、分布式锁、链路、监控、安全等一系列中间件几乎涵盖了微服务的零零碎碎。

以前一直以为这个是运维的管理工具,去研究实践才认识到代码层面也是需要大量时间学习,就是各种中间件的使用。作为开发不去学习确实有点跟不上时代了。从docker、k8s 到dapr,对于面试开发也挺不容易。

 

标签:调用,服务,--,app,莫名,心酸,dapr,public
From: https://www.cnblogs.com/morec/p/17131840.html

相关文章

  • Dapr v1.10.0 版本已发布
    Dapr是一套开源、可移植的事件驱动型运行时,允许开发人员轻松立足云端与边缘位置运行弹性、微服务、无状态以及有状态等应用程序类型。Dapr能够确保开发人员专注于编写业务......
  • dapr框架概述
    1、原理Dapr向每个计算单元注入一个边车(容器或进程)。边车与事件触发器进行交互,并通过标准的HTTP或gRPC协议与计算单元通信。Dapr通过标准的HTTP和gRPC接口提供内置的状......
  • 在GCP的Kubernetes上安装dapr
    1简介我们之前使用了dapr的本地托管模式,但在生产中我们一般使用Kubernetes托管,本文介绍如何在GKE(GCPKubernetes)安装dapr。相关文章:dapr本地托管的服务调用体验与J......
  • dapr入门与本地托管模式尝试
    1简介Dapr是一个可移植的、事件驱动的运行时,它使任何开发人员能够轻松构建出弹性的、无状态和有状态的应用程序,并可运行在云平台或边缘计算中,它同时也支持多种编程语言和......
  • 给大家准备了程序员专属红包封面,审核通过后我哭了,太心酸了(┬_┬)
    大家好,我是小悟临近春节时,收到微信定制红包封面并送了四千个名额的邀请,就在想,自己去买名额的话1个还1元钱呢,这名额可不能浪费喽(已制好,可领取)。​很多品牌都各自定制了专属......
  • 使用Dapr和.NET 6.0进行微服务实战:Dapr简介
    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。本文是《使用Dapr和.NET6.0进行微服务实战》的第2篇D......
  • 笔记本在使用一段时间后莫名卡顿的解决方法——CPU莫名锁频
    首先要看看是不是因为CPU锁频了。键盘按下Ctrl+Shift+Esc,看看CPU内的速度部分是否保持在零点几。解决方案如果是的话,可以先将电脑关机,然后将所有的外设拔掉,电源也拔掉......
  • 使用Dapr和.NET 6.0进行微服务实战系列
    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。本文是《使用Dapr和.NET6.0进行微服务实战》的第1篇......
  • Pycharm里的venv环境莫名其妙坏了
    我之前在yunPanPlatform用的venv,却莫名其妙不能用了。这个venv是共用的,除了yunPanPlatform,还有BaiduPCS-Py也用这个环境。主要是因为BaiduPCS-Py需要手动pythonsetup.pyd......
  • Qt 操作QList程序莫名崩溃
    RT,QList是私有成员变量,在某个函数里面append或者clear,程序都会莫名崩溃,在“概要信息”提示“ProjectMESSAGE:Thisisnotabug,butaresultofusingQtinternals.Y......