首页 文章 精选 留言 我的

精选列表

搜索[asp],共1555篇文章
优秀的个人博客,低调大师

1.6部署到CentOS「深入浅出ASP.NET Core系列」

希望给你3-5分钟的碎片化学习,可能是坐地铁、等公交,积少成多,水滴石穿,谢谢关注。 安装.NET Core 官方安装地址: https://www.microsoft.com/net/learn/dotnet/hello-world-tutorial?initial-os=linux 安装完后测试一下版本 测试一个webapi dotnet new webapi dotnet run 默认是在5000端口,虚拟机该端口还没打开,这个时候在虚拟机外面是无法访问的 再开一个终端使用curl访问 返回values数组,大功告成。 部署到CentOS 发布 使用vs2017发布一个mvc项目到本地文件夹 拷贝文件 使用fileZilla来拷贝到/home/netcore目录 启动站点:dotnet run hellworld.dll Nngix配置 端口映射 接下来就是映射5000端口到80端口,我们进入nginx配置目录 vi nginx.conf include会把所有*.conf的文件都引入进来,所有我们单独建一个netcore.conf 进入netcore.conf 在netcore.conf内部建立端口映射,配置如下 重启一下nginx systemctl restart nginx OK,部署成功! 我是.NET架构师张飞洪,入行10年有余,人不堪其忧,吾不改其乐,谢谢您关注我的头条号。

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

1.5准备CentOS和Nginx环境「深入浅出ASP.NET Core系列」

准备CentOS 1.1虚拟机 CentOS的安装这里使用vmware workstation 14来做虚拟机,当然你也可以用Oracle的虚拟机或者不用虚拟机,使用云服务或者使用双系统,不是什么大问题。 这里提供vmware workstation 14下载地址: http://www.xue51.com/soft/1258.html 如果觉得下载麻烦,也可以留言我这边提供下载和获取注册码。 1.2CentOS安装包 下载地址:https://www.centos.org/download/ 建议大家安装7.0及以上版本的Minimal ISO,因为有些东西我们不需要,同时高版本也是为了将来更好的支持Docker 1.3虚拟机安装CentOS 该步骤比较简单,就不做过多演示,如图所示: 进入安装界面: 安装完成: 注意:安装最小化版本,ping www.baidu.com是不通的,我们修改配置 vi ifcfg-ens33 修改ONBOOT=yes 然后重启网卡:service network restart 安装ifconfig工具 sudo yum install net-tools 使用SSH方式连接到CentOS,可以使用Putty或者SecureCRT Putty下载地址:http://mydown.yesky.com/pcsoft/199063.html 准备Nginx环境 这个过程也是比较简单,大家可以参考以下教程进行安装 https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-centos-7 1.安装nginx仓库 sudo yum install epel-release 2.安装 sudo yum install nginx 3.启动nginx sudo systemctl start nginx 4.打开防火墙 sudo firewall-cmd --permanent --zone=public --add-service=http sudo firewall-cmd --permanent --zone=public --add-service=https sudo firewall-cmd --reload 安装成功: 我是.NET架构师张飞洪,入行10年有余,人不堪其忧,吾不改其乐,谢谢您关注我的头条号。

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

(5)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 熔断降级(Polly)

