当前位置: 首页 > news >正文

部署dapr的辛酸历程

前言

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/swashbucklebuilder.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]")]publicclass WeatherForecastController : ControllerBase{privatestaticreadonlystring[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};privatereadonly 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
{publicclass WeatherForecast{public DateTime Date { get; set; }publicint TemperatureC { get; set; }publicint TemperatureF => 32 + (int)(TemperatureC / 0.5556);publicstring? Summary { get; set; }}
}

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

namespace Client
{publicclass Program{publicstaticvoid 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]")]publicclass WeatherForecastController : ControllerBase{privatereadonly 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
{publicclass WeatherForecast{public DateTime Date { get; set; }publicint TemperatureC { get; set; }publicint TemperatureF => 32 + (int)(TemperatureC / 0.5556);publicstring? Summary { get; set; }}
}

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

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

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

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 的--app-port需要跟dotnet启动服的端口保持一致。比较看好dapr,netcore微服务架构是个不错的选择,还有未来也很看好。部署没问题了,后面就是学习微服务中运用dapr的间件。

相关文章:

部署dapr的辛酸历程

前言dapr大概的了解&#xff0c;个人理解他就是一个分布式服务的管理&#xff0c;把微服务常用的组件(缓存&#xff0c;消息中间件、分布式锁、安全id4等)和监控以及服务注册、发现等等一系列功能以一个很抽象的方式管理起来。可能我们部署微服务用consul、ocelot、polly套件、…...

golang入门笔记——内存管理

文章目录自动内存管理概念自动内存管理-相关概念&#xff1a;追踪垃圾回收&#xff1a;分代GC&#xff08;Generational GC&#xff09;引用计数内存分配Go内存分配-分块Go内存分配——多级缓存Go内存管理优化Balanced GC自动内存管理 概念 1.动态内存 程序在运行时根据需求…...

97. 约数之和

Powered by:NEFU AB-IN Link 文章目录97. 约数之和题意思路代码97. 约数之和 题意 假设现在有两个自然数 A和 B&#xff0c;S是 A^B的所有约数之和。 请你求出 S mod 9901的值是多少。 思路 ABA^BAB的约数之和为&#xff1a;sumAB(1p1p12...p1Ba1)(1p2p22...p2Ba2)...sum_{A^B…...

想和20岁的自己说

男生床头千万不要放卫生纸不要叫自己的女朋友早睡&#xff0c;更不能叫她早起&#xff0c;否则有你好受的。成年人的默契&#xff1a;和异性单独出去旅游&#xff0c;如果没有明确拒绝开一间房&#xff0c;那基本上默认后面会发生的事情不要去考验人性&#xff0c;世上99%的人经…...

Unit Test and Integration Test

Unit Test and Integration Test Background It is the first time that I try to write an article in English. In the past, I didn’t write test code. Just thinking QA is responsible for testing. As a developer, I don’t need to care about tests. Although I …...

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题(3)

目录 模块A 基础设施设置与安全加固 &#xff08;本模块20分&#xff09; 一、项目和任务描述&#xff1a; 假定你是某企业的网络安全工程师&#xff0c;对于企业的服务器系统&#xff0c;根据任务要求确保各服务正常运行&#xff0c;并通过综合运用用户安全管理与密码策略、…...

智慧城市应急指挥中心数字化及城市驾驶舱建设方案

目 录 第一章 项目概述 1.1 项目背景 1.2 项目范围 第二章 建设内容 2.1 三维可视化平台 2.1.1 多源数据接入 2.1.2 可视化编排 2.1.3 三维可视化编辑 2.1.4 空间数据可视化 2.1.5 集成框架支持 2.2 可视化场景定制开发 2.2.1 城市驾驶总舱 2.2.2 城市安全分舱 2.…...

HSCSEC 2023 个人练习

&#x1f60b; 大家好&#xff0c;我是YAy_17&#xff0c;是一枚爱好网安的小白。本人水平有限&#xff0c;欢迎各位大佬指点&#xff0c;欢迎关注&#x1f601;&#xff0c;一起学习 &#x1f497; &#xff0c;一起进步 ⭐ 。⭐ 此后如竟没有炬火&#xff0c;我便是唯一的光。…...

Android 基础知识4-2.7 RelativeLayout(相对布局)

一、RelativeLayout的概述 RelativeLayout&#xff08;相对布局&#xff09;是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式。在很多时候&#xff0c;线性布局还不能满足我们的需求&#xff0c;比如&#xff0c;我们在一行&#xff08;列&#xff09;上显示多个控…...

关于云计算,我们问了ChatGPT 10个问题

ChatGPT懂云计算吗&#xff1f;前些天&#xff0c;我们问了ChatGPT&#xff08;非Plus收费版&#xff09;一些问题。1. 什么是云计算&#xff1f;2. 云计算行业的护城河是什么&#xff1f;3. 什么是云原生&#xff1f;4. 微软Azure与亚马逊AWS的主要区别是什么&#xff1f;5. 为…...

Netty学习笔记1

Netty学习笔记&#xff08;一&#xff09; 在的互联网环境下&#xff0c;分布式系统大行其道&#xff0c;而分布式系统的根基在于网络编程&#xff0c;而 Netty 恰恰是 Java 领域网络编程的王者。如果要致力于开发高性能的服务器程序、高性能的客户端程序&#xff0c;必须掌握…...

RISK-V品牌的中国化历程(中)

目录 1.技术优势 出道即巅峰 2.生态布道 品牌根植中国 3.应用场景 加速品牌的商业化运作 生态布道 品牌根植中国 2015年成立非盈利组织RISC-V基金会&#xff0c;目前已吸引全球28个国家327家会员&#xff0c;包括英伟达、联发科、苹果、特斯拉、谷歌、高通、IBM、三星、麻省理…...

2023.02.19 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.本文贡献5.方法5.1 Local Representation Learning5.2 Global Representation Learning5.3 Item Similarity Gating6.实验6.1 数据集6.2 结果7.结论深度学习1.对偶问题1.1 拉格朗日乘数法1.2 强对偶性2.SVM优化3.软间隔3.1 解决问题3.…...

枚举类的使用方法

一、理解枚举类型 枚举类型是Java 5中新增特性的一部分&#xff0c;它是一种特殊的数据类型&#xff0c;之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束&#xff0c;但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。下面先来看看如何写…...

.NET3.5安装步骤及相关问题。

.NET3.5全称 Microsoft.NETFramework3.5 最新版本-.NET4.8 第一步打开控制面板 windows系统打开控制面板 选择程序 选择.NET3.5安装。 可能会出现问题。 解决方案&#xff1a; 报错代码80240438的常用解决办法&#xff1a; 方法一&#xff1a;检测windows update servic…...

联想M7268激光打印机开机红绿灯双闪报错不打印

故障现象: 一台联想M7268激光打印机开机后电源键、复印键一起双闪,电源键闪红灯、复印键闪绿灯; 检测维修: 根据闪灯故障判断如果无卡纸异常情况下可能是激光器故障,因为以前曾经维修过一台一模一样的机器故障基本相同,先打开机器吧,把硒鼓拿出来先看看有没有卡纸,进纸…...

产品经理知识体系:7.web和app产品需求设计

web和app产品需求设计 思考 笔记 web产品设计 一、交互设计 1.以用户为中心的设计&#xff1a;功能、体验、用户&#xff1b; 将产品功能转化成用户的体验&#xff0c;功能和体验的结合。 2.交互设计模式 交互逻辑 信息结构 信息内容 界面结构 导航设计 二、视觉设计 元素的…...

强化学习概述

一、Modelfree 和 Modelbased Modelfree&#xff1a;不需要理解环境 Modelbased&#xff1a;需要理解环境&#xff0c;并且为环境建立模型 Model-free 中, 机器人只能按部就班, 一步一步等待真实世界的反馈, 再根据反馈采取下一步行动. 而 model-based, 他能通过想象来预判断接…...

NO.1嵌入式入门笔记:常用命令记录

一、前言 Linux文件目录&#xff1a; Linux Shell&#xff1a; 它负责接收用户的输入&#xff0c;根据用户的输入找到其它程序并运行。比如我们输入“ls”并回车时&#xff0c;shell 程序找到“ls”程序并运行&#xff0c;把结果打印出来。Shell有多种实现&#xff0c;我们常用…...

Shell编程

typora-copy-images-to: pictures typora-root-url: pictures 文章目录typora-copy-images-to: pictures typora-root-url: pictures本节课程目标语法和选项语法和选项3. sort工具语法和选项5.tee工具6.diff工具语法和选项7. paste工具8. tr工具语法和选项小试牛刀二、bash的特…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说&#xff0c;传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度&#xff0c;通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork&#xff08;创建个人副本&#xff09;步骤 2: Clone&#xff08;克隆…...

CSS 工具对比:UnoCSS vs Tailwind CSS,谁是你的菜?

在现代前端开发中&#xff0c;Utility-First (功能优先) CSS 框架已经成为主流。其中&#xff0c;Tailwind CSS 无疑是市场的领导者和标杆。然而&#xff0c;一个名为 UnoCSS 的新星正以其惊人的性能和极致的灵活性迅速崛起。 这篇文章将深入探讨这两款工具的核心理念、技术差…...