首页 文章 精选 留言 我的

精选列表

搜索[微服务架构],共10000篇文章
优秀的个人博客,低调大师

ABP架构学习系列二:ABP中配置的注册和初始化

一、手工搭建平台 1.创建项目 创建MVC5项目,手动引入Abp、Abp.Web、Abp.Web.Mvc、Abp.Web.Api 使用nuget添加Newtonsoft.Json、Castle.Core、Castle.Windsor Install-Package Newtonsoft.Json -Version 8.0.3 Install-Package Castle.Windsor -Version 3.3.0 2.创建WebModule类 在App_Start下创建一个ZmBlogWebModule类型,DependsOn指示 ZmBlogWebModule依赖于AbpWebMvcModule,核心模块AbpWebMvcModule会在应用模块ZmBlogWebModule之前进行初始化,核心模块同时可以加载多个。 namespace ZmBlog.Web.App_Start { [DependsOn(typeof(AbpWebMvcModule))] public class ZmBlogWebModule:AbpModule { public override void PreInitialize() { //依赖注入注册之前,主要用于初始化默认的配置 //开启本地化语言、配置等Hangfire //关闭多租户、审计日志、AntiForgery等 } public override void Initialize() { //该方法通常是依赖注入注册的地方 IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); AreaRegistration.RegisterAllAreas(); //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); } public override void PostInitialize() { //依赖注入注册之后调用,在这里可以安全地解析一个依赖 } public override void Shutdown() { //在应用关闭的时候调用 } } } 3.配置Global.asax MvcApplication 要继承AbpWebApplication,重写Application_Start来初始化abp的内部初始化 public class MvcApplication : AbpWebApplication { protected override void Application_Start(object sender, EventArgs e) { base.Application_Start(sender, e); } } 4.修改默认控制器 Home控制器必须集成于AbpController,否则会报错 好了,现在项目可以正常运行了 二、初始化过程 1.abp框架的启动是从Global.asax文件的Application_Start启动的,通过base去初始化。 2.AbpWebApplication的Application_Start方法中,通过AbpBootstrapper来将各个Abpmodule模块载入Abp框架中的AbpBootstrapper类在Abp.dll中,其主要用于框架的基本配置的注册和初始化,AbpBootstrapper调用Initialize方法初始化 public abstract class AbpWebApplication : HttpApplication { protected virtual void Application_Start(object sender, EventArgs e) { ThreadCultureSanitizer.Sanitize(); //设置当前线程的区域性 AbpBootstrapper.IocManager.RegisterIfNot<IAssemblyFinder, WebAssemblyFinder>();//加载bin目录下的所有dll并注册 AbpBootstrapper.Initialize(); } } 3.关于AbpBootstrapper的Initialize()方法 public virtual void Initialize() { IocManager.IocContainer.Install(new AbpCoreInstaller());//注册系统框架级的所有配置类 IocManager.Resolve<AbpStartupConfiguration>().Initialize();//实例化配置类 _moduleManager = IocManager.Resolve<IAbpModuleManager>(); _moduleManager.InitializeModules(); } 4. IAbpModuleManager的实例调用其InitializeModules()初始化所有的Module public virtual void InitializeModules() { LoadAll(); var sortedModules = _modules.GetSortedModuleListByDependency(); sortedModules.ForEach(module => module.Instance.PreInitialize());//先完成所有Module的PreInitialize sortedModules.ForEach(module => module.Instance.Initialize());//再执行所有Module的Initialize sortedModules.ForEach(module => module.Instance.PostInitialize());//最后执行PostInitialize } 另外,AbpModule的基本信息是用AbpModuleInfo封装的,将一个abpmodule类封装成Type,Assembly以及模块的依赖模块的AbpModuleInfo等信息。 5.应用程序结束将在AbpWebApplication中调用AbpBootstrapper的Dispose方法,Dispose通过IAbpModuleManager,执行其ShutdownModules,关闭所有Module。 public virtual void ShutdownModules() { var sortedModules = _modules.GetSortedModuleListByDependency(); sortedModules.Reverse(); sortedModules.ForEach(sm => sm.Instance.Shutdown()); } 三、AbpBootstrapper 在核心启动类AbpBootstrapper中的两个至关重要的属性: IIocManager 和 IAbpModuleManager。 IIocManager内部包装了一个Castle的依赖注入容器IWindsorContainer,所有类型的注册、解析、AOP机制的拦截器都是注册在该容器中的,将具体的注册还有解析功能分别包含在其父接口IIocRegistrar和IIocResolver中。 namespace Abp.Dependency { /// 此接口用于直接执行依赖项注入任务 public interface IIocManager : IIocRegistrar, IIocResolver, IDisposable { IWindsorContainer IocContainer { get; } /// 引用 Castle Windsor Container. new bool IsRegistered(Type type); /// 检测该类型是否已注册. new bool IsRegistered<T>(); /// 检测该类型是否已注册. } } 其中关系类图如下: 四、AbpCoreInstaller AbpCoreInstaller只是完成注册系统框架级的所有配置类。Abp支持自动完成符合Conventional(基于约定)的组件的注册。 Conventional 的规则要通过继承IConventionalDependencyRegistrar接口实现。 如下图,ABP中继承自IConventionalDependencyRegistrar接口的四个类。 其中BasicConventionalRegistrar设置了所有继承至ITransientDependency,ISingletonDependency和IInterceptor接口的类都会被自动注册。 其他三个则分别注册AbpDbContext,ApiController和Controller的派生类。 BasicConventionalRegistrar的代码,其注册所有继承至ITransientDependency,ISingletonDependency和IInterceptor接口的类。 参考文章: https://www.cnblogs.com/farb/p/ABPModuleSystem.html http://www.cnblogs.com/xuzimian/p/5561708.html https://www.cnblogs.com/xuzimian/p/5579144.html http://www.cnblogs.com/skabyy/p/7295533.html http://www.cnblogs.com/1zhk/p/5277610.html https://www.cnblogs.com/huaizuo/p/4836853.html

优秀的个人博客,低调大师

LNMP架构(nginx访问日志,Nginx日志切割,静态文件不记录访问日志)

一、nginx访问日志 [root@lnmp ~]# vim /usr/local/nginx/conf/nginx.conf (修改Nginx的配置文件) 搜索/log_format (log_format后面跟的combined_realip是一个自定义名字,用来定义整个日志格式,这里写什么,虚拟配置文件后面就可以加上什么,我这里将combined_realip修改为lty) log_formatlty '$remote_addr $http_x_forwarded_for [$time_local]' ' $host "$request_uri" $status' ' "$http_referer" "$http_user_agent"'; [root@lnmp ~]# vim /usr/local/nginx/conf/vhost/test.com.conf (修改虚拟机文件) access_log /tmp/test.com.log lty; (增加一行,lty是刚在主配置文件里写的日志格式) 检查语法错误并且重新加载配置文件: [root@lnmp ~]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@lnmp ~]# /usr/local/nginx/sbin/nginx -s reload 检测; [root@lnmp ~]# curl -x127.0.0.1:80 test2.com/admin/1.php -I HTTP/1.1 301 Moved Permanently Server: nginx/1.8.0 Date: Thu, 14 Dec 2017 05:32:49 GMT Content-Type: text/html Content-Length: 184 Connection: keep-alive Location: http://test.com/admin/1.php [root@lnmp ~]# curl -x127.0.0.1:80 test.com/admin/1.php touch file.php [root@lnmp ~]# cat /tmp/test.com.log (查看日志) 127.0.0.1 - [14/Dec/2017:13:32:49 +0800] test2.com "/admin/1.php" 301 "-" "curl/7.29.0" 127.0.0.1 - [14/Dec/2017:13:33:10 +0800] test.com "/admin/1.php" 200 "-" "curl/7.29.0" 二、nginx的日志切割 nginx日志切割 nginx没有像httpd一样,自己带有切割工具,则需要借助系统的切割工具或者自己写一个切割的脚本 [root@lnmp ~]# vim /usr/local/sbin/nginx_log_rotate.sh (写一个自主切割的脚本) #!/bin/bash #假设nginx的日志存放路径为/data/logs/ d=`date -d "-1 day" +%Y%m%d` (生成一个年月日day -1的日期,(昨天的日期)) logdir="/tmp/" (定义logdir为/tmp) nginx_pid="/usr/local/nginx/logs/nginx.pid" (给Nginx.pid定义一个变量,为下面命令做准备) cd $logdir (进入到logdir中) for log in `ls *.log` (做一个for循环,ls当前目录下所有以.log文件为结尾的文件) do mv $log $log-$d (把以log为结尾的日志名都改成log---日期) done /bin/kill -HUP `cat $nginx_pid` (重新启动nginx_pid进程,重新生成一个test.com.log文件) 执行脚本: [root@lnmp ~]# sh -x /usr/local/sbin/nginx_log_rotate.sh ++ date -d '-1 day' +%Y%m%d + d=20171213 + logdir=/tmp/ + nginx_pid=/usr/local/nginx/logs/nginx.pid + cd /tmp/ ++ ls test.com.log + for log in '`ls *.log`' + mv test.com.log test.com.log-20171213 ++ cat /usr/local/nginx/logs/nginx.pid + /bin/kill -HUP 1157 [root@lnmp ~]# ll /tmp/ srwxrwxrwx. 1 mysql mysql 0 12月 14 11:56 mysql.sock srw-rw-rw-. 1 root root 0 12月 14 11:55 php-fcgi.sock drwx------. 3 root root 17 12月 14 11:55 systemd-private-50670dd070a94a6f85f2f82feb779c46-vmtoolsd.service-vZTOZz -rw-r--r--. 1 root root 0 12月 14 13:54test.com.log -rw-r--r--. 1 root root 0 12月 14 13:54test.com.log-20171213 最后一步,添加任务计划: [root@lnmp ~]# crontab -e no crontab for root - using an empty one 0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh (添加一行) 三、静态文件不记录日志 [root@lnmp ~]# vim /usr/local/nginx/conf/vhost/test.com.conf location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ (以gif,jpg,jpeg,png,bmp,swf结尾的文件保存7天,并且不记录日志) { expires 7d; access_log off; } location ~ .*\.(js|css)$ { expires 12h; (以js,css结尾的文件保存12小时,并且不记录日志) access_log off; } 检查语法并且重新加载配置文件: [root@lnmp ~]# /usr/local/nginx/sbin/nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@lnmp ~]# /usr/local/nginx/sbin/nginx -s reload 证明:分别访问了以gif,js,html为结尾的3个文件,发现日志里只记录了html为结尾的访问信息。 [root@lnmp ~]# curl -x127.0.0.1:80 test.com/1.gif dasdasdafasdfaf [root@lnmp ~]# curl -x127.0.0.1:80 test.com/2.js fdasfsadfasdfzczv [root@lnmp ~]# curl -x127.0.0.1:80 test.com/index.html test.com [root@lnmp ~]# cat /tmp/test.com.log 127.0.0.1 - [14/Dec/2017:14:30:40 +0800] test.com "/index.html" 200 "-" "curl/7.29.0" 本文转自 小新锐 51CTO博客,原文链接:http://blog.51cto.com/13407306/2057946,如需转载请自行联系原作者

优秀的个人博客,低调大师

LAMP架构(配置防盗链,目录访问控制,文件/链接访问控制)

一、配置防盗链 实例: 假如你维护一个免费的论坛网站,是可以免费发图片的,有一个国外的恶意网站,把图片发在你的网站里,且在自己的网站里放入他在你网站发图的链接,这样在他的网站里就可以直接跳转到你的网站来访问图片,这样增加了自己网站的带宽,但是没有实质意义,因为自己的用户量并没有增长,怎么限制这种行为呢,是通过限制Referer(上一次访问的网站)来实现。 修改虚拟配置文件; [root@abc 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 增加以下内容 <Directory /data/wwwroot/111.com> (需要定义防盗链的目录) SetEnvIfNoCase Referer "http://111.com" local_ref referer白名单 SetEnvIfNoCase Referer "http://ask.apelearn.com" local_ref SetEnvIfNoCase Referer "^$" local_ref 空referer也设置白名单 <FilesMatch "\.(txt|doc|mp3|zip|rar|jpg|gif)"> 这些访问不要设置白名单 Order Allow,Deny 定义顺序,先允许白名单访问,剩下的给deny掉 Allow from env=local_ref </FilesMatch> </Directory> 检查语法错误且重新启动 [root@abc 111.com]# curl -e "http:www.qq.com/1.txt"-x127.0.0.1:80 111.com/1.png -I HTTP/1.1 403 Forbidden Date: Sun, 26 Nov 2017 08:50:30 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 Content-Type: text/html; charset=iso-8859-1 没有设置referer白名单的www.qq.com被403拒绝 [root@abc 111.com]# curl -e "http://ask.apelearn.com"-x127.0.0.1:80 111.com/1.png -I HTTP/1.1 200 OK Date: Sun, 26 Nov 2017 08:50:38 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 Last-Modified: Sun, 26 Nov 2017 07:07:52 GMT ETag: "7913-55edd71b4a200" Accept-Ranges: bytes Content-Length: 30995 Content-Type: image/png 设置了http://ask.apelearn.com白名单的被允许访问200 二、目录访问控制 访问控制目录,只有允许的源ip才能打开目录。其他的被deny 修改: [root@abc 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf <Directory /data/wwwroot/111.com/admin> Order deny,allow Deny from all Allow from 127.0.0.1 </Directory> Order 定义顺序。是先允许还是先访问,如果deny在前,则先执行下面deny开头的,如果allow在前,则执行allow开头的。例如这个配置文件写的是deny全部,如果把deny放在后面,则就算允许了127.0.0.1,后面还是会被deny掉 实验: [root@abc 111.com]# curl -x127.0.0.1:80 111.com/admin/index.php -I HTTP/1.1 200 OK Date: Sun, 26 Nov 2017 09:35:53 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 X-Powered-By: PHP/5.6.30 Content-Type: text/html; charset=UTF-8 白名单的127.0.0.1被允许访问 [root@abc 111.com]# curl -x192.168.52.100:80 111.com/admin/index.php -I HTTP/1.1 403 Forbidden Date: Sun, 26 Nov 2017 09:35:54 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 Content-Type: text/html; charset=iso-8859-1 没有白名单的192.168.52.100被deny 三、文件/链接访问控制 访问控制除了目录,还可以访问控制一个文件名/链接 修改: [root@abc 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf <Directory /data/wwwroot/111.com/> <FilesMatch admin.php(.*)> Order deny,allow Deny from all Allow from 127.0.0.1 </FilesMatch> </Directory> 加上FilesMatch admin.php(.*),表示在/data/wwwroot/111.com/ 下匹配到的文件全部被控制访问 测试: [root@abc admin]# curl -x192.168.52.100:80 111.com/admin/index.php -I HTTP/1.1 200 OK Date: Sun, 26 Nov 2017 09:47:09 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 X-Powered-By: PHP/5.6.30 Content-Type: text/html; charset=UTF-8 之前控制目录的index.php可以访问 [root@abc admin]# curl -x192.168.52.100:80 '111.com/admin/admin.php?sada' -I HTTP/1.1 403 Forbidden Date: Sun, 26 Nov 2017 09:48:33 GMT Server: Apache/2.4.28 (Unix) PHP/5.6.30 Content-Type: text/html; charset=iso-8859-1 目录下就没有访问的文件,但是显示403权限不够,说明403和404的区别,权限不够时就没有权利匹配或查看,所以不管文件是否真实存在 本文转自 小新锐 51CTO博客,原文链接:http://blog.51cto.com/13407306/2054192,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册