详解之:linux下tomcat、nginx的负载均衡及memcached对session共享的实现_weixin_34250434的博客-程序员信息网

技术标签: memcached  java  运维  

写在前面:
最近几天一直做nginx的负载均衡,折腾了将近一周,在网上查了很多资料,终于在今天将一系列的流程及功能跑通。在学习的过程中,发现网上大多数资料都写的很笼统,或者就是写的让新手迷迷糊糊,似懂非懂,很多的配置参数等都不是很明白,配置的时候也就造成很多地方不确切。现在我对我这几天的配置学习予以总结,从下载到安装、环境的搭建,以及负载均衡的配置,参数的详细解释,以及memcached的session共享,都会一一介绍,并保证所用的代码和配置都经过本人的测试并实现功能,希望给予对亟需解决linux+tomcat+nginx+memcached实现负载均衡以及session共享的同行特别是新手有一些帮助。

一、环境的介绍:

操作系统采用: CentOS-5.6-i386

 项目部署在:tomcat6.0,tomcat一共有两个,分别命名为tomcat6.0_1、tomcat.0_2.这两台机器都运行在一台服务器上,IP为192.168.128.129

 负载均衡采用版本:nginx-1.2

session的管理:memcached-1.4.15

由于资源有限,所有的程序安装测试均在一台服务器上完成。

二、jdk的环境的搭建tomcat的安装与项目的部署:

1、具体的部署请参考我前两天的文章:http://blog.csdn.net/jessonlv/article/details/7987434,所有的代码都通过测试。按照上面的方式分别安装部署两个tomcat,并分别命名为tomcat6.0_1、tomcat6.0_2.

2、这里重点说下文章之外的配置:由于两个tomcat运行在一台服务器上,所以要分别修改tomcat的端口,故修改/conf/server.xml,让其能在一台机器上运行。具体代码如下:

tomcat6.0_1配置:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <Server port="18005" shutdown="SHUTDOWN">  
  2.   
  3. <Connector port="18080" protocol="HTTP/1.1"   
  4.                connectionTimeout="20000"   
  5.                redirectPort="8443" />  
  6.   
  7. <Connector port="18009" protocol="AJP/1.3" redirectPort="8443" />  
  8. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">  


tomcat6.0_2配置:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <Server port="18006" shutdown="SHUTDOWN">  
  2.   
  3. <Connector port="18081" protocol="HTTP/1.1"   
  4.                connectionTimeout="20000"   
  5.                redirectPort="8443" />  
  6.   
  7. <Connector port="18010" protocol="AJP/1.3" redirectPort="8443" />  
  8. <!--此处同上为修改Engine节点的jvmRoute为tomcat2-->  
  9. <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">  


 至此,一台服务器上的两个tomcat配置完毕。

三、nginx的安装及负载均衡的配置:

nginx的安装一般采用两种方式,一种是yum命令的安装,第二种是下载tar.gz包,采用编译的方式安装。

第一种比较简单,但是一般服务器都不支持yum命令,在此做简单介绍:

 01.1、rpm -Uvh http://nginx.org/packages/centos/5/noarch/RPMS/nginx-release-centos-5-0.el5.ngx.noarch.rpm
 01.2、执行安装:yum安装nginx:
yum --disablerepo=* --enablerepo=base --enablerepo=nginx install nginx
 此安装方式有可能需要安装gcc编译器:gcc安装:下载:http://www.linuxfromscratch.org/blfs/view/5.1/general/gcc2.html 

安装命令:yum install gcc gcc-c++ kernel-devel

第二种安装方式是重点:

01、下载所需的安装包:

下载nginx:http://nginx.org/en/download.html

下载pcre,安装pcre,nginx支持重写:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/

下载zlib:http://download.csdn.net/detail/jessonlv/4603322

下载gcc:http://download.csdn.net/detail/jessonlv/4603333

Nginx依赖一些其他PCRE、openssl(依赖libssl-dev),甚至是zlib、gcc等,下面我们简单说下如何安装PCRE:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. tar zxvf  pcre-8.01.tar.gz  
  2. cd pcre-8.01  
  3. ./configure  
  4. make  
  5. make install  