一、 什么是熔断降级 熔断就是“保险丝”。当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死。 降级的目的是当某个服务提供者发生故障的时候,向调用方返回一个错误响应或者替代响应。举例子:调用联通接口服务器发送短信失败之后,改用移动短信服务器发送,如果移动短信服务器也失败,则改用电信短信服务器,如果还失败,则返回“失败”响应;在从推荐商品服务器加载数据的时候,如果失败,则改用从缓存中加载,如果缓存中也加载失败,则返回一些本地替代数据。 二、 Polly 简介 .Net Core 中有一个被.Net 基金会认可的库 Polly,可以用来简化熔断降级的处理。主要功能:重试(Retry);断路器(Circuit-breaker);超时检测(Timeout);缓存(Cache);降级(FallBack); 官网:https://github.com/App-vNext/Polly 介绍文章:https://www.cnblogs.com/CreateMyself/p/7589397.html Nuget安装指令:Install-Package Polly -Version 6.0.1 Polly 的策略由“故障”和“动作”两部分组成,“故障”包括异常、超时、返回值错误等情况,“动作”包括 降级(FallBack)、重试(Retry)、熔断(Circuit-breaker)等。 策略用来执行可能会有有故障的业务代码,当业务代码出现“故障”中情况的时候就执行“动作”。 由于实际业务代码中故障情况很难重现出来,所以 Polly 这一些都是用一些无意义的代码模拟出来。 Polly 也支持请求缓存“数据不变化则不重复自行代码”,但是和新版本兼容不好,而且功能局限性很大,因此这里不讲。 由于调试器存在,看不清楚 Polly 的执行过程,因此本节都用【开始执行(不调试)】 三、Polly简单使用 使用Policy的静态方法创建ISyncPolicy实现类对象,创建方法既有同步方法也有异步方法,根据自己的需要选择。下面先演示同步的,异步的用法类似。 举例:当发生ArgumentException异常的时候,执行Fallback代码。 Policy policy = Policy .Handle<ArgumentException>() //故障 .Fallback(() =>//动作 { Console.WriteLine("执行出错"); }); policy.Execute(() => {//在策略中执行业务代码 //这里是可能会产生问题的业务系统代码 Console.WriteLine("开始任务"); throw new ArgumentException("Hello world!"); Console.WriteLine("完成任务"); }); Console.ReadKey(); 如果没有被Handle处理的异常,则会导致未处理异常被抛出。 还可以用Fallback的其他重载获取异常信息: Policy policy = Policy .Handle<ArgumentException>() //故障 .Fallback(() =>//动作 { Console.WriteLine("执行出错"); },ex=> { Console.WriteLine(ex); }); policy.Execute(() => { //在策略中执行业务代码 //这里是可能会产生问题的业务系统代码 Console.WriteLine("开始任务1"); throw new ArgumentException("Hello1 world!"); Console.WriteLine("完成任务"); }); 如果Execute中的代码是带返回值的,那么只要使用带泛型的Policy<T>类即可: Policy<string> policy = Policy<string> .Handle<Exception>() //故障 .Fallback(() =>//动作 { Console.WriteLine("执行出错"); return "降级的值"; }); string value = policy.Execute(() => { Console.WriteLine("开始任务"); throw new Exception("Hello world!"); Console.WriteLine("完成任务"); return "正常的值"; }); Console.WriteLine("返回值:"+value); FallBack的重载方法也非常多,有的异常可以直接提供降级后的值。 (*)异常中还可以通过lambda表达式对异常判断“满足***条件的异常我才处理”,简单看看试试重载即可。还可以多个Or处理各种不同的异常。 (*)还可以用HandleResult等判断返回值进行故障判断等,我感觉没太大必要。 四、重试处理 Policy policy = Policy .Handle<Exception>() .RetryForever(); policy.Execute(() => { Console.WriteLine("开始任务"); if (DateTime.Now.Second % 10 != 0) { throw new Exception("出错"); } Console.WriteLine("完成任务"); }); RetryForever()是一直重试直到成功 Retry()是重试最多一次; Retry(n) 是重试最多n次; WaitAndRetry()可以实现“如果出错等待100ms再试还不行再等150ms秒。。。。”,重载方法很多,不再一一介绍。还有WaitAndRetryForever。 五、 短路保护 Circuit Breaker 出现N次连续错误,则把“熔断器”(保险丝)熔断,等待一段时间,等待这段时间内如果再Execute 则直接抛出BrokenCircuitException异常,根本不会再去尝试调用业务代码。等待时间过去之后,再执行Execute的时候如果又错了(一次就够了),那么继续熔断一段时间,否则就恢复正常。 这样就避免一个服务已经不可用了,还是使劲的请求给系统造成更大压力。 Policy policy = Policy .Handle<Exception>() .CircuitBreaker(6,TimeSpan.FromSeconds(5));//连续出错6次之后熔断5秒(不会再去尝试执行业务代码)。 while(true) { Console.WriteLine("开始Execute"); try { policy.Execute(() => { Console.WriteLine("开始任务"); throw new Exception("出错"); Console.WriteLine("完成任务"); }); } catch(Exception ex) { Console.WriteLine("execute出错"+ex); } Thread.Sleep(500); } 其计数的范围是policy对象,所以如果想整个服务器全局对于一段代码做短路保护,则需要共用一个policy对象。 六、策略封装,包裹Warp 可以把多个ISyncPolicy合并到一起执行: policy3= policy1.Wrap(policy2); 执行policy3就会把policy1、policy2封装到一起执行。 Policy的静态方法Wrap可以把更多的policy一起封装: policy9=Policy.Wrap(policy1, policy2, policy3, policy4, policy5); 七、超时处理 这些处理不能简单的链式调用,要用到Wrap。例如下面实现“出现异常则重试三次,如果还出错就FallBack”这样是不行的 Policy policy = Policy.Handle<Exception>().Retry(3).Fallback(()=> { Console.WriteLine("执行出错"); });//这样不行,系统会直接报错 注意Wrap是有包裹顺序的,内层的故障如果没有被处理则会抛出到外层。 下面代码实现了“出现异常则重试三次,如果还出错就FallBack” Policy policyRetry = Policy.Handle<Exception>().Retry(3); //出现异常重试三次 Policy policyFallback = Policy .Handle<Exception>() .Fallback(()=> { Console.WriteLine("降级"); }); //Wrap:包裹。policyRetry在里面,policyFallback裹在外面。 //如果里面出现了故障,则把故障抛出来给外面 Policy policy = policyFallback.Wrap(policyRetry); policy.Execute(()=> { Console.WriteLine("开始任务"); if (DateTime.Now.Second % 10 != 0) { throw new Exception("出错"); } Console.WriteLine("完成任务"); }); 运行结果: Timeout是定义超时故障,如果超时会抛出TimeoutRejectedException异常。 Policy policy = Policy.Timeout(3, TimeoutStrategy.Pessimistic);// 创建一个3秒钟(注意单位)的超时策略。 Timeout生成的Policy要和其他Policy一起Wrap使用。 超时策略一般不能直接用,而是和其他封装到一起用: Policy policy = Policy .Handle<TimeoutRejectedException>() //定义所处理的故障 .Fallback(() => { Console.WriteLine("降级"); }); policy = policy.Wrap(Policy.Timeout(2,TimeoutStrategy.Pessimistic)); policy.Execute(()=> { Console.WriteLine("开始任务"); Thread.Sleep(5000); Console.WriteLine("完成任务"); }); 执行结果: 上面的代码就是如果执行超过2秒钟,则直接Fallback。 这个的用途:请求网络接口,避免接口长期没有响应造成系统卡死。 八、Polly 的异步用法 所有方法都用Async方法即可,Handle由于只是定义异常,所以不需要异常方法: 带返回值的例子: Policy<byte[]> policy = Policy<byte[]> .Handle<Exception>() .FallbackAsync(async c => { Console.WriteLine("降级"); return new byte[0]; },async r=> { Console.WriteLine(r.Exception); }); policy = policy.WrapAsync( Policy.TimeoutAsync(2, TimeoutStrategy.Pessimistic, async(context, timespan, task) => { Console.WriteLine("timeout"); })); var bytes = await policy.ExecuteAsync(async () => { Console.WriteLine("开始任务"); HttpClient httpClient = new HttpClient(); var result = await httpClient.GetByteArrayAsync("http://static.rupeng.com/upload/chatimage/20183/07EB793A4C247A654B31B4D14EC64BCA.png"); Console.WriteLine("完成任务"); return result; }); Console.WriteLine("bytes长度"+bytes.Length); 执行结果: 没返回值的例子: Policy policy = Policy .Handle<Exception>() .FallbackAsync(async c => { Console.WriteLine("降级"); },async ex=> {//对于没有返回值的,这个参数直接是异常 Console.WriteLine(ex); }); policy = policy.WrapAsync(Policy.TimeoutAsync(3, TimeoutStrategy.Pessimistic, async(context, timespan, task) => { Console.WriteLine("timeout"); })); await policy.ExecuteAsync(async () => { Console.WriteLine("开始任务"); await Task.Delay(5000);//注意不能用Thread.Sleep(5000); Console.WriteLine("完成任务"); }); 执行结果: 注:此文章是我看杨中科老师的.Net Core微服务第二版和.Net Core微服务第二版课件整理出来的 现在的努力只是为了更好的将来,将来你一定不会后悔你现在的努力。一起加油吧!!! C#/.NetCore技术交流群:608188505欢迎加群交流 如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!

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

