当前位置: 首页 > news >正文

让网站会员做产品标签确认汽车宣传软文

让网站会员做产品标签确认,汽车宣传软文,京东网上购物平台,成都 视频网站建设一、前言回顾 在上篇文章Session分布式共享 Session Redis Nginx中#xff0c;好多同学留言问了我好多问题#xff0c;其中印象深刻的有#xff1a;nginx挂了怎么办#xff1f;采用Redis的Session方案与微软Session方案相比#xff0c;有什么优势呢#xff1f;Co… 一、前言回顾        在上篇文章Session分布式共享 Session Redis Nginx中好多同学留言问了我好多问题其中印象深刻的有nginx挂了怎么办采用Redis的Session方案与微软Session方案相比有什么优势呢Cookie也可以取代Session的采用Redis的Session方案优势在哪里Nginx的iphash方式到底是什么MachineKey有啥用Net Core怎样实现        那会儿看到大家的提问我的回答也只是从应用层面回答基本上的回答可以总结为“别人这么做了解决了这个问题我用这个方法也解决了这个问题原理请看链接。”很惭愧的说那时的我并没有完全理解他真正的优势在哪里只是凭着直觉和经验知道这样做比较好知道当一部分东西不可控时候将其解耦、可视化、集群就可以让一个系统更加健壮但没有一个理论支撑。经过最近一段时间的查阅资料和阅读书籍对此有了深刻理解本文将从网站架构的可用性角度对这种Session共享进行分析和讲解并用.net core再次实现这种架构模式。Session分布式共享的net core版因为工作没有机会应用到生产环境过往经验就更别提了所以只是研究性的请大家注意但园子里早有大牛写出了相关文章本文结束会将相关文章贴出 二、网站可用性--Session管理      可用性是网站架构中非常重要的一环什么是可用性说的简单些就是用户随时随地打开这个网站这个网站都能打开并且里面的功能都能用。如果可用性不高会出现什么情况大家想象一下春节在12306抢票的情景网站各种崩溃大家保准会想要是有别的方式能买到票我才不用12306这个破网站呢。这个例子有点极端因为业务场景比较极端当然这种现象也不光是网站可用性这一环出了问题。但是一个网站三天两头打不开要么是点开了里面的页面到处是报错页面和操作无反应你还会用这个网站么我相信我们在浏览网站时候只要不像12306这种垄断业务的网站出现不可用的情况我们一定会离开寻找其他类似的网站。      Session管理是网站可用性的内容之一大家都知道Http是无状态请求即无法追踪上次Http请求的相关信息但是业务中大量需要将Http变为有状态请求Session就随之产生了可是在分布式网站设计中无状态请求才能实现网站的横向拓展增减应用服务器因此又与Session相矛盾因为Session信息如果存储在网站应用服务器的缓存中加台服务器就不能用了因此将Session解耦是解决此问题的关键下面介绍网站常见的Session管理手段。 1、Session复制      Session复制是最早企业应用系统使用较多的一种服务集群Session管理机制开启Session复制功能即是在集群中的几台服务器之间同步Session对象Java中好像JBoss有这个功能.Net暂不知道。      优势Session信息读取快实现简单。      缺点集群规模较大时服务器之间Session复制会占用服务器资源和网络资源最后系统会不堪重负。 2、Session绑定       Session绑定的方式一般软/硬均衡负载服务器都会提供此功能例如上篇文章Nginx的IPhash方式均衡负载服务器利用Hash算法将同一IP分配到同一台服务器上即Session绑定在某台特定服务器上保证Session总能在这台服务器上获得又称作为会话黏滞。      缺点如果某台服务器宕机那么这台服务器上面的Session也就不存在了用户请求切换到其他服务器上因为没有Session而出错。   3、利用Cookie记录Session      通过Cookie记录Session信息是大部分网站采用的方法这种方式只要Cookie不滥用也是非常好非常成熟的方案。Cookie记录Session就是把一些状态信息放到了客户端每次请求都要传输到服务器。      优势这种方法简单易实现可用性高支持服务器横向拓展方案成熟      缺点安全性问题Cookie有大小限制而且每次请求传输Cookie会影响性能   4、Session服务器      Session服务器的方式管理Session是一种非常好的解决方案因为Session是为了业务需要Http状态而产生而分布式网站设计中提倡Http无状态为了满足这一设计Session服务器是将有状态的Session信息与无状态的应用服务器相分离再针对不同服务器的不同特性进行设计。例如我们将Session信息存入到Redis中那么Redis的集群配置、稳定性设置都有很多好的解决方案如果将Session存入到Memcache那么Memcache的集群配置、稳定性设置也会有很多成熟案例。这样我们就将一些问题简单化如果我们单独应用.Net的Session我们需要了解更多.Net深层次的东西并加以改造来保证其可用和稳定越深层的东西越需要时间和阅历而如果将Session存储介质转移到Redis中Redis集群方案、管理工具都非常成熟只需要配置配置就解决了Session的问题何乐而不为呢。      优势可用性高、安全性高、伸缩性好、性能高、信息大小无限制   三、.Net CoreRedisNginx实现Session分布式共享 1、前期准备环境       (1)Vs2017    (2).Net Core 1.1  (3) Win 7  (4)ubuntu 16.04 2、.Net Core简介        随着互联网的发展在当今中国市场外国不大清楚开源、跨平台是衡量一门语言、技术好坏的重要指标之一微软为了推动.Net开源及跨平台.Net Core随之诞生。        详见大牛的文章.NET Core与.NET Framework、Mono之间的关系        下面说说.Net Core给我的初步的感受          1.Net Core并没有颠覆之前C#语法           通俗讲就是之前说中国话C#现在还是说中国话只是说话的环境变了。          2.Net Core因为刚起步API变了或者少了很多           通俗讲就是说话环境变了而且里面有好多你没见过的东西你不知道用什么官方词语来描述因为官方正在找相关词来描述这些新东西。          3脱离IIS跨平台           通俗讲就是微软老妈为了不让我们到了新环境饿着怕离开现在这个环境WindowsIIS之后不知道怎么生存。于是教会了我们语言C#给了我们挣钱的工具.Net CoreKestrel说了一句“去吧孩子自己奋斗去吧稍等别忘了把这张Visa卡带上.Net Core SDK我会定期给你打钱的。”          4NuGet越来越重要           NuGet经过几年的发展越来越成熟.Net Core开源组件获取的主要方法通过NuGet可以下载各种中间件和组件而且方便快捷除了有时候断网但是可以使用国内镜像NuGet就像微软老妈给咱们的一个通讯录并告诉咱们如果你在某些方面需要帮助的时候可以通过NuGet找到你的七大姑八大姨来帮忙。 3、拓扑图           根据之前文章中成功的经验简单改造一下中间一个Windows系统和一个Ubuntu系统承载着.Net Core程序有人会问Windows那个咋不来个IIS啊我要说的是.Net Core实行走出去的原则基本脱离IIS如果IIS上面想部署.Net Core程序的话需要安装同样的应用程序并且站点配置的应用程序池也要变成“无托管代码”。 4、开发.Net Core程序使用Session 4-1、创建一个Web程序           用Vs2017创建一个.Net Core的Web应用程序且这个应用程序不包含身份验证信息          创建完如下 4-2、.Net Core调用Session         .Net Core使用Session需要引用相关Session的NuGet包网上一查发现.Net Core的官方Session组件类似一个中间件并且官方支持Redis。          注意.Net Core的Mvc不能直接使用Session如果你在程序里面写了个HttpContext.Session就会出现如下错误:Session has not been configured for this application or request. 4-2-1、Microsoft.AspNetCore.Session          .Net Core使用Session必须安装Microsoft.AspNetCore.Session他的NuGet包安装如下图 4-2-2、修改Startup.cs让Session可用           在相应位置加入高亮代码services.AddSession(); app.UseSession(); public void ConfigureServices(IServiceCollection services){// Add framework services.services.AddMvc();services.AddSession();} public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) {loggerFactory.AddConsole(Configuration.GetSection(Logging));loggerFactory.AddDebug();if (env.IsDevelopment()){app.UseDeveloperExceptionPage();app.UseBrowserLink();}else{app.UseExceptionHandler(/Home/Error);}app.UseStaticFiles();app.UseSession();app.UseMvc(routes {routes.MapRoute(name: default,template: {controllerHome}/{actionIndex}/{id?});}); } 4-2-3、Session写入和读取           Session的读取方式与.Net有所不同写法如下并且Session的HttpContext.Session.SetString或者HttpContext.Session.Set方法分别支持字符串和Byte数组所以复杂实体需要转化成Json存入Session中。 【Session 写入方法】 HttpContext.Session.SetString(key, strValue); 【Session 读取方法】 HttpContext.Session.GetString(key) 5、Session存储介质更换为Redis 5-1、首先配置Redis 详细配置方式见Session分布式共享 Session Redis Nginx redis-server redis.windows.conf 详细配置方式见Session分布式共享 Session Redis Nginx 5-2、安装Microsoft.Extensions.Caching.Redis.Core        NuGet中搜索Microsoft.Extensions.Caching.Redis.Core并安装此NuGet包是对Caching的拓展即可以更换Caching存储介质 5-3、appsettings.json配置Redis连接字符串        appsettings.json配置Redis连接字符串相当于web.config里面配置appsetting节点注意添加位置要在Logging上面否则读不到添加代码为下面的高亮部分 { Data: RedisConnection, ConnectionStrings: { RedisConnection: 192.168.8.138:6379 }, Logging: {IncludeScopes: false,LogLevel: {Default: Warning}} } 5-4、Startup.cs的ConfigureServices方法中添加引用 public void ConfigureServices(IServiceCollection services){// Add framework services.services.AddMvc();services.AddDistributedRedisCache(option {                    //redis 数据库连接字符串                   option.Configuration Configuration.GetConnectionString(RedisConnection);                   //redis 实例名                   option.InstanceName  master;              });              services.AddSession();           }          页面运行HttpContext.Session.GetString(key)然后用Redis管理工具RedisDesktopManager查询Session是否入库。 5-5、发布前指定IP和端口(重要)           如果你没有看这个步骤继续下面发布步骤等你发布时候你会发现一个尴尬的问题就是你用IP访问不了你的网站用localhost可以访问.Net Core默认是5000端口端口占用也会让你的网站访问不了。          只需要在Program.cs中添加高亮代码即可细心地人已经看到.UseUrls(new string[] { }) 传入的是个数组那么这里定义多个网站当你执行时候dotnet命令时候多个网站都会启动。 public static void Main(string[] args){var host new WebHostBuilder()//增加处*号表示ip                   .UseUrls(new string[] { http://*:7201 }) .UseKestrel().UseContentRoot(Directory.GetCurrentDirectory()).UseIISIntegration().UseStartupStartup().UseApplicationInsights().Build();host.Run();} 6、.Net Core 发布 6-1、Windows安装.Net Core发布环境[10.2.107.100]          1安装Windows Server Hosting (x64 x86)相当于IIS注意安装时候请联网好像是自动下载sdk具体没仔细研究。         2输入dotnet命令验证如果“报’dotnet’不是内部或者外部命令”请找到“C:\Program Files\dotnet”文件夹中的dotnet.exe用cmd来调用dotnet.exe来运行或者添加系统环境变量window中cmd命令可以节省在编写命令时候可以.exe即命令dotnet就是dotnet.exe        【坑1】          在win7下提示一下错误Failed to load the dll from [C:\Program Files\dotnet\host\fxr\1.0.1\hostfxr.dll], HRESULT: 0x80070057          解决方法          需要安装补丁KB2533623         下载地址如下          https://support.microsoft.com/en-us/kb/2533623        【坑2】          注意.net Core版本本文主要是用的.net Core 1.1.1开发的下面两个截图是版本按错了出的错误信息 6-2、Ubuntu安装.Net Core发布环境[10.2.107.46]          Ubuntu安装.Net Core官方写的很详细了照着做即可千万别抵触Linux系统抵触的话那就别用.Net Core了如果不知道Ubuntu和Linux的关系的话请百度。          最后验证dotnet命令是否可以使用。 6-3、发布网站        在项目上右键-发布…        点击发布按钮生成的文件如下SessionTest为应用程序名         好了有了这些文件我们只需要把这些文件扔到服务器上就成了但是怎么启动呢通过查询网上说只要用dotnet命令就成。继续实践…         说明我的项目叫做生成了这个为主要的dll也是程序的入口。         大家都知道.Net Core是跨平台的不同系统的服务器环境配置好了网上查询说是使用dotnet命令启动网站那么可以推断出几个平台的dotnet命令是一样的。 6-3-1、Windows启动.Net Core网站[10.2.107.100:7201]          启动.Net Core网站的命令很简单安装好发布环境的应用程序C:\Program Files\dotnet目录如下如果dotnet命令不能用可以直接调用dotnet.exe这个应用程序。          将生成好的网站复制到服务器上  cmd命令找到PublishOutput cd C:\PublishOutput dotnet运行网站命令 dotnet SessionTest.dll 成功以后之后再编译运行会提示下面截图 访问http://10.2.107.100:7201/如果一台机子有多个网卡多个IP其他IP的7201端口也是个独立网站   6-3-2、Ubuntu启动.Net Core网站[10.2.107.46:7201] 想办法将发布的程序复制到Ubuntu上面去我测试使用的VBox虚拟机。 具体方法传送门virtualbox中ubuntu和windows共享文件夹设置 dotnet SessionTest.dll 访问http://10.2.107.46:7201/ 7、Nginx配置 7-1、网站端口修改         nginx.conf配置修改         listen   80; 改成 listen   81; 因为一般都被80都被使用。 server {listen 81;…… } 7-2、增加负载均衡   nginx.conf中添加upstream节点 upstream Jq_one {       server 10.2.107.100:7201;        server 10.2.107.46:7201; } server { ..... }   7-3、location节点修改 location / {root html;index index.aspx index.html index.htm;#其中jq_one 对应着upstream设置的集群名称proxy_pass http://Jq_one; #设置主机头和客户端真实地址以便服务器获取客户端真实IPproxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } 7-4、Nginx启动命令         C:\server\nginx-1.0.2start nginx         或         C:\server\nginx-1.0.2nginx.exe 7-5、Nginx重新载入命令       C:\server\nginx-1.0.2nginx.exe -s reload   四、黎明前的黑暗-MachineKey         本以为做了上述准备和相关代码编写就能够实现Session共享了结果我想的太简单了应用程序发布后并不能实现Session共享难道分布式共享下Session需要特殊处理.Net我是怎么实现的它们的方法应该方法类似。我突然想到了MachineKey这个东西之前在.Net版本分布式共享时候需要添加这个东西评论也有人问我什么要加MachineKey。后来只能搜索.Net Core Machinekey关键词找到了以下几篇文章做参考。       搭建分布式 ASP.NET Core Web       ASP.NET Core 数据保护Data Protection       坎坷路ASP.NET Core 1.0 Identity 身份验证中集       net core 1.0 实现负载多服务器单点登录       此问题属于数据安全问题微软在开发.Net Core中延续了之前的设计采用数据保护Data Protection方式对一些内部数据进行加密解密设计如Session、Cookie等远不止这些。这样可以保证数据的真实性、完整性、机密性、隔离性。数据安全必然离不开加解密算法大家想一下之前.Net的WebFrom中的ViewState它最终解析到Html页面是个hidden标签里面有一串很复杂的字符串这个字符串是被数据保护Data Protection机制加密过的。Session也一样大家可以看看Session存到Redis中啥样见下图        数据保护Data Protection有个特性是隔离性大家可以想象一下数据保护核心是加密解密常见的加密方式有对称加密和非对称加密上一篇做分布式共享时候两台机子拷贝了同样的MahcineKey那么他的内部加密猜测好像是对称加密MachineKey直译中文为“机器钥匙”在联想隔离性那么可以推断出来不同机子密钥是不同的那么MachineKey的作用是统一不同机子的密钥。吐血中…….这个只是个猜测详细原理请参考专业文章 1、提取.Net Core的MachineKey         .Net Core的MachineKey存储是以key-xxxx-xxxx-xxxx-xxxx.xml的形式存储的那如何提取这个xml信息呢        Startup.cs的ConfigureServices添加下图高亮代码 public void ConfigureServices(IServiceCollection services){//抽取key-xxxxx.xml             services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(D:\XML)); services.AddSession();services.AddDistributedRedisCache(option {//redis 数据库连接字符串option.Configuration Configuration.GetConnectionString(RedisConnection);//redis 实例名option.InstanceName master;});services.AddMvc();}        查看D:\Xml里的xml文件   2、重写IXmlRepository接口固定Key        在项目中添加CustomXmlRepository.cs类其中keyContent中填写key.xml内容注意里面的几个时间现在还不能确定expirationDate对项目是否有影响有人问我KeyContent能否从文件里读回答是可以但是ubuntu的文件路径保准不是Windows的d:\之类的需要使用Linux的写法所以干脆字符串来的快。 using Microsoft.AspNetCore.DataProtection.Repositories; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using System.Xml.Linq;namespace SessionTest {public class CustomXmlRepository : IXmlRepository{private readonly string keyContent ?xml version1.0 encodingutf-8? key id9108538d-9ea4-45fb-a690-438c8d788619 version1creationDate2017-04-27T06:15:07.2194692Z/creationDateactivationDate2017-04-27T06:15:07.1844647Z/activationDateexpirationDate2017-07-26T06:15:07.1844647Z/expirationDatedescriptor deserializerTypeMicrosoft.AspNetCore.DataProtection.AuthenticatedEncryption.ConfigurationModel.AuthenticatedEncryptorDescriptorDeserializer, Microsoft.AspNetCore.DataProtection, Version1.1.1.0, Cultureneutral, PublicKeyTokenadb9793829ddae60descriptorencryption algorithmAES_256_CBC /validation algorithmHMACSHA256 /masterKey p4:requiresEncryptiontrue xmlns:p4http://schemas.asp.net/2015/03/dataProtection!-- Warning: the key below is in an unencrypted form. --valueHOz58FE6STtDHlMo2ZONoPgPTOOjRPikRWXmHOwNDS5o6NPb4hlgl/DxXUhat66soovBUFy1APXCQ4z30DDPyw/value/masterKey/descriptor/descriptor /key;public virtual IReadOnlyCollectionXElement GetAllElements(){return GetAllElementsCore().ToList().AsReadOnly();}private IEnumerableXElement GetAllElementsCore(){yield return XElement.Parse(keyContent);}public virtual void StoreElement(XElement element, string friendlyName){if (element null){throw new ArgumentNullException(nameof(element));}StoreElementCore(element, friendlyName);}private void StoreElementCore(XElement element, string filename){}} } 修改Startup.cs文件中的ConfigureServices方法加载自定义的CustomXmlRepository类 public void ConfigureServices(IServiceCollection services){抽取key-xxxxx.xml//services.AddDataProtection()// .PersistKeysToFileSystem(new DirectoryInfo(D:\XML));services.AddSingletonIXmlRepository, CustomXmlRepository();               services.AddDataProtection(configure  {configure.ApplicationDiscriminator newP.Web; });services.AddSession();services.AddDistributedRedisCache(option {//redis 数据库连接字符串option.Configuration Configuration.GetConnectionString(RedisConnection);//redis 实例名option.InstanceName master;});services.AddMvc();} 五、实现效果演示          演示效果说明          本机127.0.0.1也为10.2.107.100因为电脑性能有限没有弄windows虚拟机只弄了10.2.107.46这台Linux虚拟机。          MachineKey的这个实现思路也可以用到.Net Core的身份验证上。          UNC文件也可以实现Session共享方式          原理就是Windows和Linux通过文件共享和挂载的方式Key.xml共享一个文件但是总觉得有点怪怪的共享文件会不会被别人恶意篡改所以最后采用重写的方式实现。          对UNC方式感兴趣的请看搭建分布式 ASP.NET Core Web      六、后记感悟          希望通过本文让大家对网站的可用性中有个简单认识并了解到Session存入Redis中的优势。本文介绍的网站可用性内容中的冰山一角还有许多知识需要我们去学习和积累。         .Net Core版本的Session分布式共享让我们对.Net Core有了初步了解.Net Core的高性能、跨平台、开源让许多人改变了对.Net的看法但是.Net Core在中国市场的路还有很长要走我认为.Net Core并不是扭转.Net语言在中国市场占有率的银弹。真正的银弹也许是我们这些天天写程序的.Neter即使是微软大量宣传.Net Core、成功案例漫天飞我们不去学习、不去了解新知识我们最终会被淘汰。语言只是工具只有通过不断学习和努力将知识消化、吸收并最终分享给别人才会有最大的收获我们在十字路口迷茫之时为何不去学习新的知识和方法提升自身的经验和阅历。我经常会跟别人说工作前几年最重要的不是知识而是你做事的风格和为目标持之以恒的信念俗话说“江山易改本性难移”如果不好的工作态度和方法变成了你的工作习惯即使换了语言、换了工作甚至转了行都会对你的职业发展有很大影响。好的习惯一定要坚持有些事坚持一天可以、坚持两天可以、但是坚持三个月以上却变成了无法完成的任务更别提几年了“不积跬步无以至千里”只有坚持每天去磨练自己才能有所成长因为我知道我不是天才需要后天的努力才能成长。       “踏踏实实做人认认真真做事”我坚信自己的努力一定会有回报的只是现在还没有抓住机遇。最后向那些奋斗在一线使用.Net Core开发的人员致敬。         以上总结是我熬的味道浓郁的心灵鸡汤可话说啥时候能改掉我工作外的拖延症啊这篇文章一直拖拖拖论文一直拖拖拖学英语拖拖拖还有好多事要做可一直也是拖拖拖悲剧啊。。。突然发现鸭梨山大啊坏习惯不好改啊请大家引以为戒当然别做工作狂身体健康更重要有时间多陪陪家里人。         个人观点有可能因为知识和阅历的原因分析片面请多谅解。   七、参考文章          ASP.NET Core 使用 Redis 和 Protobuf 进行 Session 缓存         .Net Core Session使用         Asp.net Core 使用Redis存储Session         Using Sessions and HttpContext in ASP.NET Core and MVC Core         .NET Core与.NET Framework、Mono之间的关系         virtualbox中ubuntu和windows共享文件夹设置           搭建分布式 ASP.NET Core Web         ASP.NET Core 数据保护Data Protection         坎坷路ASP.NET Core 1.0 Identity 身份验证中集         net core 1.0 实现负载多服务器单点登录   转载于:https://www.cnblogs.com/yanglang/p/6805575.html
http://www.pierceye.com/news/399795/