测试pcre是否安装成功:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [[email protected] conf]# rpm -qa pcre  
  2. pcre-6.6-6.el5  
  3. [[email protected] conf]#   

返回安装的pcre的版本好则表示成功。或者:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [[email protected] conf]# ls -al /usr/lib | grep pcre  
  2. lrwxrwxrwx   1 root root       19 Sep 19 13:11 libpcrecpp.so.0 -> libpcrecpp.so.0.0.0  
  3. -rwxr-xr-x   1 root root    29608 Mar  6  2011 libpcrecpp.so.0.0.0  
  4. lrwxrwxrwx   1 root root       21 Sep 19 13:11 libpcreposix.so.0 -> libpcreposix.so.0.0.0  
  5. -rwxr-xr-x   1 root root     6616 Mar  6  2011 libpcreposix.so.0.0.0  
  6. [[email protected] conf]#   

也是成功。
安装nginx时如需其他依赖库,上面都注有下载地址,安装方式大致相同,在此不再都一一赘述。
02、安装完成后,接下来所要做的就是nginx最核心的负载均衡的配置:

配置目录是nginx安装目录下的/conf/nginx.conf文件。下面张贴我的配置文件:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #user  nobody;  
  2. worker_processes  1;  
  3.   
  4. #error_log  /usr/local/nginx/logs/error.log;  
  5. #error_log  /usr/local/nginx/logs/error.log  notice;  
  6. #error_log  /usr/local/nginx/logs/error.log  info;  
  7.   
  8. #pid        /usr/local/nginx/logs/nginx.pid;  
  9.   
  10.   
  11. events {  
  12.         use epoll;  
  13.     worker_connections  1024;  
  14. }  
  15.   
  16.   
  17. http {  
  18.     include      /etc/nginx/mime.types;  
  19.     default_type  application/octet-stream;  
  20.     sendfile        on;  
  21.     #keepalive_timeout  0;  
  22.     keepalive_timeout  65;  
  23.       
  24.   
  25.     gzip  on;  
  26.     gzip_min_length 1k;  
  27.     gzip_buffers    4  4k;  
  28.     gzip_http_version  1.1;  
  29.     gzip_comp_level 1;  
  30.     gzip_types   test/plain application/x-javascript text/css application/xml;  
  31.     gzip_proxied any;  
  32.     gzip_disable "MSIE[1-6]\.(?!.*SV1)";  
  33.   
  34.     upstream www.ijietu.com{  
  35.                 server 192.168.128.129:18081 weight=2;  
  36.                 server 192.168.128.129:18080 weight=2;  
  37.                 }  
  38.   
  39.     server {  
  40.         listen       80;  
  41.         server_name  www.ijietu.com;  
  42.   
  43.         #charset koi8-r;  
  44.   
  45.         access_log  /var/log/nginx/www.ijietu.com.log;  
  46.   
  47.         location / {  
  48.                 proxy_pass  http://www.ijietu.com;  
  49.                 proxy_set_header Host   $host;  
  50.                 proxy_set_header X-Real-IP  $remote_addr;  
  51.                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  52.             #root   html;  
  53.             #index  index.html index.htm;  
  54.                  }  
  55.                       log_format  www_ijietu_com  '$remote_addr - $remote_user [$time_local] $request '  
  56.               '"$status" $body_bytes_sent "$http_referer" '  
  57.               '"$http_user_agent" "$http_x_forwarded_for"';  
  58.               access_log  /var/log/nginx/www.log  www_ijietu_com;  
  59.   
  60.         error_page   500 502 503 504  /50x.html;  
  61.         location = /50x.html {  
  62.             root   html;  
  63.             }  
  64.   
  65.          }  
  66.   
  67.   
  68.     # another virtual host using mix of IP-, name-, and port-based configuration  
  69.     #  
  70.     #server {  
  71.     #    listen       8000;  
  72.     #    listen       somename:8080;  
  73.     #    server_name  somename  alias  another.alias;  
  74.   
  75.     #    location / {  
  76.     #        root   html;  
  77.     #        index  index.html index.htm;  
  78.     #    }  
  79.     #}  
  80.   
  81.   
  82.     # HTTPS server  
  83.     #  
  84.     #server {  
  85.     #    listen       443;  
  86.     #    server_name  localhost;  
  87.   
  88.     #    ssl                  on;  
  89.     #    ssl_certificate      cert.pem;  
  90.     #    ssl_certificate_key  cert.key;  
  91.   
  92.     #    ssl_session_timeout  5m;  
  93.   
  94.     #    ssl_protocols  SSLv2 SSLv3 TLSv1;  
  95.     #    ssl_ciphers  HIGH:!aNULL:!MD5;  
  96.     #    ssl_prefer_server_ciphers   on;  
  97.   
  98.     #    location / {  
  99.     #        root   html;  
  100.     #        index  index.html index.htm;  
  101.     #    }  
  102.     #}  
  103.   
  104. }  

