JiaHe's Blog

读万卷书,行万里路

熔断(Circuit Breaker)降级(Fallback)是在分布式系统中处理故障和保护系统可用性的两种不同策略,它们有以下区别:

  1. 功能:

    • 熔断:熔断是一种故障保护机制,用于在服务或资源不可用时快速失败,并暂时中断对该服务的请求。它通过监控请求的失败率或错误率来判断服务是否可用,并根据预定义的条件打开或关闭断路器。
    • 降级:降级是一种容错机制,用于在系统负载过高或资源有限时,通过削减非关键功能或返回预设的默认值来保护系统的核心功能。它允许系统在资源不足的情况下仍然提供基本的可用性和功能。
  2. 触发条件:

    • 熔断:熔断通常是根据错误率或失败率来触发的。如果请求的失败率超过了阈值,熔断器就会打开,进而快速拒绝请求,避免对不可用的服务继续发送请求。
    • 降级:降级通常是在系统负载过高或资源有限时触发的。当系统压力过大或资源不足时,降级策略会根据预设的规则或条件切换到备用的、较为简化的功能或返回默认值,以确保系统的基本可用性。
  3. 目的:

    • 熔断:熔断的目的是快速失败,减少对不可用服务的请求,以避免资源浪费和长时间等待。
    • 降级:降级的目的是保护系统的核心功能,在高负载或资源有限的情况下,仍然提供有限但可用的功能,确保系统的基本运行。

虽然熔断和降级是不同的策略,但它们可以结合使用以提高系统的可靠性和性能。通过熔断可以避免对不可用的服务持续发送请求,而通过降级可以在资源紧张的情况下保证系统的基本可用性。

序列化和反序列化是 Java 中用于将对象转换为字节流(序列化)或从字节流中恢复对象(反序列化)的技术。在实际应用中,序列化可以用于对象的持久化存储,网络通信,以及进程间通信等场景。

序列化可以将一个对象转换为一系列字节,这些字节包含了对象的数据和类信息。而在反序列化时,可以通过读取这些字节并重新构造出原来的对象。Java 提供了两种序列化方式,一种是基于 ObjectOutputStreamObjectInputStream 的默认 Java 序列化方式,另一种是基于第三方库的 JSON 或 XML 序列化方式。

要进行序列化,需要让类实现 Serializable 接口,并且定义一个 serialVersionUID 静态变量用于标识序列化版本。同时,需要注意的是某些类型的字段是不可序列化的,例如 transient 修饰的字段、static 字段等。

在实际应用中,需要注意序列化和反序列化带来的性能开销和安全问题。因为使用默认序列化方式的对象会被序列化为二进制流,可能存在被篡改、重放攻击的风险,因此需要采取相应的防护措施。同时,由于默认序列化方式的性能较差,也可以选择使用其他序列化方式如 protobufKryo 等。

将当前邮件合并文件拆分为单独的word和pdf,文件名称以数据源中的“姓名”字段重命名。

Sub MailMergeToPdfBasic()
Dim masterDoc As Document
Dim singleDoc As Document
Dim lastRecordNum As Long
Dim saveDir As String
Dim saveName As String

' 保存路径
saveDir = "C:\Users\JIAHE\Desktop\Output\"

Set masterDoc = ActiveDocument
masterDoc.MailMerge.DataSource.ActiveRecord = wdLastRecord
lastRecordNum = masterDoc.MailMerge.DataSource.ActiveRecord
masterDoc.MailMerge.DataSource.ActiveRecord = wdFirstRecord
Do While lastRecordNum > 0
masterDoc.MailMerge.Destination = wdSendToNewDocument
masterDoc.MailMerge.DataSource.FirstRecord = masterDoc.MailMerge.DataSource.ActiveRecord
masterDoc.MailMerge.DataSource.LastRecord = masterDoc.MailMerge.DataSource.ActiveRecord
masterDoc.MailMerge.Execute False
' 文件名称
saveName = masterDoc.MailMerge.DataSource.DataFields("姓名")
Set singleDoc = ActiveDocument
singleDoc.SaveAs2 _
FileName:=saveDir & saveName & ".docx", _
FileFormat:=wdFormatXMLDocument
singleDoc.ExportAsFixedFormat _
OutputFileName:=saveDir & saveName & ".pdf", _
ExportFormat:=wdExportFormatPDF
singleDoc.Close False
If masterDoc.MailMerge.DataSource.ActiveRecord >= lastRecordNum Then
lastRecordNum = 0
Else
masterDoc.MailMerge.DataSource.ActiveRecord = wdNextRecord
End If
Loop
End Sub

参考

Sub ConvertWordToPDF()
Dim folderPath As String
Dim wordFile As String
Dim pdfFile As String
Dim wordApp As Object

'设置要转换的文件夹路径
folderPath = "C:\Users\JIAHE\Desktop\Output\"

'创建Word应用程序对象
Set wordApp = CreateObject("Word.Application")

'关闭屏幕更新,加快转换速度
wordApp.ScreenUpdating = False

'循环遍历目录下的所有Word文件
wordFile = Dir(folderPath & "*.doc*")
Do While wordFile <> ""
'构造PDF文件名
pdfFile = Left(wordFile, Len(wordFile) - 4) & ".pdf"

'打开Word文件
wordApp.Documents.Open folderPath & wordFile

'将Word文件保存为PDF文件
wordApp.ActiveDocument.ExportAsFixedFormat OutputFileName:= _
folderPath & pdfFile, ExportFormat:=17, OpenAfterExport:=False

'关闭Word文档
wordApp.ActiveDocument.Close

'获取下一个Word文件名
wordFile = Dir()
Loop

'关闭Word应用程序
wordApp.Quit

'恢复屏幕更新
Application.ScreenUpdating = True

End Sub

设备环境

设备IP网卡系统
外网主机192.168.56.30NATWindows
虚拟机OpenVPN-Server192.168.56.29
172.16.30.101
ens33
ens36
CentOS7
虚拟机内网设备172.16.30.102ens36CentOS7
阅读全文 »