近期项目上面用到了Azure Service Fabric这个服务,它是用来做微服务架构的,由于这套代码和架构都是以前同学留下来的,缺少文档,项目组在折腾时也曾遇到几个问题,这里整理如下,以供参考。
我属于Service Fabric的初学者和使用者,很多概念也都是临时学习的,我们的工程师后续会更加细致的研究它。本文仅从故障排查经验总结的角度做了一点整理,有关这个服务的详细功能,或者官方推荐的最佳实践,请参考 https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-overview
有两种不同的service fabric可供选择。有条件(钱多)的话,可以选择 managed cluster, 省事,因为相当于在service fabric 基础上又封装了一层,简化了管理。

开发环境没有必要设置那么多node,除非你的钱真的富裕得难受了。以上 managed cluster 最少有5个 node(节点),我建议开发环境用原生的 service fabric,然后 1个node就可以了,但可以把虚拟机的尺寸稍微调高一点。它会提示你说这样的设置不适合生产环境,让它提示。

选择一个富裕一点的region,以便更快的扩容,如果真的有那么一天。例如目前 China Region 3 因为是新的,比较富裕。

选择新的操作系统,避免一些出现不必要的问题,如果能用container,更好。

这个 service fabric 是基于一个所谓的 vm scale set 来进行扩展的。这个scale set,你要随时注意它有没有问题。你可以通过调整下面的参考来改变node数量,但要做好心理准备,可能需要的时间比较长。但是正常情况下,你的服务应该不至于down,因为理论上它是逐个机器更新的。

创建service fabric 服务会出现一堆东西,你可能不了解它,但你不能随便删除它,万一有用呢

如果你修改了 vm scale set的东西,一定要及时查看 service fabric cluster的状态,如果它显示为 updating,那么恭喜你,它可能正在更新。但如果它一直显示为updating,你就可能要跟我们一样加几个班了。目前没有看到命令可以重启 service fabric,且错误日志不清晰,所以有时候会让人抓狂。

以上做好了,你可能以为就结束了。然鹅并不是。service fabric的资源中,虽然可以看到有一个 loadbalance的组件,而且也有一个对外的ip地址,但是它不能用来直接做微服务的对外访问,因为你的微服务可能会有N个(理论上),而每个微服务呢,建议要有独立的端口才行。这个无法在loadbalance组件中做设置。

所以你需要有一个Application Gateway 的东西,能接管前端的用户请求,并且做路由。我万万没想到,在这个环节会遇到一些挑战,教训非常惨痛。首先,你需要映射https的端口的话,当然需要准备证书。这个证书,我们建议放在 key vault中。这里要命的地方是,它在创建https listener时会让你上传一个pfx文件,并且必须要有一个password,而从key vault中导出的pfx,默认并不需要password。所以你可能需要下一段代码。
Install-Module AzureRM
Connect-AzureRMAccount -Environment AzureChinaCloud
$vaultName = "xxxxx"
$certificateName = "xxxxx"
$pfxPath = [Environment]::GetFolderPath("Desktop") + "\$certificateName.pfx"
$password = "pass@word1"
$pfxSecret = Get-AzureKeyVaultSecret -VaultName $vaultName -Name $certificateName
$pfxUnprotectedBytes = [Convert]::FromBase64String($pfxSecret.SecretValueText)
$pfx = New-Object Security.Cryptography.X509Certificates.X509Certificate2
$pfx.Import($pfxUnprotectedBytes, $null, [Security.Cryptography.X509Certificates.X509KeyStorageFlags]::Exportable)
$pfxProtectedBytes = $pfx.Export([Security.Cryptography.X509Certificates.X509ContentType]::Pkcs12, $password)
[IO.File]::WriteAllBytes($pfxPath, $pfxProtectedBytes)

