.netcore生成url–QueryHelpers

 

 

ELK日志清理

参考链接

要刪除 Elasticsearch 的 Index 有两种方式:

  • 使用官方的 Curator(所有系统平台通用)
  • 自己写脚本(不通用,不同系统平台要用不同的脚本语言)

方式1:使用官方的 Curator方式:

环境要求,按官网提示链接,下载并安装Curator,并配置执行命令所需文件。

1,下载参考参考配置文件curator

2,Win+R 运行控制台,并切换的Curator.exe所在目录,执行命令(命令参数详情参见官网说明),参数值字符可能要按所在系统环境进行转义:

以上可删除3天前格式符合 .两位数字.两位数字 的所有索引。

方式2:自己写排程方式(脚本语言要根据系统环境选择):

环境要求(Windows):1,安装Curl。2,安装Grep

步骤:

1,安装Curl与Grep,并为他们配置系统环境变量,方便直接使用他们提供的命令。

2,执行curl "http://localhost:9200/_cat/indices?v&h=i"查看当前现有的索引。

localhost:9200:填写实际的ElasticSearch的主机ip/域名与端口。

系统日志的索引格式都是:字母.两位月份+.两位日期。

3,执行

,筛选要删除的索引(排除11/01~02两天)。

4,执行删除索引命令:curl -XDELETE "120.234.2.148:9200/crm.admin.10.29"

5,编写批处理文件(Windows系统,需要注意特殊字符的转义)。下载附件:ELK_ClearLog

在ASPNET CORE中使用REDIS管理缓存数据

写在前面:在系统设计过程中,通常需要对成本较高或频繁使用的资源做缓存处理。Redis是一个key-value形成的存储系统,数据存放在内存中,Redits重启数据就会丢失,说以在实际应用中有必要对Redis存储的数据持久化处理。本文简单介绍下如何在AspNet Core中使用Redis。

参考链接:
1,Redis-based distributed cache in ASP.NET Core
2,Using Redis Cache for session data storage in ASP.NET Core
3,ASP.NET Core 使用 Redis 客户端
4,Redis命令
5,Redis入门练习资源
6,chocolatey的安装。
7,Redis的安装

Redis安装(Windows系统):
1,安装Chocolatey(Windwos包管理工具)
方式一:管理员身份运行命令行工具(cmd),并执行下面的代码

方式二:管理员身份运行PowerShell,并执行下面的代码

安装完成后,输入choco并回车,显示版本信息,表示安装成功。

2,使用Chocolatey安装Redis
运行控制台或PowerShell,并执行下面的代码

安装完成后,输入redis-server -v可查看安装版本信息。输入redis-server启动Redis服务(可通过命令redis-server --service-install redis.windows.conf --loglevel verbose安装Redis服务器,并将服务设置为开机自动启动),配置文件redis.windows.conf在Redis所在安装目录。


输入redis-cli,启动客户端,连接到Redis服务。Redis提供的命令,参考参考链接4.

3,使用Redits
1).新建AspNet Core Web应用,添加Microsoft.Extensions.Caching.Redis包。
2).添加下图配置信息(也可使用代码控制),如果Redis有多个数据库,可通过defaultDatabase指定要使用的数据库:

3).注册Redis分布式缓存服务到DI容器

4),将分布式缓存服务注入到控制器,并执行新增key-value值操作。
本示例功能是:进入Index,以当天日期为key,当前完整日期与时间为value存储在Redis。(以字节方式存储)

5),执行hgetall 20181112命令查看存储的对象。
字节在Redis是以Hash类型存储,在应用在应用读取(get)/存储(set) 对象后,须进行byte[]与string类型间的转换。

6),字符串的存取操作。

注意事项:Microsoft.Extensions.Caching.Redis的SetString()方法,调用的是Redis的HMSET命令,是以HASH类型存储(参考链接1)。在应用中可直接使用GetString()获取到字符串的值,但在Redis中,仍要使用hgetall 键来查看数据内容。

Jenkins创建任务–系统自动化部署