(3)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- Consul服务治理

Consul是注册中心,服务提供者、服务提供者、服务消费者等都要注册到Consul中,这样就可以实现服务提供者、服务消费者的隔离。 除了Consul之外,还有Eureka、Zookeeper等类似软件。 Consul就是来存储服务器名称与IP和端口对应关系的服务器 一、 consul 服务器安装 consul 下载地址 https://www.consul.io/ 墙外的网站 需要科学上网 cmd运行 consul.exe agent -dev 这是开发环境测试,生产环境要建集群,要至少一台 Server,多台 Agent (因为如果只有一台的话,如果服务死了 整个网站就出问题了) 开发环境中 consul 重启后数据就会丢失。 consul 的监控页面 http://127.0.0.1:850 consult 主要做三件事:提供服务到 ip 地址的注册;提供服务到 ip 地址列表的查询;对提供服务方的健康检查(HealthCheck); 二、 .Net Core 连接 consul 1. Nuget - > Install-Package Consul 安装Consul 2. 提供一个HealthCheck API接口 用于Consul做健康检查调用,只要返回个结果就可以 不论是什么结果。如 [Route("api/[controller]")] public class HealthController : Controller { [HttpGet] public IActionResult Get() { return Ok("ok"); } } 3.服务注册 Consul 及注销 public void Configure(IApplicationBuilder app, IHostingEnvironment env, IApplicationLifetime applicationLifetime) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseMvc(); string ip = Configuration["ip"]; int port = Convert.ToInt32(Configuration["port"]); string serviceName = "MsgService"; string serviceId = serviceName + Guid.NewGuid(); using (var client = new ConsulClient(ConsulConfig)) { //注册服务到 Consul ServiceRegister是一个异步方法 client.Agent.ServiceRegister(new AgentServiceRegistration() { ID = serviceId,//服务编号,不能重复,用 Guid 最简单 Name = serviceName,//服务的名字 Address = ip,//服务提供者的能被消费者访问的 ip 地址(可以被其他应用访问的地址,本地测试可以用 127.0.0.1,机房环境中一定要写自己的内网 ip 地址) Port = port,// 服务提供者的能被消费者访问的端口 Check = new AgentServiceCheck { DeregisterCriticalServiceAfter = TimeSpan.FromSeconds(5),//服务停止多久后反注册(注销) Interval = TimeSpan.FromSeconds(10),//健康检查时间间隔,或者称为心跳间隔 HTTP = $"http://{ip}:{port}/api/health",//健康检查地址 Timeout = TimeSpan.FromSeconds(5) } }).Wait();//Consult 客户端的所有方法几乎都是异步方法,但是都没按照规范加上Async 后缀,所以容易误导。记得调用后要 Wait()或者 await } //程序正常退出的时候从 Consul 注销服务 //要通过方法参数注入 IApplicationLifetime //程序结束的时候会调用这个方法 applicationLifetime.ApplicationStopped.Register(()=> { using (var client = new ConsulClient(ConsulConfig)) { client.Agent.ServiceDeregister(serviceId).Wait(); } }); } private void ConsulConfig(ConsulClientConfiguration c) { c.Address = new Uri("http://127.0.0.1:8500"); c.Datacenter = "dc1"; } 小哥哥 小姐姐们 如果本篇文章对你们有帮助的话 就点点右下角的推荐吧 0.0 现在的努力只是为了更好的将来,将来你一定不会后悔你现在的努力。一起加油吧!!! C#/.NetCore技术交流群:608188505欢迎加群交流 如果您认为这篇文章还不错或者有所收获,您可以点击右下角的【推荐】按钮精神支持,因为这种支持是我继续写作,分享的最大动力!

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