关于gzip的各个参数的具体含义请参考我的另一篇文章:http://blog.csdn.net/jessonlv/article/details/8016284

各个模块参数含义请参考;http://wiki.nginx.org/NginxChs

或者参考我的资源:http://download.csdn.net/detail/jessonlv/4603422 这上面有关于nginx各个参数的详细解释.

至此,nginx的安装及配置算是基本完成。下面进行测试:

03、测试:

启动tomcat6.0_1和tomcat6.0_2.具体命令在此不再赘述,相信大家都很熟悉,不然就别做Java了。

启动nginx:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [[email protected] conf]# nginx -c /usr/local/nginx/nginx-1.2.3/conf/nginx.conf  

上面试测试时nginx的安装路径,启动时注意你自己的安装路径。没有报错即为启动成功。

查看nginx进程:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [[email protected] conf]# ps -ef | grep nginx  
  2. root     16597     1  0 12:00 ?        00:00:00 nginx: master process nginx -c /usr/local/nginx/nginx-1.2.3/conf/nginx.conf  
  3. nginx    16598 16597  0 12:00 ?        00:00:01 nginx: worker process                                  
  4. root     17385  3878  0 17:07 pts/2    00:00:00 grep nginx  
  5. [[email protected] conf]#   

在浏览器输入:http://192.168.128.129  访问项目主页。

至此,linux下tomcat+nginx的负载均衡是做好了。但是这才是个开始,memcached的session共享才是重中之重。

四、memcached的下载安装及完成session共享的配置

1、memcached管理session共享:
安装memcached一般需要安装libevent支持组件。
服务器端主要是安装memcache服务器端,目前的最新版本是 memcached-1.4.5
官网下载:http://memcached.org/
另外,Memcache用到了libevent这个库用于Socket的处理,所以还需要安装libevent,libevent的最新版本是libevent-2.0.20。(如果你的系统已经安装了libevent,可以不用安装)官网下载:http://libevent.org/

1.先安装libevent。这个东西在配置时需要指定一个安装路径,即./configure --prefix=/usr;然后make;然后make install;

2.再安装memcached,只是需要在配置时需要指定libevent的安装路径即./configure --with-libevent=/usr;然后make;然后make install;
 这样就完成了Linux下Memcache服务器端的安装。详细的方法如下:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 2.1先安装libevent:  
  2.         # tar zxvf libevent-2.0.20.tar.gz  
  3.         # cd libevent-2.0.20  
  4.         # ./configure --prefix=/usr  
  5.         # make  
  6.         # make install  
  7. 2.2安装memcached,同时需要安装中指定libevent的安装位置:  
  8.         # cd /tmp  
  9.         # tar zxvf memcached-1.4.15.tar.gz  
  10.         # cd memcached-1.4.15  
  11.         # ./configure --with-libevent=/usr  
  12.         # make  
  13.         # make install  

测试libevent是否安装成功:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. # ls -al /usr/lib | grep libevent  

测试memcached是否安装成功:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. # ls -al /usr/local/bin/mem*  