相关文章:

  • 洛阳专业网站设计开发制作建站公司零陵区住房和城乡建设局网站
  • 在哪里可以学做网站游戏开发大亨下载
  • 找人做ps的网站无锡 做公司网站
  • 云速建站可以建个人网站吗wordpress仿站难吗
  • 如何取外贸网站域名凡科h5制作教程
  • 蜘蛛不抓取网站的原因中山h5网站建设
  • 百度免费推广网站建网站用的免费软件
  • 网站建设西安哪里好广州做企业网站的公司
  • 汉中市网站建设爱墙 网站怎么做
  • 失物招领网站开发项目需求分析搭建外文网站
  • 免费网站空间免备案自学php做网站
  • 南宁网站建设nnit30郴州市第一职业中专
  • 想开个影视网站 那有做的莱芜信息平台
  • js做网站登录有服务器了怎么做网站
  • 郑州餐饮网站建设哪家好零基础网站建设教学在哪里
  • 讲述做网站的电影建设工程公司名字大全
  • 易语言可以做网站管理系统吗网站备案查询工信部手机版
  • 珠海建站论坛淘宝客网站做一种还是做好几种
  • 杭州公司的网站建设公司教育网站制作运营
  • 福州手游网站建设长春火车站停运了吗
  • wordpress仿站博客视频教程建筑模板哪种好
  • 手机配件网站模板雇主品牌建设
  • 列车营销网站怎么做网站 审批号
  • 嘉定公司网站设计游仙建设局官方网站
  • 青山做网站西安十大网站制作公司
  • 网站服务器租用一年多少钱啊seo优化检测
  • 北京网站建设联系电话长春市网络科技有限公司
  • 软件下载网站免费大全济宁医院网站建设
  • 龙岩到永定株洲网站推广优化
  • 个人网站建设研究意义朔州seo网站建设