1 定义:计算机资源虚拟化

  • 服务器虚拟化主要通过
    软件技术

    物理服务器

    硬件资源抽象化
    ,创建多个独立的
    虚拟服务器环境

虚拟化技术是当今云计算、大数据和AI得以繁荣发展的核心基础技术。

2 虚拟化技术方向

以下是一些常见的服务器虚拟化方式和工具:

基于hypervisor的虚拟化

  • Hypervisor技术: 也称为
    虚拟机监视器

    Virtual Machine Monitor

    VMM
    ),是一种运行在物理服务器和操作系统之间的软件。

它允许多个操作系统在同一台物理服务器上同时运行。Hypervisor提供了虚拟化技术的核心功能,使得每个操作系统实例(即虚拟机)都能够独立运行,就像它们各自运行在独立的物理机器上一样。

根据
Hypervisor

宿主操作系统
的关系,它们可以分为两大类:

  • Type-1 Hypervisor(裸机Hypervisor):直接运行在物理硬件之上,
    不依赖于宿主操作系统

这种类型的Hypervisor提供了更好的性能和资源利用率,因为它们直接控制硬件资源。
常见的实现方案有: VMware vSphere ESXi、Microsoft Hyper-V和Citrix XenServer。

  • Type-2 Hypervisor(宿主型Hypervisor):运行在
    宿主操作系统
    之上

常见的实现方案有:
VMware Workstation

Oracle VirtualBox

这种类型的Hypervisor通常用于个人电脑或开发环境,因为它们不需要直接访问硬件资源。

Hypervisor是现代数据中心和云计算环境中的关键技术,它们使得服务器资源的利用更加灵活和高效,同时也支持了虚拟化技术的发展。

  • Hypervisor的主要功能:
  1. 资源管理:Hypervisor管理着物理服务器的资源(如CPU、内存、存储和网络接口),并将其分配给各个虚拟机。
  2. 隔离性:Hypervisor确保各个虚拟机之间的操作是相互隔离的,一个虚拟机的故障或安全问题不会影响到其他虚拟机。
  3. 调度:Hypervisor负责CPU时间的分配,确保各个虚拟机能够公平地访问CPU资源。
  4. 设备模拟:Hypervisor模拟硬件设备,使得虚拟机可以像在真实硬件上一样运行。
  5. 安全性:Hypervisor提供了一个安全的环境,可以防止虚拟机之间的相互干扰。

操作系统级虚拟化

  • 在操作系统层面上实现虚拟化,通过在
    单个操作系统
    【内核】中创建多个
    独立的用户空间实例

这种方式的优点是资源利用率高、启动速度快,但隔离性相对较弱
常见的实现方案有: Linux容器(如Docker)和Solaris Zones等

3 虚拟化工具

常见的服务器虚拟化工具

  • VMware vSphere/ESXi:企业级虚拟化平台,提供数据中心虚拟化产品和应用程序及基础架构管理工具
  • Microsoft Hyper-V:作为Windows Server的组成部分,提供基于Hypervisor的服务器虚拟化技术
  • Citrix XenServer:基于开源Xen系统管理程序的服务器虚拟化系统,提供接近裸机的性能
  • Red Hat Virtualization (RHV):基于KVM的虚拟化平台,适用于企业级环境
  • Oracle VM:提供可伸缩、低成本的服务器虚拟化
  • Proxmox VE:基于Debian的开源虚拟化平台,结合了KVM和LXC技术,提供易于使用的Web界面和丰富的管理功能
  • KVM (Kernel-based Virtual Machine):开源免费,直接集成到Linux内核,性能高效

注:支持基于JVM,虚拟化 Windows

这些工具和方式各有特点,适用于不同的场景和需求,可以根据具体的业务需求选择合适的虚拟化解决方案。

Y FAQ

Q: VirtualBox vs. VMware Workstation 的区别?

  • VirtualBox

    VMware
    是两种不同的虚拟化软件,它们之间有以下比较 :
    • 开源 vs 商业:VirtualBox是开源的,VMware是商业产品。
    • 适用场景:VirtualBox适合个人和小型企业,VMware适合大型企业和数据中心。
    • 性能:VMware Workstation Pro性能较高,特别在3D加速方面。
    • 管理功能:VMware功能更强大,VirtualBox较弱。
    • 限制:VirtualBox对虚拟机有一些限制,如CPU核心数等。

详情参见:
再议 VirtualBox 与 VMware 对比,VirtualBox 没有你想的那么不堪 - dev.leiyanhui.com

  • VirtualBox