memcached必须启动才能完成服务,启动memcached:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. memcached -d -m 20 -u root -i 192.168.128.129 -p 11211 -c 1024 -P /tmp/memcached.pid  

具体各个参数的含义请看:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. -p 监听的端口  
  2.   
  3. -l 连接的IP地址, 默认是本机  
  4.   
  5. -d start 启动memcached服务  
  6.   
  7. -d restart 重起memcached服务  
  8.   
  9. -d stop|shutdown 关闭正在运行的memcached服务  
  10.   
  11. -d install 安装memcached服务  
  12.   
  13. -d uninstall 卸载memcached服务  
  14.   
  15. -u 以的身份运行 (仅在以root运行的时候有效)  
  16.   
  17. -m 最大内存使用,单位MB。默认64MB  
  18.   
  19. -M 内存耗尽时返回错误,而不是删除项  
  20. -c 最大同时连接数,默认是1024  
  21.   
  22. -f 块大小增长因子,默认是1.25-n 最小分配空间,key+value+flags默认是48  
  23. -h 显示帮助  


2、配置

memcached有多种session管理方式,这里采用官网称最有效率的一种kryo。
附各种方式所需要的jar包:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. kryo-serializer: msm-kryo-serializer, kryo-serializers, kryo, minlog, reflectasm, asm-3.2  
  2. javolution-serializer: msm-javolution-serializer, javolution-5.4.3.1  
  3. xstream-serializer: msm-xstream-serializer, xstream, xmlpull, xpp3_min  
  4. flexjson-serializer: msm-flexjson-serializer, flexjson  

各种方式的序列化方案以及jar的下载请参考gong1208的文章:http://gong1208.iteye.com/blog/1596120以及chenzhou123520的文章:http://chenzhou123520.iteye.com/blog/1650212 写的相当的不错,对我有很大帮助。

不管你选择哪种序列化策略,你都需要 memcached-session-manager-${version}.jar ,如果你使用的是tomcat6,则还需要下载 memcached-session-manager-tc6-${version}.jar ,如果使

用的是tomcat7则下载 memcached-session-manager-tc7-${version}.jar 。同时还需要下载 spymemcached-2.7.3.jar.下载这完这些jar包后把jar包放到 $CATALINA_HOME/lib/目录
在此特别需要注意的是:jar包的版本非常重要,不然容易造成jar之间的互相冲突,造成非配置性的错误。
在此我使用的是:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. spymemcached-2.7.1.jar  
  2. reflectasm-1.01.jar  
  3. msm-kryo-serializer-1.6.3.jar  
  4. minlog-1.2.jar  
  5. memcached-session-manager-tc6-1.6.3.jar  
  6. memcached-session-manager-1.6.3.jar  
  7. kryo-serializers-0.10.jar  
  8. kryo-1.04.jar  
  9. asm-3.2.jar  

spymemcached-2.7.1.jar下载:http://download.csdn.net/detail/jessonlv/4603643

 reflectasm-1.01.jar下载:http://download.csdn.net/detail/jessonlv/4603628

 msm-kryo-serializer-1.6.3.jar下载:http://download.csdn.net/detail/jessonlv/4603638
 minlog-1.2.jar下载:http://download.csdn.net/detail/jessonlv/4603636
 memcached-session-manager-tc6-1.6.3.jar下载:http://download.csdn.net/detail/jessonlv/4603633
 memcached-session-manager-1.6.3.jar下载:http://download.csdn.net/detail/jessonlv/4603632

 kryo-serializers-0.10.jar下载:http://download.csdn.net/detail/jessonlv/4603628

 kryo-1.04.jar下载:http://download.csdn.net/detail/jessonlv/4603624 

 asm-3.2.jar下载:http://download.csdn.net/detail/jessonlv/4603621

