搭建分布式 ASP.NET Core Web

单台Web处理用户请求的能力是有限的,因此我们可能会需要搭建分布式的Web服务器。

当前市面上,可能用的比较多的是会话保持,这种模式下,开发者只需将先前开发好的、不支持会话共享的程序部署在多台服务器上,负载均衡提供商会要求开发者设置保持时间,就可以完成部署。但其缺点是仅仅将用户分配到不同节点,不是将请求分配到不同节点,粒度过大,会导致负载不够均衡。

下面我们从各个角度介绍一下如何让你的ASP.NET Core网站系统摆脱会话保持

Session Sharing

分布式Web的第一大棘手问题就是登录状态。ASP.NET Core中默认是将Session ID进行保护的,因此这些数据是被加密过的,并以xml文件形式存在保护区,因此我们要将这个文件共享出来。

因此我们需要实现Session Sharing,对于不同平台,我们有不同的做法(在ASP.NET Core 1.1.0发布前,我们只能通过文件系统进行共享):

Windows

在Windows中,我们使用UNC路径来实现共享。首先建立一个文件夹,在共享中赋予Guest用户读写权限。

Linux

Linux中我们需要安装nfs来实现共享,首先选择一个节点,作为nfs服务器(假设IP为10.0.0.254)

apt-get install nfs-kernel-serve

接下来创建一个文件夹:

mkdir /share

下面编辑nfs配置文件,以配置欲共享的路径

vi /etc/exports

在这个配置文件里,我们配置三个参数:路径、IP或IP段、读写权限。每行表示一条记录,可以重复。

/share     10.0.0.1/24(rw,sync,no_subtree_check)
/share     10.0.1.1/24(rw,sync,no_subtree_check)

保存后,重启nfs服务

service nfs-kernel-server restart

至此NFS服务器就部署完毕了,下面在各个节点中挂在nfs共享的文件夹。

安装portmap:

apt-get install portmap nfs-common

在每台节点中创建文件夹,作为挂载路径:

mkdir /share-remote
mount -t nfs 10.0.0.254:/share /share-remote

至此即完成了共享


我们需要为我们的ASP.NET Core程序配置DataProtect,让其将xml文件保存至共享路径中,进入Startup.cs,添加AddDataProtection,并指定路径:

public void ConfigureServices(IServiceCollection services)

{

#if WINDOWS    services.AddDataProtection()        .PersistKeysToFileSystem(

new DirectoryInfo(@"\\10.0.0.254\share"));

#elif LINUX    services.AddDataProtection()        .PersistKeysToFileSystem(

new DirectoryInfo(@"/share-remote"));

#elif REDIS_ON_NET_CORE_1_1_0

// ASP.NET Core 1.1.0 新增将Session ID存储至Redis中    var redis = ConnectionMultiplexer.Connect("10.0.0.254");    serviceCollection.AddDataProtection()        .PersistKeysToRedis(redis, "DATA_PROTECTION_KEYS_");

#endif}

DataProtect配置过后,需要配置分布式缓存:

services.AddDistributedRedisCache(x => {    x.InstanceName = "SESSION_INSTANCE_";    x.Configuration = "10.0.0.254"; 

// StackExchange.Redis Connection String}); services.AddSession(x => {    x.IdleTimeout = new TimeSpan(1, 0, 0); });

配置好分布式缓存后,session就已经可以share了,包括使用了Identity的网站也同时受益,摆脱了对会话保持的依赖。

SignalR Scale Out

如果网站使用了SignalR,那么需要将SignalR消息推送到各个节点,就需要使用Redis来Scale out SignalR:

进入project.json来添加Pomelo.AspNetCore.SignalR.Redis包,版本为0.1.0

ConfigureServices中添加下面的代码

services.AddRedis(x =>
{x.ConnectionString = "10.0.0.254";
  // StackExchange.Redis Connection Stringx.Database = 0;x.EventKey = "SIGNALR_INSTANCE"; }) .AddSignalR(options => {options.Hubs.EnableDetailedErrors = true; });

现在SignalR的消息就在各个节点中互通了。

原文链接:http://www.1234.sh/post/asp-net-core-distributed-web-server


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五分钟了解CDN

转载自 五分钟了解CDN一、什么是CDN? CDN全称Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。 通过在网络各处放置节点服务器所构成的在现…

Eclipse导入他人的Maven工程报错

一.什么是maven? Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在…

拼图游戏C语言课设实验报告,C语言拼图游戏实验报告.doc

C语言拼图游戏实验报告课程设计实验报告班级:光电104—2 姓名:刘云龙 学号:201058501220一、实验题目:使用C语言编写一个小游戏(拼图游戏)二、实验目的:C语言是每一个通信学生的必修课之一,此次课程设计要求…

.Net开源微型ORM框架测评

什么是ORM? 对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说&am…

大家都在说的分布式系统到底是什么

转载自 大家都在说的分布式系统到底是什么随着大型网站的各种高并发访问、海量数据处理等场景越来越多,如何实现网站的高可用、易伸缩、可扩展、安全等目标就显得越来越重要。为了解决这样一系列问题,大型网站的架构也在不断发展。提高大型网站的高可用架…

2015c语言9月答案,2015年9月计算机二级C语言预测题答案

2015年9月计算机二级C语言预测题答案一、 选择题1、B 2、C 3、D 4、C 5、C 6、D 7、C 8、D 9、C 10、D11、D 12、D 13、B 14、B 15、A 16、D 17、B 18、B 19、C 20、D二、 阅读程序题(1) 6,8 (2) 3.141593,3.1416,3.142 (3) 4 (4) 2,4 (5) 8三、 程序填空…

Redis集群~StackExchange.Redis(10月6号版1.1.608.0)连接Twemproxy支持Auth指令了

对于StackExchange.Redis这个驱动来说,之前的版本在使用Proxy为Twemproxy代理时,它是不支持Password属性的,即不支持原始的Auth指令,而我也修改过源代码,为CommandMap添加了Auth但最后测试的结果还是失败了&#xff0c…

使用JDOM2.0.4 操作/解析xml

转载自 使用JDOM2.0.4 操作/解析xml一、解析xml内容 xml文件内容:<?xml version"1.0" encoding"utf-8"?> <RETVAL successtrue> <Shop><sid>1</sid><name>北京鑫和易通贸易有限公司</name></Shop> &l…

c语言关于计算的函数,问个c语言题目,关于一个计算器的有参有返回函数!!!...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼printf("toM");scanf("%d",&toM);if(toM0)printf("错误&#xff0c;除数不能为0\n");else{resultarith_compliment(toN,toM);printf("\n%d",toN);printf("%%");printf(&quo…

TypeScript 2.0 已发布

微软最近发布了TypeScript 2.0&#xff0c;该版本提供了简化的声明文件获取、Non-nullable类型&#xff0c;以及Readonly修饰符。 TypeScript项目经理Daniel Rosenwasser称&#xff0c;他们团队对于该版本“紧随ECMAScript规范&#xff0c;为JavaScript库和工具提供了更广泛的支…

springboot创建项目2 开发环境的搭建

我也学习了一下 才想着去写个对应的服务器 前端已经全部搭建好了 有很多的坑 你们就不用再次采坑了 我只讲其中的 服务器部分 中间有好多 以后补充吧。。。。

XML解析(二),DOM解析XML

转载自 XML解析&#xff08;二&#xff09;&#xff0c;DOM解析XML上篇文章向大家介绍了SAX解析XML,为了这篇文章理解起来更加方便&#xff0c;所以还没看过SAX解析XML文章的&#xff0c;请戳这【XML解析&#xff08;一&#xff09;】SAX解析XML &#xff0c;这次给大家带来X…

如何通过反射将字符串转换为类

package org.entity; /*** 本案例演示如何通过反射将字符串转换为类* */ public class Test {public static void main(String[] args) {String user "org.entity.User";//字符串是该类的全限定名try {Class clzz Class.forName(user);Object classObjclzz.newInst…

在C语言的函数定义中 如果不需要返回结果,在C语言的函数定义中,如果不需要返回结果,就可以省略return语句...

语言义中语句数定省略保险般来能一几项的职以下说有。来源统计济数据的主要调查得社会经是获&#xff0c;需要包括如下容(的内应该。具体是指&#xff0c;结果积反映房空置面商品&#xff0c;而尚未出屋期末报告工可供销的房出租出租已竣是指售和售或。语言义中语句表现心理学的…

如何将 Microsoft Bot Framework 链接至微信公共号

说到 Microsoft Bot Framework 其实微软发布了已经有一段时间了&#xff0c;有很多朋友可能还不太了解&#xff0c;微软Bot的功能今天我给大家简单的介绍一下&#xff0c;Bot Framework的开发基础以及如何使用Bot Framework和我们的一个现有的三方客服&#xff08;例如一个微信…

XML解析(一),SAX解析XML

转载自 XML解析&#xff08;一&#xff09;&#xff0c;SAX解析XML一、概述SAX&#xff0c;全称Simple API for XML&#xff0c;是一种以事件驱动的XMl API&#xff0c;是XML解析的一种新的替代方法&#xff0c;解析XML常用的还有DOM解析&#xff0c;PULL解析&#xff08;Andr…

go编译库给c语言函数返回值,go语言 函数return值的几种情况

IOS开发基础知识--碎片361:tabBarController跳转到另一个一级页面 当我们用tabBarController时,若已经到其中一个TabBar的子页,又要跳转到某一个一级的页面时,可以这样写 //这样就可以避免跳 ...MapReduce的MapTask任务的运行源码级分析TaskTracker任务初始化及启动task源码级分…

编程语言的发展趋势及未来方向(3):函数式编程

关于声明式编程的还有一部分重要的内容&#xff0c;那便是函数式编程。函数式编程已经有很长时间的历史了&#xff0c;当年LISP便是个函数式编程语言。除了LISP以外我们还有其他许多函数式编程语言&#xff0c;如APL、Haskell、Scheme、ML等等。关于函数式编程在学术界已经有过…

idea中@Data标签getset不起作用

原 idea中Data标签getset不起作用 2017年06月08日 11:22:40 seapeak007 阅读数 27070 spring cloud中使用Data标签&#xff0c;不用手动添加get set方法&#xff0c;但是如果项目中其他类中使用getset方法&#xff0c;如果报错&#xff0c;原因是idea中没有添加Lombok插件&a…