svn co https://www.virtualbox.org/svn/vbox/trunk vbox
  • VMware

https://www.vmware.com/products/desktop-hypervisor/workstation-and-fusion
https://support.broadcom.com/group/ecx/productfiles?subFamily=VMware%20Workstation%20Pro

Q:如果按cpu模拟与否来分类虚拟化技术,可以怎么划分?

  • 用代码来模拟cpu的: qemu,bochs,pcem,模拟更彻底,适合操作系统的编程和研究。

运行速度稍慢,是代码模拟cpu的必然结果,一般用户会计较速度。但对于底层编程的程序员来说,第一类适应性最广,可以在x86机型上跑出其它各种cpu,是第二类做不到的。

  • 直接使用主机cpu的:vmware,virtualbox,kvm,适合跑一般软件。

至于vmware和virtualbox之间的差别,就目前当然还是vmware性能更好,细分功能更多,诸如商业服务器都是选择vmware。

X 参考文献

虚拟化技术的发展过程 / Virtual Machines VS. Docker

推荐一个简单易用、轻量级的C#开源WebSocket服务端库,方便我们快速实现WebSocket的开发。

01 项目简介

Fleck 是一个用 C# 编写的轻量级 WebSocket 服务器库。它提供了一个简单而直观的 API,使得开发者可以轻松地在他们的应用程序中集成 WebSocket 功能,比如一些常见的实时通信应用,在线游戏、聊天应用和实时数据更新等场景。

Fleck 的设计目标是易于使用和高性能,同时保持代码的简洁性。

02 项目优缺点

1、优点

简单易用:
Fleck 的 API 设计简洁,不需要复杂的配置或继承,使得开发者可以快速上手。

无依赖:
Fleck 不依赖于 HttpListener 或 HTTP.sys,这意味着它可以在没有这些组件的系统上运行,如 Windows 7 和 Server 2008。

2、缺点

功能限制:
Fleck 专注于简单和轻量,不包含一些高级功能,如复杂的认证机制或详细的统计信息。

03 使用方法

1、一个简单的 WebSocket 服务器的示例

// 创建一个新的 WebSocket 服务器实例,监听在所有网络接口的 8181 端口上。
var server = new WebSocketServer("ws://0.0.0.0:8181");

// 调用 server 实例的 Start 方法启动服务器。
// Start 方法接受一个 lambda 表达式作为参数,该表达式定义了如何处理新的 WebSocket 连接。
server.Start(socket =>
{
    // 当 WebSocket 连接打开时,触发 OnOpen 事件,并输出 "Open!" 到控制台。
    socket.OnOpen = () => Console.WriteLine("Open!");

    // 当 WebSocket 连接关闭时,触发 OnClose 事件,并输出 "Close!" 到控制台。
    socket.OnClose = () => Console.WriteLine("Close!");

    // 当服务器接收到来自客户端的消息时,触发 OnMessage 事件。
    // 这个事件的处理程序接收一个参数 message,它包含了从客户端接收到的消息。
    // 然后,使用 socket.Send 方法将接收到的消息发送回客户端。
    socket.OnMessage = message => socket.Send(message);
});