尤其注意的是我之前安装的是memcached-1.2.0不能与各个jar包很好的兼容,造成session共享的失败,换成memcached-1.4.15之后,兼容报错问题也就随之解决。
我们还需要修改 $CATALINA_HOME/conf/context.xml文件中Context节点下的内容,添加memcached-session-manager配置。
这里我们采用非粘性session管理配置:

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <Context>    
  2.   ...    
  3.   <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"    
  4.     memcachedNodes="n1:192.168.128.129:11211"    
  5.     failoverNodes="n1"   
  6.    sticky="false" //定义session方式为黏性或非黏性,默认为true  
  7.     requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"    
  8.     transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory"    
  9.     />    
  10. </Context>   

tomcat6.0_2的配置与此相同。
至此,memcached的配置也完毕,启动两个tomcat,再启动nginx,再启动memcached,进行与session有关的操作,然后可以关掉其中任意一台tomcat查看sessionid,之后同样的方法测试另外一台,可以发现,不管是那个tomcat在运行,sessionid的值是相同的。

到此,已经完成了负载均衡以及session的全部配置。希望对大家有所帮助。

转载请注明出处:http://blog.csdn.net/jessonlv/article/details/8025132

转载于:https://my.oschina.net/004/blog/337020

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34250434/article/details/91545077

智能推荐

spring boot + Vue + iView前后端分离架构(Mac版) -- (四)后端工程构建_勤奋的凯尔森同学的博客-程序员信息网_ivew+springboot +vue

spring boot + Vue + iView前后端分离架构(Mac版) – 后端工程构建(四)小景哥哥博客一、创建spring boot工程在我们的hep-admin-web同级下创建后端工程,idea--&gt;file--&gt;new--&gt;module,选中Spring Initializr点击next,安装后续图片步骤操作即可。二、配置pom.xml文件&lt...

北航计算机博士后,北京航空航天大学博士后待遇_方萌-CFT的博客-程序员信息网

第二十四条 博士后在站期间的工资及其他相关待遇,按照国家有关规定执行。博士后在站期满,工资停发,住房公积金及住房补贴随之停发。第二十五条 企业博士后的工资、住房等福利待遇由与我校签订协议的联合培养单位负责。在职博士后的工资、住房等待遇由原所在单位或合作导师负责。第二十六条 博士后在站期间,学校为非在职博士后建立住房公积金,并为暂时没有租赁到公寓的非在职博士后发放住房补贴1000元/月。博士后公寓的...

ASP.NET TextBox输入时触发OnTextChanged事件_ChinaLzw的博客-程序员信息网_asp:textbox ontextchanged

关于“ASP.NET TextBox输入触发事件"的实现,解决方法五花八门,但最简单的就是以下这种方法onkeyup='__doPostBack("ctl00$cph$TxtConpanyName","")'ASPX CODE    //为了防止刷新,给控件套上UpdatePanel,可要可不要        <asp:TextBox ID="TxtConpanyNam

linux安装ffmpeg_余生大大的博客-程序员信息网_libx264 is gpl and --enable-gpl is not specified.

本文描述在linux下,怎么分别通过直接下载二进制文件,以及自行源码编译这两种方式安装ffmpeg。安装时遇到的某些问题和错误会扩展开来说明,授之以渔。方式一,直接下载二进制文件ffmpeg现在提供了静态编译版本的二进制可执行文件,可以直接下载下来使用。包含的文件有ffmpeg和ffprobe,不包含libav*等ffmpeg的库。这种安装方式比较实用于直接使用ffmpeg命令行工具的场景。访问https://johnvansickle.com/ffmpeg/这个网页,...

提升网站权重优化方法,网站权重优化步骤_欣依网络的博客-程序员信息网_页面健康度加权

SEO权重是各大搜索引擎给予网站赋予的评估或评价等级,代表着网站在某领域中的权威性、健康度及成长潜力,网站的权重越高一方面代表其越具权威性,另一方面也代表着搜索引擎对其友好度越强,会在排名、流量和信任度评价给予较好的扶持。权重是一个相对性的概念,即根据某既定指标的整体评价中相对的重要程度。如果用容易理解的方法来说,比如指数是量级统计数据,那么权重便是性质评估数据,互联网平台普遍存在指数和权重相关体系化的数据管理。一、 SEO权重与网站的关系1. 百度权重是第三方推出,收录与其没直接联系.

