为.NET 泛型主机的应用程序提供自安装为服务进程的能力,支持windows和linux平台。
功能
虽然.NetCore提供了Microsoft.Extensions.Hosting.Systemd
和Microsoft.Extensions.Hosting.WindowsServices
两个服务生命周期包,但在服务安装这块目前还非常不便:在windows平台,需要管理员身份使用sc.exe工具来安装服务;在linux平台,需要自己手动写服务单元文件和使用systemctl加载服务。不常用的sc和服务单元文件的内容知识,就像学了外语之后又长期不用外语的我们一样,时间一久就忘记。而且windows服务进程的默认工作目录是%SystemRoot%\System32
,在没有日志组件的帮助下,sc.exe
安装的服务在运行后我们可能就掉到工作目录的坑里,影响包括但不限于配置文件的读取、asp.netcore
的ContentRoot、wwwroot静态文件等。
ServiceSelf提供自我服务安装
的能力,它提供了windows服务和linux的systemd服务的公共参,同时另外提供windows独有的服务配置和systemd独有的完整服务配置,此外还解决了windows服务没有工作目录
配置的缺陷。
现在,你可以在使用ServiceSelf描述服务:
var serviceName = "myapp";
var serviceOptions = new ServiceOptions
{
Arguments = new[] { new Argument("key", "value") },
Description = "这是演示示例应用",
};
serviceOptions.Linux.Service.Restart = "always";
serviceOptions.Linux.Service.RestartSec = "10";
serviceOptions.Windows.DisplayName = "演示示例";
serviceOptions.Windows.FailureActionType = WindowsServiceActionType.Restart;
// serviceName和serviceOptions甚至可以为null
if (Service.UseServiceSelf(args, serviceName, serviceOptions))
{
var host = Host.CreateDefaultBuilder(args)
// 为Host配置UseServiceSelf()
.UseServiceSelf()
.Build();
host.Run();
}
然后在控制台下以管理员或root身份执行如下命令:
./myapp start // 安装并启动服务
在控制台下以管理员或root身份执行如下命令:
./myapp stop // 停止并删除服务
虽然有文件日志、大型的日志采集平台或框架等,但他们也取代不了控制台实时显示的日志,相反他们是互补的。控制台模式启动时,我们很容易直接在控制台看到实时日志的打印,但安装为服务后,查看控制台日志变得不容易或无法实现,在linux平台有journalctl
,它是基于管道的,它无法知道一条日志内容的边界,很难把符合过滤特征的日志完整显示;windows平台有session隔离机制,服务进程和桌面用户进程不在同一个session,所以桌面用户看不到服务进程的控制台,也没有管道可以重定向来读取服务进程的控制输出。
ServiceSelf为服务进程集成了"自研的"的基于管道传输的Google.Protobuf结构化日志提供者,在监听者开启监听之后,这个日志提供者才会工作,把结构化的日志传输给监听者,监听者可以使用关键词来过滤得到完整的一条结构化日志,而不是只过滤得一条日志内容的某一行或几行,再把完整的结构化日志打印到监听者的Console上。也就是它不会在服务进程上让日志无脑地输出到串行化输出的低性能控制台,也不会让服务进程在没有监听者的情况下无脑的输出Google.Protobuf结构化日志,即这个日志组件对服务进程没有性能影响。
之所以要自己实现基于管道传输的Google.Protobuf结构化日志提供者,而不直接使用Microsoft的EventSourceLoggerProvider
,是因为跨进程读取日志时需要依赖Microsoft.Diagnostics.Tracing.TraceEvent
,这个包非常大而全,其依赖项也特别多,而我们仅仅日志这一小功能而已。
由于监听者与服务进程是同一个应用程序的不同进程,当应用程序的OutputType是WinExe模式且运行在windows时,这时候是没有Console的,ServiceSelf做为监听者角色时会检测和动态创建Console然后将日志输出到Console。
现在输入logs子命令,就在Console上输出服务进程的实时日志:
./myapp logs // 控制台输出服务的日志
./myapp logs filter="key words" // 控制台输出匹配了"key words"的服务的日志
ServiceSelf在api设计上十分精炼,你只要关注Service.UseServiceSelf()
和IHostBuilder.UseServiceSelf()
两个函数即可,但可以为你的服务进程提供非常完整的解决方案,您可以到 github上关注此项目。
什么是数学变换?要理解这些变换,首先需要理解什么是数学变换!如果不理解什么是数学变换的概念,那么其他的概念我觉得也没有理解。数学变换是指数学函数从原向量空间在自身函数空间变换,或映射到另一个函数空间,或对于集合X到其自身(比如线性变换)或从X到另一个集合Y的可逆变换函数。比如(图片来源wikipedia):Java技术中通常也要用到一些算法,小编这里分享一份面试真题,理解玩理论后可以练练手!旋转变换(Rotation)镜像变换(Reflection)平移变换(Translation)数学中还有很多其他的数学变换,其本质都可以看成是将函数f(x)利用变换因子进行的一种数学映射,其变换结果是函数的自变量有可能还是原来的几何向量空间,或许会变成其他的几何向量空间,比如傅立叶变换就从时域变换为频域。而傅立叶变换和拉普拉斯变换的本质都是对连续或有限个第一类间断点函数的一种积分变换,那么什么是积分变换呢?什么是积分变换?积分变换通过对原函数对映射函数空间自变量在特定区间进行积分运算,将函数从其原始函数空间映射到另一个函数空间。这样一来,其中原始函数的某些属性在映射函数空间可能比原始函数空间更容易表
多态有什么用?马克 - t o-w i n:https://blog.csdn.net/qq_44639795/article/details/103117332我给大家想了两个需求:1)要求程序运行起来以后,如果用户输入自行车,就执行自行车的驾驶方法。如果用户输入小轿车,就执行小轿车的驾驶方法。这是就用到父类指针指向子类时的override。2)如果你有一千个子类。要求你依次执行这一千个子类当中的打印。你当然可以一个一个实例化子类后分别执行。马克-to-win:累也累死了,你可以编一个循环。用通用的基类指向所有的派生类。几行程序即可,你可以参照本节的例子。不用这技术,还真解决不了这问题! Polymorphismmeansonetype,manyformDynamicmethodbinding(dynamicmethoddispatch),方法覆盖仅在两个方法的名称和类型声明都相同时才发生(override)。动态方法调度(dynamicmethoddispatch)是一种在运行时而不是编译时调用方法的机制。动态方法调度也是Java实现运行时多态性的基础。 马克-to-win:
session#0GitHubhttps://github.com/Coxhuang/django-session.git复制#1环境Python3.6 Django==2.0.7复制#2开始#2.1数据库迁移因为session是一个存在数据库得一张表,所以需要初始化数据库python3manage.pymakemigrations python3manage.pymigrate复制#2.2设置sessionclassset_session(APIView): defpost(self,request): request.session['email']='cox@cox.com' returnResponse("设置session")复制#2.2.1设置request.session['email']='cox@cox.com'#普通设置 request.session.setdefault('email',"cox@cox.com")#
Linux如何查看CPU信息,Linux查看CPU个数和核心数,Linux查看CPU使用率和运行位数2017年11月24日11:52:17 tiiefu1212 阅读数14584一、Linux查看CPU基本信息,可以使用命令:cat/proc/cpuinfo例如笔者的虚拟机:[root@promote~]# cat/proc/cpuinfo processor:0 vendor_id:GenuineIntel cpufamily:6 model:37 modelname:Intel(R)Core(TM)i5CPUM520@2.40GHz stepping:5 cpuMHz:2394.049 cachesize:3072KB fpu:yes fpu_exception:yes cpuidlevel:11 wp:yes flags:fpuvmedepsetscmsrpaemcecx8apicsepmtrrpgemcacmovpatpse36clflushdtsmmxfxsrssesse2sssyscallnxrdtscplmconstant_tscuparch_perfmonpebsbts
参考 英文原文:https://stackabuse.com/spring-cloud-turbine/ 中文版:https://www.jb51.net/article/162726.htm1、HystrixTurbine简介2、样例演示2.1父级项目<?xmlversion="1.0"encoding="UTF-8"?> <projectxmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.cntai
问题出现:现网CPU飙高,FullGC告警CGI服务发布到现网后,现网机器出现了FullGC告警,同时CPU飙高99%。在优先恢复现网服务正常后,开始着手定位FullGC的问题。在现场只能够抓到四个GC线程占用了很高的CPU,无法抓到引发FullGC的线程。查看了服务故障期间的错误日志,发现更多的是由于FullGC引起的问题服务异常日志,无法确定FullGC的根源。为了查找问题的根源,只能从发布本身入手去查问题,发现一次bugfix的提交,有可能触发一个死循环逻辑:for(inti=1;i<=totalPage;i++){ Stringpath=path_prefix+"?cmd=txt_preview&page="+String.valueOf(i)+"&sign="+fileSignature; url_list.add(path); }复制循环中的参数totalPage为long类型,由一个外部参数进行赋值。当外部参数非常大,超过int的最大值时,i递增到int的最大值后,i++会发生翻转,变成一个负数,从
为了能集中管理我们创建好的镜像,方便部署服务,我们会创建私有的Docker仓库。通读了一遍官方文档,Docker为了确保安全使用TLS,需要CA认证,认证时间长的要钱啊,免费过期时间太短,还是用自签名比较简单。准备环境环境:两台Centos7虚拟机 》服务器IP:10.57.220.244 ,作为Docker仓库使用 》客户端IP:10.57.220.220 ,作为客户端来上传或拉取镜像 》域名:lpxxn.com 两台机器上均已安装好Docker版本为17.03.0-ce 如果你和我一样没有用真域名,只需要在客户机上修改一下hosts文件 生成自签名证书 在服务器主机上生成自签名证书,创建一个文件夹用于存放证书 mkdir-pcerts复制 生成证书opensslreq-newkeyrsa:4096-nodes-sha256-keyoutcerts/lpxxn.com.key-x509-days365-outcerts/lpxxn.com.crt复制 需要注意的是在填写的时候CommonName和你的域名是一至的。 llcerts文件夹就可以看到生成好的两个
4.1概述 使presence-aware实体间能够相互迅速的、异步交换相关的小负载的结构化信息有两种基本元素:XML流与XML节。术语定义如下: XML流定义:XML流是一个容器,用于网络上任意两实体间交换XML元素。XML流的开始是以一个起始的XML<stream>标记(有合适的属性与命名空间声明)表示,XML流的结尾以一个结束的XML</stream>标记表示。在流的生命周期中,初始化它的实体能够通过流发送极多的XML元素,元素与XML节(定义在此,<message/>,<presence/>,或<iq/>元素由缺省命名空间验证)都用于协商流(例:协商使用TLS(第5节)或使用SASL(第6节))。“初始流”是从初始实体(通常是一个客户端或服务器)到接收实体(通常是一个服务器)的协商,并被看作与从初始实体到接收实体的会话一致。初始流能从初始实体到接收实体单向通信;为了能够从接收实体到初始实体的信息交换,接收实体必须在反方向协商一个流(“响应流”)。 XML节定义:XML节是一个不连续的结构化信息语
大家好,又见面了,我是你们的朋友全栈君。公平锁和非公平锁一、如果一个锁是公平的,那么获取的顺序就应该符合请求的绝对顺序,即FIFO。二、测试结果非公平性锁可能使线程“饥饿”,为什么它又被设定成默认的实现呢?再次观察上表的结 果,如果把每次不同线程获取到锁定义为1次切换,公平性锁在测试中进行了10次切换,而非 公平性锁只有5次切换,这说明非公平性锁的开销更小。三、,公平性锁保证了锁的获取按照FIFO原则,而代价是进行大量的线程切换。非公平性锁虽 然可能造成线程“饥饿”,但极少的线程切换,保证了其更大的吞吐量。读写锁一、之前提到锁(如Mutex和ReentrantLock)基本都是排他锁,这些锁在同一时刻只允许一个线 程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读 线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写 锁,使得并发性相比一般的排他锁有了很大提升。在没有读写锁支持的(Java5之前)时候,如果需要完成上述工作就要使用Java的等待通知 机制,就是当写操作开始时,所有晚于写操作的读操作均会进入等待状态,只有写操作
一.接口定义工作中,少不了要定义各种接口,系统集成要定义接口,前后台掉调用也要定义接口。接口定义一定程度上能反应程序员的编程功底。列举一下工作中我发现大家容易出现的问题:1.返回格式不统一同一个接口,有时候返回数组,有时候返回单个;成功的时候返回对象,失败的时候返回错误信息字符串。工作中有个系统集成就是这样定义的接口,真是辣眼睛。这个对应代码上,返回的类型是map,json,object,都是不应该的。实际工作中,我们会定义一个统一的格式,就是ResultBean,分页的有另外一个PageResultBean。错误范例://返回map可读性不好,尽量不要 @PostMapping("/delete") publicMap<String,Object>delete(longid,Stringlang){ } //成功返回boolean,失败返回string,大忌 @PostMapping("/delete") publicObjectdelete(longid,Stringlang){ try{ booleanresult=con
留言板输入几条信息 出现删除按钮,点他 通过burpsuite拦截请求,请求报文如下 GET/vul/sqli/sqli_del.php?id=57HTTP/1.1 Host:192.168.1.9:8080 User-Agent:Mozilla/5.0(X11;Ubuntu;Linuxx86_64;rv:105.0)Gecko/20100101Firefox/105.0 Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding:gzip,deflate Connection:close Referer:http://192.168.1.9:8080/vul/sqli/sqli_del.php Cookie:security=high;PHPSESSID=fftr9buiig10
这里以Windows764位为例,如果是32位环境需安装对应版本程序。 一、安装golang1.2.2 1.3及1.3.1编译生成的二进制文件,无法使用LiteIDE23.2携带的gdb7.7进行调试。 二、安装及配置LiteIDE 将liteidex23.2.windows.7z解压到D:\即完成安装。 2.1设置编辑环境 因为是64位环境,所以选择“win64”。 查看->编辑环境变量,确认GOROOT变量与GO安装路径一致。 2.2添加GOPATH 查看->管理GOPATH...,创建新目录E:\Code_Repository\golang,并添加到“自定义目录”。 2.3新建项目 选择上一步添加的GOPATH,模板为Go1CommandProject 编辑源代码,添加几行代码,包括变量声明、初始化及赋值,用来验证调试是否生效。 2.4设置编译选项及编译 编译->编译配置,设置编译参数。在BUILDARGS添加-gcflags"-N-l",目的是去掉编译
java连接redis我们都使用的是jedis ,对于redis这种频繁请求的场景我们一般需要对其池化避免重复创建,即创建一个连接池,打开jedis的jar包我们发现,jedis对池已经有了相关的实现,根据pom依赖可以清楚的知道这是基于common-pool2连接池实现的。jedis的jar包中包含了三个连接池 JedisPool与JedisSentinelPool与ShardedJedisPool。那么jedis为什么会包含三种实现方式呢?其实归根结底还是因为redis环境的不同。单节点模式还是哨兵模式、还是集群共享模式 首先JedisPool 我们可以清晰的看见这是为单节点模式实现的连接池: publicJedisPool(finalGenericObjectPoolConfigpoolConfig,finalStringhost,intport, inttimeout,finalStringpassword,finalintdatabase){ this(poolConfig,host,port,timeout,password,database
org.apache.hadoop.yarn.client.RMProxy-ConnectingtoResourceManagerat/0.0.0.0:8032 问题 flink-session启动无法连接到hadoop的resourceManager 尝试重新连接Retryingconnecttoserver:0.0.0.0/0.0.0.0:8032.Alreadytried0time(s)失败. 2021-03-1907:43:15,103WARNorg.apache.flink.runtime.util.HadoopUtils-CouldnotfindHadoopconfigurationviaanyofthesupportedmethods(Flinkconfiguration,environmentvariables). 2021-03-1907:43:15,545WARNorg.apache.hadoop.util.NativeCodeLoader-Unabletoloadnative-hadooplibraryforyourplatform...usingbuiltin-
Someelementaryalgorithmsondiscretedifferentialgeometry http://www.cnblogs.com/yaoyansi/p/5635012.html PartialBlendshape(similartohttps://vimeo.com/41721845) http://v.youku.com/v_show/id_XMTQwNDE0NDYyMA==.html SeveralSOuPnodesIdeveloped http://v.youku.com/v_show/id_XMTQwNDE0MDgzNg==.html Maya2Renderer(https://github.com/maya2renderer/maya2renderer) http://v.youku.com/v_show/id_XODQwMzAwMzg0.html http://v.youku.com/v_show/id_XODQwMzAxNjYw.html Gallary:http://s12
配置文件,是一个每个应用服务程序常用的功能,从原来的终端应用时代,到现在的元宇宙时代,配置都是很悠然自得的存在。asp.netcore提供了强大的配置文件访问机制,不管是MVCAPI还是MiniAPI,使用方式都是相同的。 框架默认的配置文件是:appsettings.json,可以以json的格式存放自己复杂的配置: { "Logging":{ "LogLevel":{ "Default":"Information", "Microsoft.AspNetCore":"Warning" } }, "AllowedHosts":"*", "ConnectionStrings":{ "ExamDatabase":"server=.;database=Exam;uid=sa;pwd=sa;" }, "AppInfo":{ "Name":"Mini&Powerful", "Version":"v1.0.0", "Author":{ "Architect":"桂素伟-A", "Programmer":"桂素伟-P", "Designer":"桂素伟-D" }, "Feature
1、SpringMVC执行流程 浏览器提交请求到中央调度器 中央调度器直接将请求转给处理器映射器。 处理器映射器会根据请求,找到处理该请求的处理器,并将其封装为处理器执行链后返回给中央调度器。 中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。 处理器适配器调用执行处理器。 处理器将处理结果及要跳转的视图封装到一个对象ModelAndView中,并将其返回给处理器适配器。 处理器适配器直接将结果返回给中央调度器。 中央调度器调用视图解析器,将ModelAndView中的视图名称封装为视图对象。 视图解析器将封装了的视图对象返回给中央调度器 中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象。 中央调度器响应浏览器。 2、依赖,需要添加servlet和spring-webmvc依赖 <dependency> <groupId>javax.servletgroupId> <artifactId>javax.servlet-apiartifactId&
路由表 直连网段:配置IP地址,端口up状态,自动加入路由表中。 网段 下一跳 10.1.1.0/24 f0/0 20.1.1.0/24 f0/1 非直连网段 静态路由:由管理员手工配置,单向。 iproute目标网段子网掩码下一跳IP 如iproute30.1.1.0255.255.255.020.1.1.2 动态路由: 默认路由:当路由表中找不到网络的条目时,路由器把请求转发到默认路由接口。iproute0.0.0.00.0.0.020.1.1.2 浮动路由:在静态或默认路由后加入空格+数字,例如给目标网段配置两个不同的下一跳路由,其中一个为浮动路由,当第一个路由down掉的时候,浮动路由就会起作用。 路由器的工作原理: ①一个帧到达路由器,路由器首先检查目的mac地址是否是自己,如果不是则丢弃、如果是则解封装,并将IP包送到路由器内部。 ②路由器检查IP包头中的目标IP,并匹配路由表,如果匹配失败,则丢弃,并向源IP回馈错误信息,如匹配成功,则将IP包路由到出接口; ③封装帧,首先将出接口的MAC地址作为源MAC
记得我上初中的时候,兴高采烈地买了一本《人性的弱点》,结果那本书被我看了几页就扔一边了----实在看不下去。 我对这种“告诉你什么是对的,却不告诉你为什么”的书超级反感,《程序员修炼之道》这种书,我一般只会去看它里面讲的新奇的定义,对于其内容,我是万万不敢恭维的,或许是因为我还没有写过真正的能挣钱的软件项目的原因吧。 等我够资格了再补《程序员修炼之道》里面的内容。 相应的,想起程序员修炼之道,我会联想起一个并不广为人知的书,《DOOM启示录》。或许它并不像前者那样被很多知名的人推荐,但它对于我来说,指引着我的程序员修炼之路。 不知道以前在哪领悟到的,要想写读完一本书的收获的话,最好向一个人推荐这本书,这样的话,你得到的收获会比只写感想大得多。 现在我向你推荐这本书,如果你想读来试试的话,可以去我的百度网盘分享下载下来看,密码是1024。 精彩片段: “你带了阿司匹林没?”卡马克向朋友问道,他们正走进拉斯维加斯的一间赌场。 “你头疼?” “还没,”卡马克说:“但马上就要疼了。” 这是1998年2月8日,卡马克就要对他的脑力进行一次挑战:在二十一点游戏中记牌。这是他的最新爱好。“作为一个
GroupCoordinator机制 1介绍: Kafka的Server端主要有三块内容:GroupCoordinator、Controller和ReplicaManager,其中,GroupCoordinator的内容是与Consumer端紧密结合在一起的,简单来说就是,GroupCoordinator是负责进行consumer的group成员的rebalance与offset管理。GroupCoordinator处理的client端请求类型可以看出来,它处理的请求类型主要有以下几种: l ApiKeys.OFFSET_COMMIT; l ApiKeys.OFFSET_FETCH; l ApiKeys.JOIN_GROUP; l ApiKeys.LEAVE_GROUP; l ApiKeys.SYNC_GROUP; l ApiKeys.DESCRIBE_GROUPS; l ApiKeys.LIST_GROUPS; l ApiKeys.HEARTBEAT; 而KafkaServer端要处理的请求总共有21
#topN selectid,title,content,score,website_name,publish_time,urlfrom ( SELECTid,title,content,score,website_name,publish_time,url, if(@cid=website_name,@rank:=@rank+1,@rank:=1)asranking, @cid:=website_name from( SELECTid,title,content,0.5*(comments_count+reports_count)asscore,website_name,publish_time,url fromTable ORDERBYwebsite_name,idDESC)t1, (SELECT@cid:=null,@rank:=0)t2#变量的初始化部分 )aa whereranking<=N复制 参考: 全网最全的mysql分组后取topN的解答-知乎(zhihu.com)