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,对于面试开发也挺不容易。

心酸部署dapr经历,最后一步莫名的遗憾的更多相关文章

  1. spring boot web项目在IDEA下热部署解决办法(四步搞定)

    最近在用spring boot 做一个web站点,修改了类.html.js等,刷新页面,没有生效,非要手动去make一下或者重启,大大降低了开发效率. 什么是热部署? 应用启动后会把编译好的Class ...

  2. IntelliJ IDEA热部署教程,只要两步!

    一.开启idea自动build功能1.File -> Settings -> Build,Execution,Deployment -> Compiler -> Build p ...

  3. Dapr + .NET Core实战(十四)虚拟机集群部署 mDNS + Consul

    前面我们说了在单机模式下和K8S集群下的Dapr实战,这次我们来看看如何在不使用K8S的情况下,在一个传统的虚拟机集群里来部署Dapr. 1.环境准备 我们准备两台centos7虚拟机 Dapr1:1 ...

  4. 乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时

    Dapr是一个由微软主导的云原生开源项目,国内云计算巨头阿里云也积极参与其中,2019年10月首次发布,到今年2月正式发布V1.0版本.在不到一年半的时间内,github star数达到了1.2万,超 ...

  5. Kvm虚拟化的一种打包及部署方案(采用tar包,lvm方式)

    Kvm虚拟化的一种打包部署方案(采用tar包,lvm方式) –-–-–-2016年终总结 一 毕业之后跟师兄学到的第一块主要内容,理解花了不少时间.期间经历了shell的入门.linux基础知识入门. ...

  6. ZStack深度试用:部署、架构与网络及其与OpenStack的对比

    摘要:本文是开源IaaS软件ZStack的深度试用报告,分别从部署.架构和网络三个层面分享作者的试用体验,并与OpenStack进行简单的对比,文章最后也对ZStack的改进方向提出了自己的思考.(转 ...

  7. Dapr + .NET Core实战(十-终篇)K8S运行Dapr

    工作原理 为了实现在k8s上安装Dapr,Dapr需要部署dapr-sidecar-injector.dapr-operator.dapr-placement和dapr-sentry服务. dapr- ...

  8. ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus

    ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus 本文承接我的上一篇博文: ASP.NET 5 Linux部署,那篇文章主要是针对最新的ASP. ...

  9. 关于前期在云服务器上部署TOMCAT服务器的问题

    如果你要将你的项目放在服务器上(针对云服务器),首先你必须要学会前期部署Tomcat的准备, 第一步:安装jdk,配置环境变量 这个比较简单,配置java环境变量最为简单的方法是将java的 (../ ...

  10. 项目实际部署记录(ubuntu)

    服务器为Ubuntu系统 安装JDK版本:jdk-7u79-linux-x64.tar.gz 安装tomcat版本:apache-tomcat-7.0.69.tar.gz 数据库oracle ,已导出 ...

随机推荐

  1. ThinkPHP 6.0 RC2 版本发布——架构升级、精简核心

    自从5.2版本变更为6.0以来,官方一直致力于优化架构和精简核心,同时也在准备手册和测试工作,在经过近1个月的开发迭代后,官方宣布发布ThinkPHP6.0RC2版本. 主要更新 相比较RC1版本更新 ...

  2. 使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个后台管理应用

    使用vite + vue3 + ant-design-vue + vue-router + vuex 创建一个管理应用的记录 使用vite 创建项目 我创建的node 版本是 v16.17.1 使用N ...

  3. (C++) C++虚函数性能分析

    class baseA { public: virtual float mulTwo(float a, float b) = 0; virtual ~baseA() = default; }; cla ...

  4. RNN的PyTorch实现

    官方实现 PyTorch已经实现了一个RNN类,就在torch.nn工具包中,通过torch.nn.RNN调用. 使用步骤: 实例化类: 将输入层向量和隐藏层向量初始状态值传给实例化后的对象,获得RN ...

  5. 【devexpress】spinEdit控件如何设置只能输入两位小数

    只需设置对应的正则表达式即可,我这里设置的是n2意思就是两位小数的意思 效果如下

  6. 关于linux更改root用户下面的鼠标样式

    前言 这几天一直研究关于 lightmd 显示管理器(也就是刚进入系统的用户登录界面)的主题配置问题,我发现鼠标样式和登录个人用户的鼠标样式不一样(之前我也发现了,懒得捣鼓)今天抽出时间研究了一下,这 ...

  7. 【Shell案例】【小数点scale&bc】14、求平均值

    描述写一个bash脚本以实现一个需求,求输入的一个的数组的平均值 第1行为输入的数组长度N第2~N行为数组的元素,如以下为:数组长度为4,数组元素为1 2 9 8示例:41298 那么平均值为:5.0 ...

  8. 基于pyecharts的中医药知识图谱可视化

    基于pyecharts的中医药知识图谱可视化 关键词: pyecharts:可视化:中医药知识图谱 摘要: 数据可视化是一种直观展示数据结果和变化情况的方法,可视化有助于知识发现与应用.Neo4j数据 ...

  9. Hadoop如何保证自己的江湖地位?Yarn功不可没

    前言 任何计算任务的运行都离不开计算资源,比如CPU.内存等,那么如何对于计算资源的管理调度就成为了一个重点.大数据领域中的Hadoop之所以一家独大,深受市场的欢迎,和他们设计了一个通用的资源管理调 ...

  10. git cherry-pick 同步修改到另一个分支

    我们在开发中有时会遇到,需要将另一个分支部分修改同步到当前分支. 如下图,想把 devA 分支中 commit E 和 F,同步到下面绿色的 devB 分支中. 这时候就可以使用 git cherry ...