Jenkins可实现系统的自动化部署,系统每次发布不需要再手动操作,减少人为错误操作,代替重复性的操作。

下面步骤,描述如何在Jenkins中创建一个任务,用来代替手动操作:a),从GitLab获取项目 b),系统编译  c),系统发布 d),系统上传

 

步骤1:登入Jenkins系统。

步骤2:登入成功后,如果是第一次使用,主页面会有大号特写的 [创建一个任务] 链接用来创建任务。或者通过左侧 [新建任务] 来创建任务

步骤3:输入任务名称,并选择 “构建一个自由风格的软件项目” ,点击下方的 “确定” 按钮。

步骤4:登入GitLab(在浏览器新的窗口或标签页),复制当前任务要实现的自动化部署项目的代码仓库地址。

步骤5:在步骤3点击“确定”按钮会会自动跳转到下图页面。此步骤作用是:从GitLab下载项目代码,在后续步骤构建项目。

a),将步骤4中复制的项目代码仓库地址,粘贴到[代码管理]区域的 Repository URL文本框中。

b),点击[Add]按钮,新增用户(GitLab系统用户,用于从GitLab下载项目)。

c),在Branch Specifier (blank for ‘any’) 填写为 */master。(用于项目构建的分支)

新增用户页面

选择用户

步骤6:点击 [增加构建步骤] 按钮,选择执行shell,填写执行的脚本。参考以下脚本(注意修改为正确的项目名称与应用服务器)。此步骤作用是:构建(编译)步骤5下载的代码,并发布。

47.107.164.110:应用服务器ip

/var/www/system:应用服务器上system系统所在领

步骤7:点击 [增加构建后操作步骤] 下拉按钮,并选择 “Send build artifacts over SSH” 。此步骤作用是:将步骤6发布后的项目,同步到应用服务器上。

步骤8:在 [构建后操作] 页面,添加目标应用服务器,并参考以下脚本,并点击保存。此步骤作用是:重启应用服务器上的服务,是新版系统生效。

步骤9:以上步骤任务创建完成。在刚才创建的任务页面上,点击“立即构建”,即会对前面的设定,自动完成 项目的 下载-->编译-->发布-->上传到应用服务器过程。