先记录了这么多
如何在出现异常时指定全局救援,如果您将Sinatra用于API或应用程序,您将如何处理日志记录? 最佳答案 404可以在not_found方法的帮助下处理,例如:not_founddo'Sitedoesnotexist.'end500s可以通过调用带有block的错误方法来处理,例如:errordo"Applicationerror.Plstrylater."end错误的详细信息可以通过request.env中的sinatra.error访问,如下所示:errordo'Anerroroccured:'+request.env['si
我正在使用ruby标准记录器,我想要每天轮换一次,所以在我的代码中我有:Logger.new("#{$ROOT_PATH}/log/errors.log",'daily')它运行完美,但它创建了两个文件errors.log.20130217和errors.log.20130217.1。如何强制它每天只创建一个文件? 最佳答案 您的代码对于长时间运行的应用程序是正确的。发生的事情是您在给定的一天多次运行代码。第一次运行时,Ruby会创建一个日志文件“errors.log”。当日期改变时,Ruby将文件重命名为“errors.log
在运行Cucumber测试时,我得到(除了测试结果)大量调试/日志相关的输出形式:D,[2013-03-06T12:21:38.911829#49031]DEBUG--:SOAPrequest:D,[2013-03-06T12:21:38.911919#49031]DEBUG--:Pragma:no-cache,SOAPAction:"",Content-Type:text/xml;charset=UTF-8,Content-Length:1592W,[2013-03-06T12:21:38.912360#49031]WARN--:HTTPIexecutesHTTPPOSTusingt
我最近将我的http客户端切换到faraday,一切都按预期工作。我有以下代码来创建连接:@connection=Faraday.new(:url=>base_url)do|faraday|faraday.useCustim::Middlewarefaraday.request:url_encoded#form-encodePOSTparamsfaraday.request:jsonfaraday.response:json,:content_type=>/\bjson$/faraday.response:loggerfaraday.adapterFaraday.default_ada
网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.
我正在使用此代码在我的Sinatra应用程序中启用日志记录:log_file=File.new('my_log_file.log',"a")$stdout.reopen(log_file)$stderr.reopen(log_file)$stdout.sync=true$stderr.sync=true实际的日志记录是使用:logger.debug("Startingcall.Params=#{params.inspect}")事实证明,只有INFO或更高级别的日志消息被记录,而DEBUG消息没有被记录。我正在寻找一种将日志级别设置为DEBUG的方法。 最佳
我有这段代码来跟踪远程日志文件:defdo_tail(session,file)session.open_channeldo|channel|channel.on_datado|ch,data|puts"[#{file}]->#{data}"endchannel.exec"tail-f#{file}"endNet::SSH.start("host","user",:password=>"passwd")do|session|do_tailsession,"/path_to_log/file.log"session.loop我只想在file.log中检索带有ERROR字符串的行,我正在尝
当我为Daemons(1.1.0)gem设置日志记录参数时,我将如何实现与此行类似的行为?logger=Logger.new('foo.log',10,1024000)守护进程选项:options={:ARGV=>['start'],:dir_mode=>:normal,:dir=>log_dir,:multiple=>false,:ontop=>false:mode=>:exec,:backtrace=>true,:log_output=>true} 最佳答案 不幸的是,Daemonsgem不使用Logger。它将STDOUT和S
在Rails3.x应用程序中,我正在使用net::ssh并向远程pc运行一些命令。我想向用户的浏览器显示实时日志。比如,如果两个命令在net中运行::ssh执行即echo"Hello",echo"Bye"被传递然后"Hello"应该在执行后立即显示在浏览器中。这是代码我在rubyonrails应用程序中使用ssh连接和运行命令Net::SSH.start(@servers['local'],@machine_name,:password=>@machine_pwd,:timeout=>30)do|ssh|ssh.open_channeldo|channel|channel.requ
我正在构建一个应该输出日志文件的rubygem。将日志文件存储在哪里是一个好习惯?我正在从我正在构建的Rails网站中提取此功能,我可以在那里简单地登录到log/目录。 最佳答案 理想情况下,使路径可配置(.rc文件、交换机、rails/rack配置等)。如果它是一个Rack中间件,添加在构造函数的参数中指定它的可能性。如果没有提供日志路径,回退到检测日志目录。(我依稀记得它是Rails中的config.paths['log'],但如果可以的话,请确保config在你的gem中使用之前确实指向某些东西在Rails之外使用。)如果