2、安全WebSockets (wss://)

// 创建一个新的 WebSocket 服务器实例,监听在所有网络接口的 8431 端口上,并使用 wss 协议,即 WebSocket Secure。
var server = new WebSocketServer("wss://0.0.0.0:8431");

// 为服务器设置一个 X509 证书,这个证书用于建立 TLS/SSL 加密连接。
// "MyCert.pfx" 是证书文件的名称,通常包含证书和私钥。
server.Certificate = new X509Certificate2("MyCert.pfx");

// 调用 server 实例的 Start 方法启动服务器。
server.Start(socket =>
{
    //...use as normal 
});

3、子协议

// 创建一个新的 WebSocket 服务器实例,监听在所有网络接口的 8181 端口上,并使用 ws 协议,即非加密的 WebSocket。
var server = new WebSocketServer("ws://0.0.0.0:8181");

// 设置服务器支持的子协议列表。子协议允许客户端和服务器之间协商使用特定的通信协议。
// 在这个例子中,服务器声明支持 "superchat" 和 "chat" 两个子协议。
server.SupportedSubProtocols = new []{ "superchat", "chat" };

// 调用 server 实例的 Start 方法启动服务器。
// Start 方法接受一个 lambda 表达式作为参数,该表达式定义了如何处理新的 WebSocket 连接。
server.Start(socket =>
{
    //socket.ConnectionInfo.NegotiatedSubProtocol is populated
});

4、自定义日志

ILog logger = LogManager.GetLogger(typeof(FleckLog));

FleckLog.LogAction = (level, message, ex) => {
  switch(level) {
    case LogLevel.Debug:
      logger.Debug(message, ex);
      break;
    case LogLevel.Error:
      logger.Error(message, ex);
      break;
    case LogLevel.Warn:
      logger.Warn(message, ex);
      break;
    default:
      logger.Info(message, ex);
      break;
  }
};

5、禁用Nagle算法

var server = new WebSocketServer("ws://0.0.0.0:8181");
server.ListenerSocket.NoDelay = true;
server.Start(socket =>
{
  //Child connections will not use Nagle's Algorithm
});

6、自动监测错误重新启动

var server = new WebSocketServer("ws://0.0.0.0:8181");
server.RestartAfterListenError = true;
server.Start(socket =>
{
  //...use as normal
});

04

支持WebSocket版本

Hixie-Draft-76/Hybi-00(Safari 5,Chrome < 14,Firefox 4)

Hybi-07(Firefox 6)

Hybi-10(Chrome 14-16,Firefox 7)

Hybi-13(Chrome 17+,Firefox 11+,Safari 6+,Edge 13+(?))

05 项目地址

https://github.com/statianzo/Fleck

更多开源项目:
https://github.com/bianchenglequ/NetCodeTop

- End -

推荐阅读

2个零基础入门框架教程!

推荐一个Star超过2K的.Net轻量级的CMS开源项目

Pidgin:一个轻量级、快速且灵活的 C# 解析库

Atata:一个基于 Selenium的C#自动化测试Web框架

mongo-csharp-driver:MongoDB官方的C#客户端驱动程序!

使用 brew 安装特定版本软件

背景

brew
是 Mac 下非常好用的包管理工具,可以方便的下载并安装各种软件,类似于 Ubuntu 下的
apt-get
以及 centos 下的
yum

但是
brew
使用
git
来管理软件包,所以安装的软件包版本会随着其源仓库的更新而更新

如果需要安装旧版本软件,相对麻烦,这里记录一下方法

方法一:直接安装

部分软件包可以直接通过 brew install 安装指定版本,例如
python

brew search python@
==> Formulae
python@3.10         python@3.12 ✔       python@3.8
python@3.11         python@3.13 ✔       python@3.9

# 安装 python 3.10
brew install python@3.10

方法二:利用历史的 rb 文件安装

先利用 brew info 找到其 rb 文件的地址,然后去 GitHub 上找到历史版本的 rb 文件

  • 下载/复制文本到本地,然后使用该 rb 文件安装
  • 或者只用用该文件的链接地址安装

下面以安装 hugo 0.136.5 为例

# 查看 hugo 信息
brew info hugo
==> hugo: stable 0.139.4 (bottled), HEAD
Configurable static site generator
https://gohugo.io/
Installed
/opt/homebrew/Cellar/hugo/0.136.5 (53 files, 68.8MB) *
  Poured from bottle on 2024-12-11 at 23:27:01
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/h/hugo.rb
License: Apache-2.0
==> Dependencies
Build: go ✘
==> Options
--HEAD
        Install HEAD version
==> Caveats
zsh completions have been installed to:
  /opt/homebrew/share/zsh/site-functions
==> Analytics
install: 15,963 (30 days), 49,454 (90 days), 203,875 (365 days)
install-on-request: 15,967 (30 days), 49,453 (90 days), 203,857 (365 days)
build-error: 52 (30 days)

访问下
https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/h/hugo.rb

进入 history 页面

在 history 中找到需要的版本,然后复制链接地址

寻找需要的版本

复制链接地址

然后在本地安装即可

# 下载 rb 文件并安装
wget https://raw.githubusercontent.com/Homebrew/homebrew-core/HEAD/Formula/h/hugo.rb
brew install ./hugo.rb

# 或者直接使用链接地址
brew install https://raw.githubusercontent.com/Homebrew/homebrew-core/HEAD/Formula/h/hugo.rb

参考资料

本文作者:
ywang_wnlo
本文链接:
https://ywang-wnlo.github.io/posts/89785ced/
版权声明:
本博客所有文章除特别声明外,均采用
BY-NC-SA
许可协议。转载请注明

前言

开发一个安全、灵活且易于维护的应用程序是至关重要的。特别是在企业级应用中,权限管理不仅涉及到用户访问控制,还关系到数据的安全性和系统的稳定性。

推荐一款 WinForm 通用、完整的权限架构开发框架,强大而简便的工具,帮助我们快速开发具备完善权限管理功能的 WinForms 应用。

项目介绍

WinForms 通用开发框架是一个简单实用的二次开发框架,内置完整的权限架构,涵盖菜单、角色、用户、字典、日志、代码生成等一系列系统常规模块。

该框架为了一般管理系统避免重复造轮,开发无需关注权限管理和页面布局。新增功能时,只需新增 Form 界面并完成业务逻辑,在系统配置中进行设置即可。

WinForm 原生控件版本

  • 数据库:Sqlserver
  • ORM 框架:SqlSugar
  • UI 框架:无 - 使用原生 WinForms 控件
  • 业务代码生成:支持
  • 自动更新:支持
  • 权限管控:支持
  • 软件架构:单机应用

核心功能与特性

  • 内置完整的权限架构,涵盖菜单、角色、用户管理等模块,确保系统的安全性与灵活性。
  • 业务代码生成功能,简化了常见业务逻辑的开发流程,提高了开发效率。
  • 自动更新机制,保证应用程序始终处于最新状态,减少了维护成本。
  • 专注于单机环境,适用于不需要复杂网络通信的应用场景。

Dev 前后端分离版本

  • 数据库:MySQL
  • ORM 框架:SqlSugar
  • UI 框架:DevExpress
  • 软件架构:前后端分离

核心功能与特性

业务代码生成:支持,简化了业务逻辑的开发流程。

Form 代码生成:支持单表和主从表,显著提高了表单开发效率。

Controller 代码生成:支持,快速构建 API 接口。

强大的权限管理

  • 权限管控:内置完整的权限管理体系,涵盖菜单、角色、用户管理等功能,确保系统的安全性和灵活性。
  • 在线用户管理:实时监控和管理在线用户,提升系统运维能力。

高效的开发与维护

  • API 访问日志:记录所有 API 请求,便于调试和审计。
  • 数据分页:支持高效的数据分页,优化用户体验。
  • 通用查询:提供灵活的查询接口,满足多样化的数据检索需求。
  • 持续更新:定期发布更新,保证系统的稳定性和安全性。

自动化与扩展性

  • 自动更新:内置自动更新机制,确保应用程序始终处于最新状态。
  • 前后端分离:采用现代化的前后端分离架构,前端专注于用户体验,后端专注于业务逻辑处理,提升了开发效率和系统的可维护性。

项目使用

1、先还原数据库

确保 MySQL 数据库服务器已安装并运行。

打开命令提示符或使用图形化工具等。

2、配置程序连接

检查网络连接

确保机器能够连接到外网。如果无法连接外网,可能会导致自动更新失败,进而引发"连接服务器异常"的错误。

修改配置文件

如果不需要自动更新,可以在配置文件中将 AutoUpdate 设置为 false。


打开应用程序的配置文件(通常是 app.config 或 web.config),找到类似以下的设置项:

<add key="AutoUpdate" value="true" />

修改为:

<add key="AutoUpdate" value="false" />

部署本地更新服务器

如果希望保留自动更新功能,建议将更新服务器部署在本机。

可以使用 AutoUpdater.NET 进行本地部署,相关文件和说明可以在项目中找到。

部署教程可以参考 AutoUpdater.NET 官方文档 或通过搜索引擎查找详细指南。

3、运行程序

完成上述配置后,尝试启动应用程序。

如果仍然遇到问题,请确保所有依赖服务(如数据库服务)正在运行,并且配置文件中的连接字符串正确无误。

项目效果

1、Winform 原生控件版本效果

自动更新

角色管理

消息通知

2、Dev前后端分离版本效果

系统管理

项目地址

Gitee:
https://gitee.com/wkjerry_admin/WinformGeneralDeveloperFrame

总结

以上仅展示了WinForm 通用权限框架的部分功能。更多实用特性和详细信息,请大家访问项目地址。

希望通过本文能为WinForm开发提供有价值的参考。欢迎在评论区留言交流,分享您的宝贵经验和建议。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号
[DotNet技术匠]
社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!

如今,应用程序智能化已成趋势,开发者想要实现智能化,那么首先需要赋予应用理解自然语言的能力,使其能够准确地听懂人话,进而响应用户需求,并提供一系列智能化服务。比如用户语音控制应用程序帮忙订票,应用程序在将语音转换成文字后,需要通过技术处理准确地理解指令内容,才可以拉取对应程序功能提供服务。

HarmonyOS SDK
自然语言理解服务
(Natural Language Kit)提供了多项文本语义理解相关的基础能力,目前包括
分词

实体抽取
,能够帮助开发者更好地处理和分析文本数据。

分词

分词可以将一段文本切分成独立的词语单元,识别出句子中的每个词汇,包括中文、英文和数字内容,从而为后续的语义分析、信息提取等任务奠定基础。

在实际应用场景中,搜索引擎就便用到了这一功能,当用户输入需要搜索的文本内容,搜索引擎将会先对其进行分词处理,在提取关键词后再进行匹配搜索。

开发步骤

分词处理的开发共分为3个步骤。

1.引用相关类添加至工程。

import { textProcessing } from '@kit.NaturalLanguageKit';

2.配置输入文本框和按钮,调用分词textProcessing.getWordSegment接口。

let inputText: string = '';

TextInput({ placeholder: '请输入文本' })
  .height(40)
  .fontSize(16)
  .width('90%')
  .margin(10)
  .onChange((value: string) => {
    this.inputText = value;
  })

Button('获取分词结果')
  .type(ButtonType.Capsule)
  .fontColor(Color.White)
  .width('45%')
  .margin(10)
  .onClick(async () => {
    try {
      let result = await textProcessing.getWordSegment(this.inputText);
      this.outputText = this.formatWordSegmentResult(result);
    } catch (err) {
      console.error(`getWordSegment error: ${err.message}`);
    }
  })

3.在界面上展示分词结果。

private formatWordSegmentResult(segments: textProcessing.WordSegment[]): string {
  let output = 'Word Segments:\n';
  segments.forEach((segment, index) => {
    output += `Word[${index}]: ${segment.word}, Tag: ${segment.wordTag}\n`;
  });
  return output;
}

实体抽取

实体抽取是实现自然语言处理的一项关键能力,它能够精准地从文本中识别出具有特定意义的实体信息,例如人名、地名、时间日期、数字、电话号码、邮箱地址等。开发者可以通过实体抽取能力,结合自身业务场景开发各种智能化应用程序,提高用户服务体验。

例如,在新闻阅读场景中,开发者可以通过该能力对新闻正文进行实体抽取,并对人名、地名、时间、网址等关键实体信息进行高亮标识,从而帮助读者快速获取文章要点,有效提升信息获取效率;在用户填写收货地址的场景中,开发者可以借助实体抽取能力快速识别抽取收件人姓名、地址、手机号等信息,在用户填写表单时提供结构化的文本信息,供用户快速填充表单。

开发步骤

实体抽取的开发共分为4个步骤。

1.引用相关类添加至工程。

import { textProcessing, EntityType } from '@kit.NaturalLanguageKit';

2.配置输入文本框。

let inputText: string = '';

TextInput({ placeholder: '请输入文本' })
  .height(40)
  .fontSize(16)
  .width('90%')
  .margin(10)
  .onChange((value: string) => {
    this.inputText = value;
  })

3.配置按钮,调用实体抽取textProcessing.getEntity接口。

Button('获取实体结果')
  .type(ButtonType.Capsule)
  .fontColor(Color.White)
  .width('45%')
  .margin(10)
  .onClick(async () => {
    try {
      let result = await textProcessing.getEntity(this.inputText, {entityTypes: [EntityType.NAME, EntityType.PHONE_NO]});
      this.outputText = this.formatEntityResult(result);
    } catch (err) {
      console.error(`getEntity error: ${err.message}`);
      this.outputText = 'Error occurred while getting entities.';
    }
  })

4.在界面上展示实体抽取结果。

private formatEntityResult(entities: textProcessing.Entity[]): string {
  if (!entities || !entities.length) {
    return 'No entities found.';
  }

  let output = 'Entities:\n';
 for (let i = 0; i < entities.length; i++) {
    let entity = entities[i];
    output += `Entity[${i}]:\n`;
    output += `  oriText: ${entity.text}\n`;
    output += `  charOffset: ${entity.charOffset}\n`;
    output += `  entityType: ${entity.type}\n`;
    output += `  jsonObject: ${entity.jsonObject}\n\n`;
  }
  return output;

自然语言理解服务作为构成智能化应用开发的基础能力,可广泛应用于新闻阅读、信息检索、客户服务、社交聊天、金融运营等多种场景。随着技术的不断进步,我们期待广大开发者继续探索和创新,以发掘更多智能化应用的可能性,推动行业更高层次的智能化发展。

了解更多详情>>

访问
自然语言理解服务联盟官网

获取
自然语言理解服务开发指导文档