ASP.NET企业开发框架IsLine FrameWork系列之二--命名空间与契约

接上文 ILFW框架以最底层为基础,层层堆叠,上层一依赖于下层提供的服务,并实现其派发的接口,形成完整的FrameWork,不过由于时间原因,有些Provider之间的聚合偏高,例如AppLogProvider在使用数据库做为记录介质时,已经和DataProvider绑定,并不能使用第三方的数据引擎。 ILFW共有18个命名空间,分别管理着这些Provider的主要方法以及各种类库、接口,每个命名空间并非独立,正如上图表示的一样,所以如果你希望使用ILFW的某一个Provider,可能需要引入几个dll。 命名空间名称列表: 表 1.1 命名空间 ILFW将每一个Provider分为功能、枚举以及配置,每一个Provider都是遵从这个契约开发的,同时这也是命名空间的划分规则。 “功能”命名空间表示该Provider的主体完成任务,“功能”命名空间会包括接口、抽象类以及对这些抽象元素的实现,它是Provider的主体部分。 “枚举”命名空间表示Provider中所有用到的需要与用户交互的数据类型。 “配置”命名空间表示Provider需要配置文件支持的信息部分,Provider运行前,系统会自动加载相应的配置文件,并加载相关节点,将这些节点内的信息提供给“功能”模块进行处理。 图 1.2 命名空间结构 结合本人多年经验总结,将系统开发中重用较多的部分和团队协作开发时较难控制的部分,以面向对象方式封装,形成一套业务无关的底层架构(ILFW),ILFW具有如下优势: 三层结构分层明显,程序结构易懂,可扩展性强。 系统较核心的业务驱动层与ILFW皆采用面向对象原则设计,利用继承、多态等方式,结合接口,增强“驱动的可扩展性”,上层只需继承或实现相关类或接口,即可对现有底层方法进行扩展。 具有组件的模块化,灵活和重用性高。 由于ILFW分别面向数据、存储、安全进行抽象与封装,业务层面通过配置相关节点并调用方法的方式完成相关业务,所以这种方式增强业务层面的代码的简捷易懂性,降低了耦合,执行模块的功能或与模块交流信息只通过调用公有接口来实现 开发人员减轻重新建立解决复杂问题方案的负担和精力。 软件产品的后期运行维护是个巨大的工程,单纯从前期开发时间上考虑其开发效率是不理智的,也是不公平的。采用ILFW架构,则可提升开发效率,一些复杂的外围控制代码,之需要用简短的内部方法处理,对表现层的修改即使发生错误,也绝对不会将错误扩展到业务逻辑层,更不会影响持久层。 ILFW以Provider的方式提供给程序人员使用,不同的Provider代表不同的封装,可以完成不同的任务,同时各个Provider之间还会互相调用。 本文转自Aicken(李鸣)博客园博客,原文链接:http://www.cnblogs.com/isline/archive/2009/12/17/1626503.html,如需转载请自行联系原作者

资源下载

更多资源
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部分的功能。

用户登录
用户注册