首页 文章 精选 留言 我的

精选列表

搜索[软件构建],共10000篇文章
优秀的个人博客,低调大师

nginx+tomcat+memcached构建session共享集群

一、安装配置tomcat 配置前说明: 系统为centos7 m1.xsllqs.com地址为192.168.1.107 c1.xsllqs.com地址为192.168.1.114 c2.xsllqs.com地址为192.168.1.113 安装tomcat需要配合JDK使用,JDK有oracle JDK和open JDK两种 oracle JDK8的下载地址:http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html tomcat的下载地址:http://tomcat.apache.org/ c1.xsllqs.com(192.168.1.114)下载安装jdk(建议加载到本地在传上去)和tomcat [root@c1~]#wgethttp://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm [root@c1~]#wgethttp://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.36/bin/apache-tomcat-8.0.36.tar.gz [root@c1~]#ls apache-tomcat-8.0.36.tar.gzjdk-8u73-linux-x64.rpm [root@c1~]#yuminstalljdk-8u73-linux-x64.rpm [root@c1~]#vim/etc/profile.d/java.sh exportJAVA_HOME=/usr/java/latest exportPATH=$JAVA_HOME/bin:$PATH [root@c1~]#./etc/profile.d/java.sh [root@c1~]#java-version javaversion"1.8.0_73" [root@c1~]#tarxfapache-tomcat-8.0.36.tar.gz-C/usr/local [root@c1~]#cd/usr/local/ [root@c1local]#ln-svapache-tomcat-8.0.36tomcat "tomcat"->"apache-tomcat-8.0.36" [root@c1tomcat]#vim/etc/profile.d/tomcat.sh exportCATALINA_HOME=/usr/local/tomcat exportPATH=$CATALINA_HOME/bin:$PATH [root@c1tomcat]#./etc/profile.d/tomcat.sh c2.xsllqs.com(192.168.1.113)下载安装jdk和tomcat [root@c2~]#wgethttp://download.oracle.com/otn-pub/java/jdk/8u73-b02/jdk-8u73-linux-x64.rpm [root@c2~]#wgethttp://mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.0.36/bin/apache-tomcat-8.0.36.tar.gz [root@c2~]#ls apache-tomcat-8.0.36.tar.gzjdk-8u73-linux-x64.rpm [root@c2~]#yuminstalljdk-8u73-linux-x64.rpm [root@c2~]#vim/etc/profile.d/java.sh exportJAVA_HOME=/usr/java/latest exportPATH=$JAVA_HOME/bin:$PATH [root@c2~]#./etc/profile.d/java.sh [root@c2~]#java-version javaversion"1.8.0_73" [root@c2~]#tarxfapache-tomcat-8.0.36.tar.gz-C/usr/local [root@c2~]#cd/usr/local/ [root@c2local]#ln-svapache-tomcat-8.0.36tomcat "tomcat"->"apache-tomcat-8.0.36" [root@c2tomcat]#vim/etc/profile.d/tomcat.sh exportCATALINA_HOME=/usr/local/tomcat exportPATH=$CATALINA_HOME/bin:$PATH [root@c2tomcat]#./etc/profile.d/tomcat.sh 二、修改tomcat配置文件 [root@c1tomcat]#cd/usr/local/tomcat/webapps/ [root@c1webapps]#mkdirmyapp/{lib,classes,WEB-INF,META-INF}-pv [root@c1webapps]#cdmyapp/ 添加c1和c2的主页文件 [root@c1myapp]#vimindix.jsp <%@pagelanguage="java"%> <html> <head><title>Tomcat1</title></head> <body> <h1><fontcolor="red">c1.xsllqs.com</font></h1> <tablealign="centre"border="1"> <tr> <td>SessionID</td> <%session.setAttribute("xsllqs.com","xsllqs.com");%> <td><%=session.getId()%></td> </tr> <tr> <td>Createdon</td> <td><%=session.getCreationTime()%></td> </tr> </table> </body> </html> [root@c2myapp]#vimindix.jsp <%@pagelanguage="java"%> <html> <head><title>Tomcat2</title></head> <body> <h1><fontcolor="blue">c2.xsllqs.com</font></h1> <tablealign="centre"border="1"> <tr> <td>SessionID</td> <%session.setAttribute("xsllqs.com","xsllqs.com");%> <td><%=session.getId()%></td> </tr> <tr> <td>Createdon</td> <td><%=session.getCreationTime()%></td> </tr> </table> </body> </html> 修改tomcat-user.xml(c1和c2都要改) [root@c1conf]#vim/usr/local/tomcat/conf/tomcat-users.xml #在</tomcat-users>中添加 <rolerolename="manager-gui"/> <rolerolename="admin-gui"/> <userusername="tomcat"password="<tomcat>"roles="manager-gui,admin-gui"/> 修改server.xml(c1和c2都要改) [root@c1conf]#vim/usr/local/tomcat/conf/server.xml #修改主配置文件,appBase后面是应用的相对路径也可以是绝对路径 <Hostname="localhost"appBase="webapps" unpackWARs="true"autoDeploy="true"> #这里是访问日志的设置 <ValveclassName="org.apache.catalina.valves.AccessLogValve"directory="logs" prefix="localhost_access_log"suffix=".txt" pattern="%h%l%u%t&quot;%r&quot;%s%b"/> #这里设置Context调用msm需要的组件,m1为主c2为备,因为我这里只有3台机器所以把c2作为备,正常情况是4台,2台memcached和2台tomcat <Contextpath="/myapp"docBase="/usr/local/tomcat/webapps/myapp"reloadable="true"> <ManagerclassName="de.javakaffee.web.msm.MemcachedBackupSessionManager" memcachedNodes="m1:192.168.1.107:11211,c2:192.168.1.113:11211" failoverNodes="m1" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory" /> </Context> 测试配置文件 [root@c1~]#catalina.shconfigtest [root@c2~]#catalina.shconfigtest [root@c1~]#catalina.shstart [root@c2~]#catalina.shstart 三、安装msm c1和c2上下载msm需要的jar包 [root@c1~]#wgethttp://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/1.9.4/memcached-session-manager-1.9.4.jar [root@c1~]#wgethttp://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager-tc8/1.9.4/memcached-session-manager-tc8-1.9.4.jar [root@c1~]#wgethttp://repo1.maven.org/maven2/de/javakaffee/msm/msm-javolution-serializer/1.9.4/msm-javolution-serializer-1.9.4.jar [root@c1~]#wgethttp://repo1.maven.org/maven2/net/spy/spymemcached/2.11.1/spymemcached-2.11.1.jar [root@c1~]#wgethttp://www.java2s.com/Code/JarDownload/javolution/javolution-5.4.3.1.jar.zip [root@c1~]#mvjavolution-5.4.3.1.jarmemcached-session-manager-1.9.4.jarmemcached-session-manager-tc8-1.9.4.jarmsm-javolution-serializer-1.9.4.jarspymemcached-2.11.1.jar/usr/local/tomcat/lib/ m1和c2上安装memcached [root@m1~]#yuminstallmemcached [root@c2~]#yuminstallmemcached m1上安装nginx修改nginx的配置文件 [root@m1~]#yuminstallnginx [root@m1~]#vim/etc/nginx/nginx.conf #server外加入 upstreamtcsrvs{ server192.168.1.114:8080; server192.168.1.113:8080; } #server内加入 location~*\.(jsp|do)${ proxy_passhttp://tcsrvs; } [root@m1~]#nginx-t 启动服务 [root@m1~]#systemctlstartnginx.service [root@m1~]#systemctlstartmemcached [root@c2~]#systemctlstartmemcached 四、测试

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

基于docker构建jenkins和svn服务(转)

码农们很定都知道svn的重要性,机器坏掉丢代码的惨痛教训想必很多人都有。 jenkins可能很多人都不了解。这是一个持续集成的工具,在敏捷开发领域很流行;跟svn结合可以实现定期build、checkin之后build等功能。介绍可以看这里https://www.ibm.com/developerworks/cn/java/j-lo-jenkins/ 基于docker单独部署jenkins和svn都是很简单的事情,找到image,配置端口、配置volume,完事。 这篇文章主要介绍如何把两个服务连起来。 link是docker提供的重要工具,它提供类似名字服务的功能,link起来的容器可以通过名字标识访问。下面这篇文章详细介绍了link的使用方法和原理。http://dockerpool.com/static/books/docker_practice/network/linking.html 编排文件 用编排文件来描述互相依赖的服务是推荐的方式。这两个服务的编排文件如下。 jenkins: image: 'jenkins:latest' labels: aliyun.scale: '1' #端口映射。8080使用户访问的端口,50000是与svn交互的端口。不过这个例子中我们没有使用。 #另外,实际部署是需要添加volume ports: - '50000:50000/tcp' - '8080:8080/tcp' restart: always #使用link之后,可以用svn这个名字访问svn links: - svn:svn svn: environment: - SVN_REPONAME=repos image: 'erikxiv/subversion:latest' labels: aliyun.scale: '1' ports: - '3690:3690/tcp' restart: always 部署步骤 下面以阿里云容器服务为例,介绍一下部署过程1. 创建编排文件,输入上面的文件内容 用该编排文件启动服务 找到服务的节点IP,用http://节点IP:8080/访问jenkins服务 在jenkins上创建一个新项目,用link名访问svn http://yq.aliyun.com/articles/1830?spm=5176.100239.yqblog1.107.lyqEQr

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

物联网学习笔记——构建RESTFul平台1

0.前言 前些时间顺着Yeelink学习了RESTFUL,使用PHP和Slim框架尝试实现简单的REST API,树莓派可通过GET方法获得JSON数据包,通过这种方式实现了树莓派和服务器(我的PC)的互动。但是由于没有WEB前端,所以只能使用cURL工具或直接修改数据库的方式改变LED状态, 体验非常差。 REST API入门体验可参考 【 PHP再学习4—— slim框架学习和使用】 【 PHP再学习5——RESTFul框架 远程控制LED】 受到【 开源IOT——一个最小的物联网系统设计方案及源码】一文的影响。我决定除了服务器和嵌入式侧之外,我应该再多做一些。 WEB前端涉及到非常多的知识,下面提供一些学习资料。下面各种技术您可能不知道但是您一定用过。 【HTML】——超文本标记语言 【CSS】——级联样式表,能够对网页中的对象的位置排版进行像素级的精确控制 【Javascript】——网络的脚本语言 【Jquery】——JavaScript 库,极大地简化了 JavaScript 编程 【Ajax】——异步的 JavaScript 和 XML,与服务器交换数据并更新部分网页的艺术 本例部分源代码——【 HTML代码】 1.前端框架——Bootstrap 由于前端的内容太多了,需要学习很长的时间(技术可学习,但是审美我真学不来)。还好各路高手开发了前端框架可以让我们方便而美观的实现网页开发,而把精力放在真正的idea上。推荐使用Bootstrap框架,Bootstrap是Twitter推出的一个用于前端开发的开源工具包,是一个CSS/HTML框架。 学习资料 【 Bootstrap中文网】 【 Bootstrap 教程】 2.简单例子 下面一个简单的例子来自于Bootstrap中文网,仅修改了title和h1元素中等内容。 [html] view plain copy <!DOCTYPEhtml> <html> <head> <title>LEDRemoteControlTemplate</title> <metaname="viewport"content="width=device-width,initial-scale=1.0"> <!--Bootstrap--> <linkrel="stylesheet"href="http://cdn.bootcss.com/twitter-bootstrap/3.0.3/css/bootstrap.min.css"> </head> <body> <h1>LEDRemoteControlusingRESTAPI!</h1> <!--jQuery(necessaryforBootstrap'sJavaScriptplugins)--> <scriptsrc="http://cdn.bootcss.com/jquery/1.10.2/jquery.min.js"></script> <!--Includeallcompiledplugins(below),orincludeindividualfilesasneeded--> <scriptsrc="http://cdn.bootcss.com/twitter-bootstrap/3.0.3/js/bootstrap.min.js"></script> </body> </html> 图1 简单例子 【若干说明】 【CDN】在这里并没有把Bootstrap框架放置于本地服务器,而是使用了CDN服务。CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。 【JQuery】Bootstrap需要JQuery的支持 【CSS和JS】先载入Bootscript的CSS样式,然后载入Bootscript的JS包。 3.加个表格 【设计思路】 上面的例子未免有些单薄,可再加入一些表格和DIV块。基本思路——网页分为3个部分,一个部分为Header,包含一些作者信息;第二部分为主要内容——表格,表格中包含LED设备的编号、描述和当前状态(打开或关闭)等,该部分内容和数据库中的表结构对应。最后一部分为footer,可包含一些其他的信息例如我的邮箱等。 【HTML】 [html] view plain copy <body> <divclass="container"> <divclass="row"> <divclass="span12"> <pclass="lead">徐凯经验分享小站</p> </div> </div> <divclass="row"> <divclass="span12"> <tableclass="tabletable-hover"> <thead> <tr> <th>编号ID</th> <th>描述DESC</th> <th>状态STATUS</th> <th>动作ACTION</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>RPi.PCF8574.IO0</td> <td>ON</td> <td>ACTION</td> </tr> <tr> <td>2</td> <td>RPi.PCF8574.IO1</td> <td>OFF</td> <td>ACTION</td> </tr> </tbody> </table> </div> </div> <divclass="row"> <divclass="span12"> <pclass="text-rightlead">如果有问题请邮件我,别客气</p> <pclass="text-rightlead"> <em>Email:xukai19871105@126.com</em> </p> </div> </div> </div> 图2 加入表格后的效果 【几点说明】 【container】<div class="container">container可理解为一个容器,该容器包裹了页面上的所有内容。 【网格布局】 bootstrap采用网格布局,<div class="row"> <div class="span12">row代表一行,span代表一行中的内容。在一行中最多可分为12个单元,最小单元用span1标记,最大单元用span12标记。举个例子<div class="span6">占用该行的6个单元,占用该行的一半。 【table】在bootstrap中可选择表格的风格,<table class="table table-hover">本例选择了hover形式,当鼠标移动到某一行时,该行的背景会变得灰色一些。这种简单的动态效果给用户更好的体验。 【thead tbody tr td】thead为表头标签,tbody为表格内容标签,tr为表格行标签,td为表格中的具体单元标签。 4.按钮热身 【设计思路】 在表格每行最后一个td标签中加入一个Button,点击该Button可以翻转stauts。例如点击Button,同行的Status会从ON变为OFF,再次点击从ON变为OFF。为了实现这种对应关系的操作,在tr标签中加入一个设备编号取名为dev_id。 【HTML】 [html] view plain copy <tableclass="tabletable-hover"> <thead> <tr> <th>编号ID</th> <th>描述DESC</th> <th>状态STATUS</th> <th>动作ACTION</th> </tr> </thead> <tbody> <trdev_id="1"> <td>1</td> <td>RPi.PCF8574.IO0</td> <td>off</td> <td> <buttontype="button"class="btnbtn-primarybtn-xs">Toggle</button> </td> </tr> <trdev_id="2"> <td>2</td> <td>RPi.PCF8574.IO1</td> <td>off</td> <td> <buttontype="button"class="btnbtn-primarybtn-xs">Toggle</button> </td> </tr> </tbody> </table> 图3 加入按钮后的效果 【几点说明】 【tr编号】 <tr dev_id="1"> 给每一行加入一个编号,1、2、3以此类推逐个排列。 【Button】<button type="button" class="btn btn-primary btn-xs"> bootstrap提供了多种标签风格,在这里选择最小号的Button——btn-xs。 5.按钮互动 【设计思路】 要实现按钮互动就需要写点javascript代码,幸好Javascript不算复杂非常容易学习。编程之前需要理解一下HTML节点的概念。在HTML中所有的元素都是节点,如此之多的节点组成了“树”,节点有父节点、有子节点也会有邻居节点。例如本例中,tr标签有4个td子节点(td子节点的编号从0开始),在最后一个td节点中又有一个button节点。 【tr dev_id="1"】——> 【td(id)】【td(desc)】【td(status)】【td(action)】 【td(action)】——> 【button】 那么如果点击button想要获得表格中该行dev_id的信息,那么就需要找button的“爷爷”索要。 【javascript】 [javascript] view plain copy <script> $(document).ready(function(){ $('.btn').on("click",function(){ //获得tr元素 vartrobj=$(this).parent().parent(); //tr元素中包含dev_id属性 vardev_id=trobj.attr('dev_id'); console.log(dev_id); //访问该tr元素的所有子td元素 vartdobj=$(trobj).children("td"); varstatus_obj=$(tdobj).eq(2); varstatus_str=status_obj.text(); console.log(status_str); if(status_str=="on"){ status_obj.text("off"); sendLedControl(dev_id,"off"); }else{ status_obj.text("on"); sendLedControl(dev_id,"on"); } }); }); </script> 【控制台查看效果】 web浏览器中的控制台有点和串口调试相似,在chrome浏览器中 工具->开发者工具。 图4 控制台调试 【若干说明】 【$(document).ready()】当 DOM(文档对象模型) 已经加载,并且页面(包括图像)已经完全呈现时,会发生 ready 事件。 【$('.btn').on("click",function())】按钮点击事件响应,$('.btn')代表所有所有class为btn的按钮——表格中最后一列按钮。 【this】在按钮点击事件中,this为button标签。如果使用console.log打印的话,输出内容为<button type="button" class="btn btn-primary btn-xs">Toggle</button>。但是$(this)则代表一个文件对象模型,$(this) 是一个完整的对象包含很多属性和方法。 【选择tr】var trobj = $(this).parent().parent(); 试图寻找button的爷爷 【获得dev_id】var dev_id = trobj.attr('dev_id'); dev_id在td标签中,使用attr方法便可获得目标属性。 【获得所有的td标签】var tdobj = $(trobj).children("td"); 此时td标签共有4个——返回4个td对象 【定位第2个td标签】var status_obj = $(tdobj).eq(2); eq(2)代表选择第2个(从0开始)td标签——对应status标签,var status_str = status_obj.text();取出当前内容并通过console.log打印。 【翻转操作,修改text】status_obj.text("off"); 使用text方法重新修改td标签的属性。 【发送PUT请求】 sendLedControl 请查看下节内容。 6.PUT更新 【设计思路】 使用ajax发送一个PUT请求,更多信息请参考【 PHP再学习5——RESTFul框架 远程控制LED】,PUT请求的格式如下: PUT /api/leds/1 Host: localhost Content-Length: 15 {"status":"on"} 【代码实现】 [javascript] view plain copy functionsendLedControl(dev_id,cur_status){ $.ajax({ url:'/api/leds/'+dev_id,///api/leds/1 async:true, dataType:'json', type:'PUT', data:JSON.stringify({status:cur_status}), success:function(data,textStatus){ console.log("success"); }, error:function(jqXHR,textStatus,errorThrown){ console.log("error"); }, }); } 【执行结果】 chrome浏览器 工具->开发者工具 选择Network Tag 图5 发送PUT请求 图6 查看status新状态 【若干说明】 【url】 /api/leds/1(和【 PHP再学习5——RESTFul框架 远程控制LED】略有差异),LED设备的"网址"。 【dataType】请求内容为JSON格式 【type】请求方法为PUT——更新某LED设备信息 【data】请注意使用JSON.stringify方法,转换之后的格式为{"status":"on"},若没有stringify方法转换的结果为status:on,这并不符合PUT上传内容的规范。 【 success 和 error】正确处理和错误处理方法。 【遗留问题】虽然PUT请求和响应完全正确,但是Jquery总是调用error。网上查找了众多博客和帖子依然没有解决。再思考是不是PUT请求没有响应导致的,修改服务器侧代码问题,使得PUT响应中包含更新之后的LED状态问题,问题随之解决。 7.总结和源码 因为对前端相关技术不熟悉,所以我以很认真的态度写完了这篇博文。如果您觉得内容中说的不清楚或者错误的地方请留言或者Email我。认真学完这篇博文,发现前端技术javascript,ajax和jquery没有想象的那么可怕甚至还挺好用的。这几天关注了espruino——使用javascript开发MCU的平台,总觉得工程师应该多学一些,见多识广才才行。 【 HTML代码】

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册