[转]keras报错:AttributeError: '_thread._local' object has no attribute 'value'_小白太白的博客-程序员信息网

参考链接:链接1链接2本人使用 Tensorflow + kreas 训练得到的 NLP 迁移学习模型,然后采用 Flask web 框架搭建预测模型的独立服务。单独使用该模型时一切正常,后面引入框架后报如题(AttributeError: '_thread._local' object has no attribute 'value')所示错误,网上查阅各种解决办法都没有解决,最后找到了如...

随便推点

【PHP基础】PDO数据库连接_weixin_34218890的博客-程序员信息网

PDO 安装PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻量级的一致接口。PDO 提供了一个数据访问抽象层,这意味着,不管使用哪种数据库,都可以用相同的函数(方法)来查询和获取数据。PDO随PHP5.1发行,在PHP5.0的PECL扩展中也可以使用,无法运行于之前的PHP版本。你可以通过 PHP 的 phpinfo() 函数来查看是否安装了PDO扩展。在 Un...

paypal接入指南_技术刘~的博客-程序员信息网_paypal接入

做过跨境电商或者在海外购物网站逛过的朋友都应该知道PayPal,类似于国内流行的支付宝和微信支付,都属于第三方支付平台。在做外贸支付的时候不得不提到的就是PayPal了,毕竟它在国外的市场占有率摆在哪里,当然据做外贸的朋友介绍在东南亚某些国家和地区支付宝的市场份额反超了PayPal。背景介绍由于在国内,做的项目需要使用PayPal的并不多,就算有时候需要做外贸项目,很多选择第四方集成。据做外贸的朋友介绍,之所以选择第四方支付是因为虽然在海外PayPal的市场占有率是最高的,然而这种在线支付的普及率远

计算机用户没有管理员权限,电脑右击文件没有以管理员身份运行选项如何解决..._drzqb的博客-程序员信息网

在 电脑系统 中,有些程序的使用权限较高,很多时候都需要选择以管理员身份运行程序,一般情况下,我们可以在右键菜单中选择“以管理员身份运行程序”。但是,有的用户发现右击文件后,没有“以管理员身份运行”的选项怎么办呢?技巧分享:在 Windows 7 中,若要以管理员身份运行程序,通常会使用以下方法:使用快捷键“Ctrl”+“Shift”+ 鼠标左键打开程序,程序也会以管理员身份运行。如果要调出“以管...

java:关于json解析工具选型(JSON-java,json-lib,gson,fastjson)_10km的博客-程序员信息网

没有最好的工具,只有最适合的. 最近的项目需要对java 对象和json之间的序列化和反序列化,更准确的说是java bean对象和json之间的转换,使用哪个工具进行转换,让我犹豫了不少时间。 json工具有很多 http://json.org 中列出不少,我接触过的有JSON-java,json-lib,google-gson,还有阿里巴巴的fastjson。JSON-java我最早用过的是

三星会不会用鸿蒙系统,华为的鸿蒙系统已在路上 对手三星却要“趁虚而入”!..._weixin_39805734的博客-程序员信息网

竞争激烈的智能手机领域,能活下来的基本都有两把刷子,比如华为、苹果、小米、OV等这几个品牌,基本已经成了国内消费者入手的必选品牌,尤其是中美贸易摩擦的不断升级,使得华为将市场向国内转移,这也让华为一度成为全球季度销量冠军,这对全球年度销量冠军三星无形中带来了巨大的威胁,因为“销冠”是最好的“广告”!众所周知,虽然三星在国内手机市场份额占比仅个位数,但却在东南亚等地区非常受欢迎,市占比远远超过苹果、...

三菱FX系列PLC串口通讯协议整理_剪刀手的爱德华的博客-程序员信息网

三菱FX系列PLC串口通讯协议整理记录原因项目要求工具与资料通讯格式如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入记录原因因项目需求,要写上位机与PLC进行...

推荐文章

热门文章

相关标签