步骤10:点击任务构建序号[#1],并查看 [控制台输出] ,可查看前面步骤的设置的脚本执行过程,任务成功执行完成返回 SUCCESS

 

递归方法的使用–

递归适合应用于对 一个对象中嵌套同中类型对象的处理。例如:一个盒子里面有个糖和一个小盒子,小盒子中也有一个糖和一个更小的盒子,这个更小的盒子中又有一个糖和更加小的盒子…..层层嵌套,规律是:盒子里面有糖果。如果用代码模拟此情景,要取出所有盒子里面糖果,可以用递归方法实现。

代码模拟如下:

 

再举一应用中的实际例子:在Index页面,对Grid中执行过滤查询时,从顾虑条件中提取并组合为sql的where条件片段。

在FMS系统交货计划的Index页面,要对Grid多个列进行筛选过滤查询,如下图一。

页面查询传递参数到后端,过滤参数格式具体如下图:

介绍:

1,如果是只对单列做了单个查询条件,参数类型是FilterDescriptor,可直接,此时可直接通过FilterDescriptor类型的属性Member、Operator、Value拼成sql条件,例如:ShippingTypeId=2

2,如果有多列筛选,或单列中有多个条件,则筛选条件类型为CompositeFilterDescriptor,即混合过滤条件,混合顾虑条件中的可能仍有混合条件…层层嵌套,规律是:混合过滤条件层层提取,最终的类型FilterDescriptor,并且都有LogicOperator来连接两个条件。具体的实现代码如下。

 

mysql 查看数据库、表的基本命令

1:show databases;

查看所有的数据库,等同于select schema_name from information_schema.schemata\G。\G 替换;,以纵向报表的形式输出结果,有利于阅读。

2. status 查看mysql数据库的运行状态

3. use 命令选择数据库 例如 use information_schema,当使用此命令后

select schema_name from information_schema.schemata\G,可以为

select schema_name from schemata\G

4. 查看数据库中的表

show tables

同样也可以在information_schema中查看,show命令是方便使用的简短模式。

select table_name from tables where table_schema=’jblog’;

5. 查看表结构

desc table_name;

6.查看表状态 show table status from db like 条件

可以查看engine数据库引擎,version,row、index等信息

7.小技巧,当多行命令输入,发现错误后,用\c结束。

————————————————————-

另,查询数据库运行状态的基本命令:

#查询数据库连接
show full processlist;
show status like ‘%Max_used_connections%’;
show status like ‘%Threads_connected%’;#当前连接数
show status like ‘%table_lock%’;#表锁定
show status like ‘innodb_row_lock%’;#行锁定
show status like ‘%qcache%’; #查询缓存情况
show variables like “%query_cache%”;
SHOW STATUS LIKE ‘Qcache%’;
show variables like “%binlog%”;
show status like ‘Aborted_clients’;#由于客户没有正确关闭连接已经死掉,已经放弃的连接数量
show variables like ‘%max_connections%’;//查看最大连接数量
show variables like ‘%timeout%’;#查看超时时间
show variables like ‘log_%’; #查看日志是否启动

IDENTITYSERVER4 + SIGNALR CORE +RABBITMQ 构建WEB即时通讯

文章来源

 

后台服务用户与认证


 

新建一个空的.net core web项目Demo.Chat,端口配置为5001,安装以下nuget包

1.IdentityServer4.AccessTokenValidation,IdentityServer4客户端认证所用;

2.Microsoft.AspNetCore.SignalR

3.RabbitMQ.Client

添加appsettings.json

这里我们新增两个Dto类,一个消息传输类MsgDto,一个用户数据类UserDto

当用户认证通过后,从Identity返回的token中我们已经返回了用户的基础信息了,那这里我们如何获取呢?很简单在上下文的User中Claims属性里面,所以这里我们增加一个扩展方法来转换为UserDto


既然是在线聊天那必须得存储当前所有的在线用户对吧?新建一个OnlineUsers类,这里我们就不用数据库了,Demo嘛,里面就3个用户,嘿嘿。当然你完全可以自由发挥使用其他redis,mongo什么什么的。


后台服务RabbitMQ消息处理


 

RabbitMQ消息队列相关的知识这里我也不再赘述,园子里面很多,大家自行研究,RabbitMQ大概有2个种模式:生产消费者模式和发布/订阅模式,生产消费者模式即消息只能被使用一次,比如一个商品生产出来你只能卖给一个消费者对吧,发布/订阅即只要订阅了都会收到该消息。这里我们用到的是生产消费者模式,参考官方文档

消息发送和收到消息的处理,这里我们分为2个类单独处理,MsgSender和MsgHandler。

MsgSender:当用户发送了一条消息,后端收到后就将消息添加到消息队列,MsgHandler:一直处于运行状态,当收到队列的消息时,开始处理消息,调用SignalR的方法,发送消息到客户端,RabbitMQ的连接配置在appsettings.json中,注入IConfiguration获取

MsgSender

MsgHandler,需要注入IHubContext接口,用于发送消息到客户端,ps:在Hub类中,可以通过Clients直接发送消息到客户端,在其他类里面可以使用这个接口,获取到Clients。

后台服务SignalR消息处理器


 

关于SignalR,官方文档

SignalR的核心就是继承自Hub消息处理类,这个类中所有的public 方法都可以给客户端调用。我们的聊天室比较简陋,只需要一个Send方法给客户端就够了,是吧?当然服务端需要2个主动发送消息到客户端的方法,1.当有用户登录时通知所有客户端刷新在线用户列表,2.有什么错误的时候发送错误消息给客户端,比如我们不允许离线发送,用户发了条消息给一个不在线的用户。

另外当用户登录和离开时需要在OnlineUsers中进行注册和注销。

MessageHub,我们的聊天室必须登录,所以加上Authorize特性。

这里就冒出来另外一个新的问题了,SignalR使用的是websocket,据我了解到的是没有header头这个东西的,而jwt token默认是通过header中Authorization信息进行认证的。那这个授权又如何实现呢?想办法咯,既然header传不进来,那直接url传进来总可以吧。

 

后台服务:服务注册与认证授权


 

好了,我们先将需要的服务先配置下。

AddIdentityServerAuthentication实际上是AddJwtBearer的扩展,你要喜欢也可以用AddJwtBearer配置,由IdentityServer4.AccessTokenValidation提供,配置认证Authority为http://localshot:5000(Demo.Identity配置的端口号为5000,appsetting.json中配置),ApiName和Secret与Identity端配置的ApiResource一致。


刚刚提到SignalR认证的问题,具体如何实现呢?这里也有2种方式,1.使用中间件在认证之前从url中获取token并添加到header中;2.r.MapHub(“/msg”),可以配置在参数中添加自定义的IAuthorizeData接口,可以自己实现获取token验证,我觉得比较麻烦,这里我们使用第一种方式。

添加中间件,这个中间件一定要在UseAuthentication之前:

好了,还有一个问题,前面写的MsgHandler什么时候开始处理消息?Dispose什么时候调用?这里我们使用IApplicationLifetime接口,该接口提供了应用的整个生命周期事件处理。在应用启动的时候我们注册消息处理,应用结束时Dispose。


完整的Configure代码:


另外用户登录后需要展示用户信息,邮件地址啊头像什么的,这里我们也有2种方式,1是消息处理器中,当用户连接后主动发送消息给用户;2是建一个Api接口,当然放在消息处理器中会显得更纯洁,web项目里面没有一个controller,这里我们使用第一种方式。

在MessageHub中添加方法,在OnConnectedAsync方法中调用

聊天室web前端


 

官方提供了js库,可以用npm安装,npm install @aspnet/signalr。

这个前端嘛,我就不花大功夫去做得漂亮高大上了,暂时就把代码直接丢在Demo.chat里面吧,2个页面,登录页login,聊天室页面chat。

 

关于前端就不啰嗦了,再啰嗦就是关公面前耍大刀了,什么angular,vue,老夫写代码统统jquery。其他的大家自己发挥了。

login.html

chat.html

好了,代码就写完了,同时运行Demo.Identity和Demo.Chat。打开2个浏览器:http://localhost:5001/login.html。

 

输入用户名密码登录;

发送个消息试试:

内网穿透工具–FRP

相关链接:

1,内网穿透的几种方式

2,FRP使用

3,可以实现内网穿透的几款工具

4,内网穿透的几种方式

5,内网穿透都有哪些解决方案?

 

frp 的作用

  • 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
  • 对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
  • 利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

开发状态

frp 仍然处于前期开发阶段,未经充分测试与验证,不推荐用于生产环境。

master 分支用于发布稳定版本,dev 分支用于开发,您可以尝试下载最新的 release 版本进行测试。

目前的交互协议可能随时改变,不保证向后兼容,升级新版本时需要注意公告说明同时升级服务端和客户端。

架构

architecture

 

必备条件:

1,公网Ip及服务器,且可正常访问

使用示例

根据对应的操作系统及架构,从 Release 页面下载最新版本的程序。

将 frps 及 frps.ini 放到具有公网 IP 的机器上。

将 frpc 及 frpc.ini 放到处于内网环境的机器上。

通过 ssh 访问公司内网机器。如果是Windows主机,可以直接远程登录并修改配置。

  1. 修改 frps.ini 文件,这里使用了最简化的配置:
  1. 启动 frps:

./frps -c ./frps.ini

  1. 修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x;
  1. 启动 frpc:

./frpc -c ./frpc.ini

  1. 通过 ssh 访问内网机器,假设用户名为 test:

ssh -oPort=6000 test@x.x.x.x

通过自定义域名访问部署于内网的 web 服务

有时想要让其他人通过域名访问或者测试我们在本地搭建的 web 服务,但是由于本地机器没有公网 IP,无法将域名解析到本地的机器,通过 frp 就可以实现这一功能,以下示例为 http 服务,https 服务配置方法相同, vhost_http_port 替换为 vhost_https_port, type 设置为 https 即可。

  1. 修改 frps.ini 文件,设置 http 访问端口为 8080:
  1. 启动 frps;

./frps -c ./frps.ini

  1. 修改 frpc.ini 文件,假设 frps 所在的服务器的 IP 为 x.x.x.x,local_port 为本地机器上 web 服务对应的端口, 绑定自定义域名 www.yourdomain.com:
  1. 启动 frpc:

./frpc -c ./frpc.ini

  1. 将 www.yourdomain.com 的域名 A 记录解析到 IP x.x.x.x,如果服务器已经有对应的域名,也可以将 CNAME 记录解析到服务器原先的域名。
  2. 通过浏览器访问 http://www.yourdomain.com:8080 即可访问到处于内网机器上的 web 服务。

项目实例:

说明:

http://frp.abcenter.xyz:frp客户端custom_domains的配置,需要先域名解析

9001:frp服务器端vhost_http_port的端口配置

项目启动:通过域名访问

通过手机端访问:外网

企业微信OAuth2登录认证–ASP NetCore

步骤:

一、在企业微信官网注册企业微信帐号。

二、在企业微信 服务商官网,申请成为服务商(下图1)。并记下CorpID、ProviderSecret(下图二),配置登录授权域名(下图三)

三、在应用配置文件中将步骤二中的CorpID、ProviderSecret填写到应用的配置文件中。

四、企业微信认证中间件 设计。

中间件文件说明一览:

设计步骤:

步骤1、OAuth认证中间件Option设置。也可在注册中间件时指定,WXWorkAuthenticationDefaults(下图二)为企业微信OAuth2认证所需信息设置类默认值,须按企业微信官网规范中设置。

步骤2、企业微信权限认证RP端处理程序的设计,权限认证过程见下图一,说明链接

OP【OpenID Provider】: OpenID提供者,提供对用户鉴权功能
RP【Relying Party】: 依赖方,直接服务提供者,需要信任OP鉴权的结果
UA【User Agent】:终端用户,想使用RP服务的用户
三者间的关系就是:让UA在OP登陆,并使用RP提供的服务;服务供应商扮演RP角色。服务在此是指服务商的应用。RP端处理程序将按此图过程步骤说明。

RP端处理程序的设计步骤一览表:

RP端构造链接,跳转到OP登录页。官网参考链接

OP端鉴权成功后,重定向到RP端,RP端处理程序一览表:

RP端处理程序 步骤1:授权成功后,RP端验证会话是否一致(通过state参数,与跳转OP登录页时的state要求一致),并获取auth_code,为获取企业微信用户个人信息作准备

RP端处理程序 步骤2:OP端鉴权成功,使用CorpID、ProviderSecret获取Token,并使用上一步骤取到端用户授权码auth_code获取企业微信用户个人信息(下图二)

RP端处理程序 步骤3:上一步骤2中获取到企业微信用户个人信息后,开始创建用户认证票据ticket(下图二)

 

RP端处理程序 步骤4:提供获取企业微信认证用户 个人信息的方法,供服务商端应用调用

RP端处理程序 步骤5:汇整RP端认证处理过程,封装成企业微信认证中间件

  

五、企业微信认证中间件 使用

步骤1:在Startup中注册 企业微信认证 中间件,并启用认证中间件

步骤2:在服务商(RP)应用中将注册的 第三方登录认证 方式显示在登录页面,供用户自由选取登录方式。

步骤3:提供第三方登录验证处理方法

步骤4:启动应用,测试中间件是否正常

点击“企业微信”按钮:

企业微信客户端扫码二维码:

企业微信客户端扫码成功提升:

企业微信客户端确认登录:

成功获取到用户个人信息: