if($(this).tree("isLeaf",node.target)){
_ele.parent().find("[name=cid]").val(node.id);
_ele.next().text(node.text).attr("cid",node.id);
$(_win).window('close');
if(data && data.fun){
data.fun.call(this,node);}}}});
data-options="singleSelect:false,collapsible:true,pagination:true,url:'/item/query',method:'get',pageSize:20,toolbar:toolbar">
使用的 EasyUI中一个组件datagrid 可以调用data-options属性中的连接发起ajax请求
获取请求地址后 datagrid组件调用js
/item/query来寻找 js调用的代码
参数无 ,查询所有的列表信息
返回值 ,List的对象的json
如果引入分页插件 ,json串中有没有分页数据的体现
在京淘中后台分页调用EasyUI的组件,引入分页jar包完成数据封装
传递给EasyUI的数据需要一个固定格式
为分页做准备 ,不能返回给前台List
需要EasyUIResult的对象的json字符串
商品列表的分页
2018 年 1 月 13 日
11:11
分页插件
实现分页的对象 PageHelper,
方言 :分页sql语句根据不同的数据库执行不同数据库的分页语句
mysql limit
为了满足前台的数据需求 ,需要一个分页的list对象(20条)
还需要当前 tb_item表中的总数3098
本质就是执行 2条sql
select * from tb_item limit 20
select count(*) from tb_item
rowBoundsWithCount是否开启总条数查询
代码需要修改 ItemController
前台商品列表的其他功能
2018 年 1 月 13 日
14:31
新增
三元素
$.post("/item/save",$("#itemAddForm").serialize(), function(data){
if(data.status == 200){
$.messager.alert('提示','新增商品成功!');
}});
js代码中找到 jquery的post提交方法
其中有3个参数
第一个参数 :请求地址/item/save
第二个参数$("#itemAddForm").serialize():jquery的一个序列化方法,将一个表单内的所有提交标签序列化成
一个模拟 get的字符串 username=xiao&password=123
以这种字符串进行参数的提交
在 pojo发生属性变化时(这种变化是根据需求来的)
serialize的方法自动将表单里的所有input标签封装成key=value进行参数的上传,当input标签或者内容结构发生变化时,无需修改前台代码
item对象
第三个参数 :回单函数,data就是controller的返回数据
需要返回的对象类型 ,SysReuslt的json字符串
其中 status的值代表不同意义;
为什么要 json字符串
json字符串可以被js代码直接调用封装成js对象
拿到三元素可以编写代码
讨论
try catch语句能否加在当前service中?
在 saveItem方法中由于事务的引入不能添加try catch否则
事务失效 ;但并不带表有事务的方法永远不能添加 try catch
测试点击提交
修改 (页面加载数据的过程)
部分数据回显使用 js代码调用查询list中的展示数据
有一个部分数据还是需要到后台查询数据库的
请求地址 :item/update
请求参数 :当前表单的序列化字符串
返回值:SysResult的 jsonn
删除
"/item/delete"
参数: “ids” 也会被springmvc处理,Long[] ids
商品的增删改查部分完成
商品详情,ItemDesc 单独一个表格
图片上传
2018 年 1 月 13 日
16:26
KindEditor
与 EasyUI类似都是前台的富客户端插件(基于jquery做的)
KindEditor(KE)优势在于处理图文并茂的数据
EasyUI无法处理有格式的数据
kindeditor可以展示图片
KE可以访问图片的虚拟地址http://image.jt.com/2018/1/13/126341927319264.jpg;
可以解析 html文本信息
图片上传
前台的执行过程
最多上传5张图片 ,当点击开始上传时,多张图片资源将被封装成数据对象传递给Controller,
将本地数据上传到服务器
controller
1 拿到这个文件名 ,扩展名,判断是否合法有效
2 判断是否是木马 (京淘中判断木马的逻辑非常简单,应该调用第三方插件进行判断更安全)
3 生成2个路径 ;
· 服务器存储真实路径
c://jt-upload/*****/****/**.jpg
· KE访问的虚拟路径
http://image.jt.com/*****/****/**.jpg
4 图片的存放目录计算 ,上传图片非常多,一个文件夹无法有效管理
5 图片文件的重命名 ;
6 保存图片到服务器
7返回对象PicUpdaloadResult
private Integer error=0;,0表示无异常,1代表异常
private String url;//返回给前台的KE进行回显工作
private String width;//宽
private String height;//高
重新构建一个专门的上传Controller
三元素
http://localhost:8082/pic/upload
参数 MultipartFile类型的数据 变量名称uploadFile
PicUploadResult
当天问题
2018 年 1 月 13 日
14:27
1
tomcat启动占用的端口8081已经被占用了
解决办法 ,找到8081的端口占用进程pid 干掉
换个端口
2 插入数据失败
2018-01-13 15:29:03,554 [http-bio-8082-exec-5] [org.springframework.jdbc.support.SQLErrorCodesFactory]-[DEBUG] Looking up default SQLErrorCodes for DataSource [JDBC URL = jdbc:mysql://127.0.0.1:3306/jtdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true, Username = root, partitions = 1, max (per partition) = 150, min (per partition) = 5, idle max age = 30 min, idle test period = 60 min, strategy = DEFAULT]
2018-01-13 15:29:03,561 [http-bio-8082-exec-5] [org.springframework.jdbc.support.SQLErrorCodesFactory]-[WARN] Error while extracting database product name - falling back to empty error codes
org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is java.sql.SQLException: Connection is closed!
再 service的saveItem方法中初始化数据添加
3 没有展示新添加的数据
排序使用 updated没有用倒序 desc
===========================================================================
========================================================================
DAY04
知识回顾 +问题
2018 年 1 月 15 日
8:55
回顾
1 商品分类树
根据EasyUI树来确定返回数据的结构
返回Json串中{"id":"201","text","电子书刊","state":"closed"}
2 商品列表和新增
EasyUI自定义属性特点 data-options
参数提交 :jquery的ajax的post提交$.post(参数1,参数2,参数3)
参数1:请求地址
参数3:回调函数(data) data就是SysResult的json字符串
参数2:serialize,在post提交请求体中将form当中的所有input序列化成一个模拟get请求的参数字符串
3 商品修改
回显过程和提交过程
回显当中使用 js提取列表中的数据,对于某一个商品的回显过程,只需要到后台查询部分数据(商品描述)
4 商品删除
前台获取勾选的Long[] ids
5 图片上传
前台使用KE(KindEditor) + flash将图片数据从客户端读取进行上传
单独写 PicUploadController
在 springmvc 接收的参数类型MultipartFile
判断后缀 ,判断木马,
生成2个路径一个存盘路径 ,一个是url前台页面访问路径
问题 :
1 图片上传中为什么做2个路径 ?
真实存盘路径 c:/jt-upload
作为真实路径将数据 (图片)存放到服务器的位置
url:http://image.jt.com/***/***.jpg
controller返回PicUploadResult
其中4个属性 ,error,width,height,url
{"error":"0","width":"100","height":"200","url":"http://image.jt.com/***/***.jpg"}
function(data){
//校验上传成功和失败
data.error;
//展示图片的大小
data.width;data.height
//KE访问的图片虚拟路径
data.url
}
但是目前阶段KE虽然能够拿到URL,但是无法访问到真实的图片展示;url找不到
做完存盘路径和 url的映射就可以了(nginx)
2 为什么京淘使用单表设计 ?表的关联性能为什么低?
何种情况使用单表 ?何种情况使用关联?
外键关联性能问题 :
· 数据库需要维护外键的内部管理 (if语句,用代码管理)
· 涉及到外键的操作增删改 ,需要触发相关的操作去检查外键判断外键,从而不得不消耗额外资源
· 外键的存在会导致操作数据库的死锁 ;
根据不同情况采用不同的表设计逻辑
不适合使用外键关联的情况
用户量大 ,并发量高,数据库极其容易成为整个架构体系中的性能瓶颈,而且开发成本可以较高
例子 :互联网电商项目;和不考虑开发成本的国企项目;
使用外键关联
用户量少 ,并发量不高,数据库性能不会成为瓶颈,要求开发成本低
例子 :传统行业(企业内部项目,OA,CRM)
属性注入解耦
2018 年 1 月 15 日
9:32
需求
对图片上传中的强耦合字符串 ,使用属性注入来解耦
Properties:自行管理properties文件,使用类加载器获取资源
京淘中使用架构引入PropertyPlaceHolderConfigurer
底层还是Properties:存储读取文件中的数据
REPOSITORY_PATH=c:\\jt-upload
IMAGE_BASE_URL=http://image.jt.com
架构的PropertyPlaceHolderConfigurer:分装了Property对象,是spring架构支持的一套API,方便在配置xml时就设置文件位置,和读取数据的其他配置信息;
京淘中的扩展类ExtendedPropertyPlaceholderConfigurer
只扩展了父类没有的一个方法 getProperty,在代码中可以获取读取的数据
情景分析 :
扩展类已经在加载后保存了所有的 properties文件中的key-value
问题 :可以不可以在图片的controller当中直接注入扩展类,调用扩展类的getProperty方法使用,获取key-value数据
问题 :为什么不在controller中直接注入使用
单独使用扩展类对象中的数据也是耦合
引入伪 service对象PropertyService和后处理bean
来解决这种问题 ;
伪 service:不参加业务逻辑的spring加载的bean,注解使用service
利用伪 service中的属性解决编译器检查字符串错误;
spring创建伪service对象时,2个属性没有值;
后处理 bean:将扩展类对象中的数据经过bean加载后的后处理过程,将数据传递给伪service;利用注解来传递
属性注入流程图
NGINX
2018 年 1 月 15 日
10:30
情景分析 :
如何构建一个京淘项目后台的 tomcat集群?
两种搭建
有没有一种可能 ,对于客户端来讲,访问的服务器地址不变(对于客户端透明)
NGINX(engin x)
是一个高性能的HTTP和反向代理服务器
上图展示的代理称之为正向代理 ,代理的是客户端,对客户端的访问处理后交给外网服务器
反向代理与正向代理相反 ,代理的服务器的响应;
京淘中 nginx作用
解决静态文件的访问 ,图片回显,将url访问连接中
image.jt.com替换成nginx所在服务器的真实存盘路径
c://jt-upload
nginx的动静分离
负载均衡 ;
负载 :服务器承受的访问压力;
均衡 :物理均衡和逻辑均衡
权重 :权衡访问的重心,根据服务器性能判断
session黏着;根据session共享来做的均衡方式
NGINX安装 (windows版本)
环境包中 nginx1.9.9
启动 :在原有包中增加了3个.bat文件,作为windows系统的启动
停止 ,重启
start启动;
nginx启动会加载配置文件,conf/nginx.conf
nginx的配置文件
server {// nginx启动是加载的虚拟机单位
listen 80; //监听的端口
server_name manage.jt.com; //监听的域名
location / { //当满足监听条件时,location后跟着匹配信息,
开始匹配域名和端口后的内容,
proxy_pass http://127.0.0.1:8081 ; // 域名和端口的替换
也就是访问的真正服务器,直接拼接后续的访问路径
proxy_connect_timeout 600;
proxy_read_timeout 600;}}
根据以上内容,将 manage.jt.com/page/index用nginx访问maven启动的tomcat
修改 hosts文件,manage.jt.com需要和nginx所在服务器地址映射 127.0.0.1
图片回显:
server {
listen 80;
server_name image.jt.com;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
location / {
root c:\\jt-upload;}}
补充:几个简单的匹配案例 location
以 = 开头表示精确匹配
location = /html{
匹配过程内容
}
/html/ 匹配以 html开头的内容,后续继续查询有没有location匹配的是/html/正则 */d
^~ /html/ 匹配html开头的内容,一旦匹配上,不在搜索下面的正则匹配
和 /html/abc.html
部署 linux系统的京淘
2018 年 1 月 15 日
11:41
部署结构
使用第一种部署方式,在一台 linux服务器上配置3个tomcat实例
总体步骤
1 镜像 登录名密码是root root
找到解压文件中的 vmx后缀文件
2 上传tomcat解压安装
[root@bogon software]# cd /root/Desktop/
[root@bogon Desktop]# mv apache-tomcat-7.0.55.tar.gz /home/software/
解压改名
[root@bogon software]# tar -xf apache-tomcat-7.0.55.tar.gz
[root@bogon software]# mv apache-tomcat-7.0.55 t1
3 安装jdk(略)
4 复制多个tomcat实例
需要修改对应的 tomcat文件中的配置文件的端口
t1 8080 70行左右,8009 91行左右,8005 22行
t2 8081,8019,8015
t3 8082,8029,8025
[root@bogon software]# vim t2/conf/server.xml
[root@bogon software]# vim t3/conf/server.xml
启动 tomcat
到 bin目录下找到start.sh
[root@bogon bin]# ./startup.sh
配置文件 conf/server.xml
linux中查看启动日志
启动日志就在 logs文件夹下,catalina.out
使用 tail命令查看
继续启动 t2和t3跟着查看catalina.out
[root@bogon logs]# tail /home/software/t2/logs/catalina.out
[root@bogon logs]# tail /home/software/t3/logs/catalina.out
5 打war包启动
将 manage工程的war包导入到tomcat3个实例中,放到webaps下,ROOT.war tomcat启动时自动解压
war包:
在 maven工程发布时,已经完成war的打包,将其拷贝到虚拟机使用即可
检查 tomcat进程,使用
[root@bogon logs]# ps -ef|grep tomcat
根据现实的 pid使用kill命令杀掉
[root@bogon logs]# kill 5393
[root@bogon logs]# kill 5365
[root@bogon logs]# kill 5318
将文件修改成 ROOT.war
[root@bogon ~]# cd /root/Desktop/
[root@bogon Desktop]# ls
jt-manage.war
[root@bogon Desktop]# mv jt-manage.war ROOT.war
[root@bogon Desktop]#
拷贝到 t1,t2,t3的webapps中
[root@bogon Desktop]# cp ROOT.war /home/software/t1/webapps/
[root@bogon Desktop]# cp ROOT.war /home/software/t2/webapps/
[root@bogon Desktop]# cp ROOT.war /home/software/t3/webapps/
[root@bogon Desktop]#
启动 tocmat三个实例
使用 tail检查启动是否成功
在虚拟机内部的浏览器访问;
为了可以在外部客户端访问虚拟机中 3个tomcat,需要设置防火墙
service iptables stop 关闭所有防火墙
检查防火墙命令
service ip tables status
6 实现ngnix的在3个实例中的跳转工作
在 nginx中配置如下信息
upstream jt1710{ upstream 负载均衡的服务器库,jt1710自定义名称
server 192.168.40.170:8081 ;
server 192.168.40.170:8082 ;
server 192.168.40.180:8080 ;}
server {
listen 80;
server_name manage.jt.com;
location / {
proxy_pass http://jt1710; //
从 直接访问本地 tocmat变成访问服务器库;默认的并排方式排列的服务器就是轮询
proxy_connect_timeout 600;
proxy_read_timeout 600;}}
修改每个 tomcat实例的首页内容区分
方便查询负载均衡操作过程
[root@bogon ROOT]# vim /home/software/t1/webapps/ROOT/index.jsp
[root@bogon ROOT]# vim /home/software/t2/webapps/ROOT/index.jsp
[root@bogon ROOT]# vim /home/software/t3/webapps/ROOT/index.jsp
附录1--nginx配置详解
2017 年 12 月 7 日
22:42
Nginx的配置文件 nginx.conf 配置详解如下:
user nginx nginx ;
Nginx用户及组:用户 组。 window 下不指定
worker_processes 8;
工作进程:数目。根据硬件调整,通常等于 CPU数量或者 2 倍于 CPU 。
error_log logs/error.log;
error_log logs/error.log notice;
error_log logs/error.log info;
错误日志:存放路径。
pid logs/nginx.pid;
pid(进程标识符):存放路径。
worker_rlimit_nofile 204800;
指定进程可以打开的最大描述符:数目。
这个指令是指当一个 nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数( ulimit -n )与 nginx 进程数相除,但是 nginx 分配请求并不是那么均匀,所以最好与 ulimit -n 的值保持一致。
现在在 linux 2.6内核下开启文件打开数为 65535 , worker_rlimit_nofile 就相应应该填写 65535 。
这是因为 nginx调度时分配请求到进程并不是那么的均衡,所以假如填写 10240 ,总并发量达到 3-4 万时就有进程可能超过 10240 了,这时会返回 502 错误。
events
{
use epoll;
使用 epoll的 I/O 模型。 linux 建议 epoll , FreeBSD 建议采用 kqueue , window 下不指定。
补充说明 :
与 apache相类, nginx 针对不同的操作系统,有不同的事件模型
A)标准事件模型
Select、 poll 属于标准事件模型,如果当前系统不存在更有效的方法, nginx 会选择 select 或 poll
B)高效事件模型
Kqueue:使用于 FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X. 使用双处理器的 MacOS X 系统使用 kqueue 可能会造成内核崩溃。
Epoll:使用于 Linux 内核 2.6 版本及以后的系统。
/dev/poll:使用于 Solaris 7 11/99+ , HP/UX 11.22+ (eventport) , IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+ 。
Eventport:使用于 Solaris 10 。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
worker_connections 204800;
没个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把 cpu跑到 100% 就行。每个进程允许的最多连接数,理论上每台 nginx 服务器的最大连接数为。 worker_processes*worker_connections
keepalive_timeout 60;
keepalive超时时间。
client_header_buffer_size 4k;
客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过 1k,不过由于一般系统分页都要大于 1k ,所以这里设置为分页大小。
分页大小可以用命令 getconf PAGESIZE 取得。
[root@web001 ~]# getconf PAGESIZE
4096
但也有 client_header_buffer_size超过 4k 的情况,但是 client_header_buffer_size 该值必须设置为 “ 系统分页大小 ” 的整倍数。
open_file_cache max=65535 inactive=60s;
这个将为打开文件指定缓存,默认是没有启用的, max指定缓存数量,建议和打开文件数一致, inactive 是指经过多长时间文件没被请求后删除缓存。
open_file_cache_valid 80s;
这个是指多长时间检查一次缓存的有效信息。
open_file_cache_min_uses 1;
open_file_cache指令中的 inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在 inactive 时间内一次没被使用,它将被移除。
}
##设定 http 服务器,利用它的反向代理功能提供负载均衡支持
http
{
include mime.types;
设定 mime类型 , 类型由 mime.type 文件定义
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';
日志格式设置。
$remote_addr与 $http_x_forwarded_for 用以记录客户端的 ip 地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的 url 与 http 协议;
$status: 用来记录请求状态;成功是 200 ,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从那个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息;
通常 web服务器放在反向代理的后面,这样就不能获取到客户的 IP 地址了,通过 $remote_add 拿到的 IP 地址是反向代理服务器的 iP 地址。反向代理服务器在转发请求的 http 头信息中,可以增加 x_forwarded_for 信息,用以记录原有客户端的 IP 地址和原来客户端的请求的服务器地址。
access_log logs/host.access.log main;
access_log logs/host.access.404.log log404;
用了 log_format指令设置了日志格式之后,需要用 access_log 指令指定日志文件的存放路径 ;
server_names_hash_bucket_size 128;
#保存服务器名字的 hash 表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size 所控制的。参数 hash bucket size 总是等于 hash 表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找 hash 表键值成为可能。如果 hash bucket size 等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为 2 。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果 Nginx 给出需要增大 hash max size 或 hash bucket size 的提示,那么首要的是增大前一个参数的大小 .
client_header_buffer_size 4k;
客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过 1k,不过由于一般系统分页都要大于 1k ,所以这里设置为分页大小。分页大小可以用命令 getconf PAGESIZE 取得。
large_client_header_buffers 8 128k;
客户请求头缓冲大小。 nginx默认会用 client_header_buffer_size 这个 buffer 来读取 header 值,如果
header过大,它会使用 large_client_header_buffers 来读取。
open_file_cache max=102400 inactive=20s;
这个指令指定缓存是否启用。
例 : open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
open_file_cache_errors
语法 :open_file_cache_errors on | off 默认值 :open_file_cache_errors off 使用字段 :http, server, location 这个指令指定是否在搜索一个文件是记录 cache 错误 .
open_file_cache_min_uses
语法 :open_file_cache_min_uses number 默认值 :open_file_cache_min_uses 1 使用字段 :http, server, location 这个指令指定了在 open_file_cache 指令无效的参数中一定的时间范围内可以使用的最小文件数 , 如果使用更大的值 , 文件描述符在 cache 中总是打开状态 .
open_file_cache_valid
语法 :open_file_cache_valid time 默认值 :open_file_cache_valid 60 使用字段 :http, server, location 这个指令指定了何时需要检查 open_file_cache 中缓存项目的有效信息 .
client_max_body_size 300m;
设定通过 nginx上传文件的大小
sendfile on;
sendfile指令指定 nginx 是否调用 sendfile 函数( zero copy 方式)来输出文件,对于普通应用,必须设为 on 。如果用来进行下载等应用磁盘 IO 重负载应用,可设置为 off ,以平衡磁盘与网络 IO 处理速度,降低系统 uptime 。
tcp_nopush on;
此选项允许或禁止使用 socke的 TCP_CORK 的选项,此选项仅在使用 sendfile 的时候使用
proxy_connect_timeout 90;
后端服务器连接的超时时间 _发起握手等候响应超时时间
proxy_read_timeout 180;
连接成功后 _等候后端服务器响应时间 _ 其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)
proxy_send_timeout 180;
后端服务器数据回传时间 _就是在规定时间之内后端服务器必须传完所有的数据
proxy_buffer_size 256k;
设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令 proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
proxy_buffers 4 256k;
设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是 4k或者 8k
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
设置在写入 proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
proxy_temp_path /data0/proxy_temp_dir;
proxy_temp_path和 proxy_cache_path 指定的路径必须在同一分区
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#设置内存缓存空间大小为 200MB , 1 天没有被访问的内容自动清除,硬盘缓存空间大小为 30GB 。
keepalive_timeout 120;
keepalive超时时间。
tcp_nodelay on;
client_body_buffer_size 512k;
如果把它设置为比较大的数值,例如 256k,那么,无论使用 firefox 还是 IE 浏览器,来提交任意小于 256k 的图片,都很正常。如果注释该指令,使用默认的 client_body_buffer_size 设置,也就是操作系统页面大小的两倍, 8k 或者 16k ,问题就出现了。
无论使用 firefox4.0还是 IE8.0 ,提交一个比较大, 200k 左右的图片,都返回 500 Internal Server Error 错误
proxy_intercept_errors on;
表示使 nginx阻止 HTTP 应答代码为 400 或者更高的应答。
upstream bakend {
server 127.0.0.1:8027;
server 127.0.0.1:8028;
server 127.0.0.1:8029;
hash $request_uri;
}
nginx的 upstream 目前支持 4 种方式的分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down掉,能自动剔除。
2、 weight
指定轮询几率, weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
2、 ip_hash
每个请求按访问 ip的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决 session 的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
3、 fair (第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
server server1;
server server2;
fair;
}
4、 url_hash (第三方)
按访问 url的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在 upstream中加入 hash 语句, server 语句中不能写入 weight 等其他的参数, hash_method 是使用的 hash 算法
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
tips:
upstream bakend{#定义负载均衡设备的 Ip 及设备状态 }{
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用负载均衡的 server中增加
proxy_pass http://bakend/ ;
每个设备的状态设置为 :
1.down表示单前的 server 暂时不参与负载
2.weight为 weight 越大,负载的权重就越大。
3.max_fails:允许请求失败的次数默认为 1. 当超过最大次数时,返回 proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非 backup 机器 down 或者忙的时候,请求 backup 机器。所以这台机器压力会最轻。
nginx支持同时设置多组的负载均衡,用来给不用的 server 来使用。
client_body_in_file_only设置为 On 可以讲 client post 过来的数据记录到文件中用来做 debug
client_body_temp_path设置记录文件的目录 可以设置最多 3 层目录
location对 URL 进行匹配 . 可以进行重定向或者进行新的代理 负载均衡
##配置虚拟机
server
{
listen 80;
配置监听端口
server_name image.***.com;
配置访问域名
location ~* \.(mp3|exe)$ {
对以 “mp3或 exe” 结尾的地址进行负载均衡
proxy_pass http:// img_relay $request_uri ;
设置被代理服务器的端口或套接字,以及 URL
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上
}
location /face {
if ($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
}
proxy_pass http:// img_relay $request_uri ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
error_page 404 502 = @fetch;
}
location @fetch {
access_log /data/logs/face.log log404;
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
}
location /image {
if ($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
}
proxy_pass http:// img_relay $request_uri ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
error_page 404 502 = @fetch;
}
location @fetch {
access_log /data/logs/image.log log404;
rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect;
}
}
##其他举例
server
{
listen 80;
server_name *.***.com *.***.cn;
location ~* \.(mp3|exe)$ {
proxy_pass http://img_relay$request_uri ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
if ($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;
}
proxy_pass http://img_relay$request_uri ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#error_page 404 http://i1.***img.com/help/noimg.gif ;
error_page 404 502 = @fetch;
}
location @fetch {
access_log /data/logs/baijiaqi.log log404;
rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;
}
}
server
{
listen 80;
server_name *.***img.com;
location ~* \.(mp3|exe)$ {
proxy_pass http://img_relay$request_uri ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
if ($http_user_agent ~* "xnp") {
rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif ;
}
proxy_pass http://img_relay$request_uri ;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#error_page 404 http://i1.***img.com/help/noimg.gif ;
error_page 404 = @fetch;
}
#access_log off;
location @fetch {
access_log /data/logs/baijiaqi.log log404;
rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect;
}
}
server
{
listen 8080;
server_name ngx-ha.***img.com;
location / {
stub_status on;
access_log off;
}
}
server {
listen 80;
server_name imgsrc1.***.net;
root html;
}
server {
listen 80;
server_name ***.com w.***.com;
# access_log /usr/local/nginx/logs/access_log main;
location / {
rewrite ^(.*)$ http://www.***.com/ ;
}
}
server {
listen 80;
server_name *******.com w.*******.com;
# access_log /usr/local/nginx/logs/access_log main;
location / {
rewrite ^(.*)$ http://www.*******.com/ ;
}
}
server {
listen 80;
server_name ******.com;
# access_log /usr/local/nginx/logs/access_log main;
location / {
rewrite ^(.*)$ http://www.******.com/ ;
}
}
location /NginxStatus {
stub_status on;
access_log on;
auth_basic "NginxStatus";
auth_basic_user_file conf/htpasswd;
}
#设定查看 Nginx 状态的地址
location ~ /\.ht {
deny all;
}
#禁止访问 .htxxx 文件
}
注释:变量
Ngx_http_core_module模块支持内置变量,他们的名字和 apache 的内置变量是一致的。
首先是说明客户请求 title中的行,例如 $http_user_agent,$http_cookie 等等。
此外还有其它的一些变量
$args此变量与请求行中的参数相等
$content_length等于请求行的 “Content_Length” 的值。
$content_type等同与请求头部的 ”Content_Type” 的值
$document_root等同于当前请求的 root 指令指定的值
$document_uri与 $uri 一样
$host与请求头部中 “Host” 行指定的值或是 request 到达的 server 的名字(没有 Host 行)一样
$limit_rate允许限制的连接速率
$request_method等同于 request 的 method ,通常是 “GET” 或 “POST”
$remote_addr客户端 ip
$remote_port客户端 port
$remote_user等同于用户名,由 ngx_http_auth_basic_module 认证
$request_filename当前请求的文件的路径名,由 root 或 alias 和 URI request 组合而成
$request_body_file
$request_uri含有参数的完整的初始 URI
$query_string与 $args 一样
$sheeme http模式( http,https )尽在要求是评估例如
Rewrite ^(.+)$ $sheme://example.com$; Redirect;
$server_protocol等同于 request 的协议,使用 “HTTP/ 或 “HTTP/
$server_addr request到达的 server 的 ip ,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在 listen 指令中指明 ip ,并使用 bind 参数。
$server_name请求到达的服务器名
$server_port请求到达的服务器的端口号
$uri等同于当前 request 中的 URI ,可不同于初始值,例如内部重定向时或使用 index
附录 2--location匹配规则
2018 年 1 月 15 日
12:59
· 已 = 开头表示精确匹配 如 A 中只匹配根目录结尾的请求,后面不能带任何字符串。
· ^~ 匹配普通字符,不是正则匹配不能用正则表达式
· ~ 开头表示区分大小写的正则匹配;
· ~* 开头表示不区分大小写的正则匹配
· / 通用匹配, 如果没有其它匹配,任何请求都会匹配到
location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] }
location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求 # 但是正则和最长字符串会优先匹配 [ configuration B ] }
location /documents / { # 匹配任何以 /documents/ 开头的地址,优先级比较低 [ configuration C ] }
location ~ /documents /Abc { # 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索 # 只有后面的正则表达式没有匹配到时,这一条才会采用这一条 [ configuration CC ] }
location ^~ /images / { # 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。 [ configuration D ] }
location ~* \.(gif |jpg|jpeg)$ { # 匹配所有以 gif,jpg或jpeg 结尾的请求 # 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则 [ configuration E ] }
location /images / { # 字符匹配到 /images/,继续往下,会发现 ^~ 存在 [ configuration F ] }
location ~* /js /.*/\.js
当前问题
2018 年 1 月 15 日
15:55
1 tomcat启动后没法访问manage后台
原因:原有的ROOT下的文件和拷贝的ROOT.war冲突
解决办法:停掉所有的 tomcat
调用各自的 bin下的shutdown
然后将 webapps中所有文件删除清空
[root@bogon webapps]# rm -rf /home/software/t1/webapps/*
[root@bogon webapps]# rm -rf /home/software/t2/webapps/*
[root@bogon webapps]# rm -rf /home/software/t3/webapps/*
在把ROOT.war传入webapps中,启动tomcat
2问题:在启动tomcat发现不成功,tail日志文件显示寻找jdk1.7文件找不到
原因: /etc/profile 默认配置的1.7
解决:配置好 jdk1.8然后再每次启动tomcat时,
source /etc/profile
JAVA_HOME=/home/software/jdk1.8 /不要丢
PATH=$PATH:./:$JAVA_HOME/bin
export PATH JAVA_HOME
你可能感兴趣的:(项目)
关于沟通这件事,项目经理不需要每次都面对面进行
流程大师兄
很多项目经理都会遇到这样的问题,项目中由于事情太多,根本没有足够的时间去召开会议,那在这种情况下如何去有效地管理项目中的利益相关者?当然,不建议电子邮件也不需要开会的话,建议可以采取下面几种方式来形成有效的沟通,这几种方式可以帮助你努力的通过各种办法来保持和各方面的联系。项目经理首先要问自己几个问题,项目中哪些利益相关者是必须要进行沟通的?可以列出项目中所有的利益相关者清单,同时也整理出项目中哪些
OC语言多界面传值五大方式
Magnetic_h
ios ui 学习 objective-c 开发语言
前言在完成暑假仿写项目时,遇到了许多需要用到多界面传值的地方,这篇博客来总结一下比较常用的五种多界面传值的方式。属性传值属性传值一般用前一个界面向后一个界面传值,简单地说就是通过访问后一个视图控制器的属性来为它赋值,通过这个属性来做到从前一个界面向后一个界面传值。首先在后一个界面中定义属性@interfaceBViewController:UIViewController@propertyNSSt
element实现动态路由+面包屑
软件技术NINI
vue案例 vue.js 前端
el-breadcrumb是ElementUI组件库中的一个面包屑导航组件,它用于显示当前页面的路径,帮助用户快速理解和导航到应用的各个部分。在Vue.js项目中,如果你已经安装了ElementUI,就可以很方便地使用el-breadcrumb组件。以下是一个基本的使用示例:安装ElementUI(如果你还没有安装的话):你可以通过npm或yarn来安装ElementUI。bash复制代码npmi
如何在 Fork 的 GitHub 项目中保留自己的修改并同步上游更新?github_fork_update
iBaoxing
github
如何在Fork的GitHub项目中保留自己的修改并同步上游更新?在GitHub上Fork了一个项目后,你可能会对项目进行一些修改,同时原作者也在不断更新。如果想要在保留自己修改的基础上,同步原作者的最新更新,很多人会不知所措。本文将详细讲解如何在不丢失自己改动的情况下,将上游仓库的更新合并到自己的仓库中。问题描述假设你在GitHub上Fork了一个项目,并基于该项目做了一些修改,随后你发现原作者对
抖音乐买买怎么加入赚钱?赚钱方法是什么
测评君高省
你会在抖音买东西吗?如果会,那么一定要免费注册一个乐买买,抖音直播间,橱窗,小视频里的小黄车买东西都可以返佣金!省下来都是自己的,分享还可以赚钱乐买买是好省旗下的抖音返佣平台,乐买买分析社交电商的价值,乐买买属于今年难得的副业项目风口机会,2019年错过做好省的搞钱的黄金时期,那么2022年千万别再错过乐买买至于我为何转到高省呢?当然是高省APP佣金更高,模式更好,终端用户不流失。【高省】是一个自
GitHub上克隆项目
bigbig猩猩
github
从GitHub上克隆项目是一个简单且直接的过程,它允许你将远程仓库中的项目复制到你的本地计算机上,以便进行进一步的开发、测试或学习。以下是一个详细的步骤指南,帮助你从GitHub上克隆项目。一、准备工作1.安装Git在克隆GitHub项目之前,你需要在你的计算机上安装Git工具。Git是一个开源的分布式版本控制系统,用于跟踪和管理代码变更。你可以从Git的官方网站(https://git-scm.
git - Webhook让部署自动化
大猪大猪
我们现在有一个需求,将项目打包上传到gitlab或者github后,程序能自动部署,不用手动地去服务器中进行项目更新并运行,如何做到?这里我们可以使用gitlab与github的挂钩,挂钩的原理就是,每当我们有请求到gitlab与github服务器时,这时他俩会根据我们配置的挂钩地扯进行访问,webhook挂钩程序会一直监听着某个端口请求,一但收到他们发过来的请求,这时就知道用户有请求提交了,这时
每日算法&面试题,大厂特训二十八天——第二十天(树)
肥学
⚡算法题⚡面试题每日精进 java 算法 数据结构
目录标题导读算法特训二十八天面试题点击直接资料领取导读肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!!特别介绍小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章
Faiss Tips:高效向量搜索与聚类的利器
焦习娜Samantha
FaissTips:高效向量搜索与聚类的利器faiss_tipsSomeusefultipsforfaiss项目地址:https://gitcode.com/gh_mirrors/fa/faiss_tips项目介绍Faiss是由FacebookAIResearch开发的一个用于高效相似性搜索和密集向量聚类的库。它支持多种硬件平台,包括CPU和GPU,能够在海量数据集上实现快速的近似最近邻搜索(AN
冬天短期的暴利小生意有哪些?那些小生意适合新手做?
一起高省
短期生意不失为创业的一个商机,不过短期生意的商机是转瞬即逝的,而且这类生意也很难作为长期的生意去做,那冬天短期暴利小生意查看更多关于短期暴利小生意的文章有哪些呢?给大家先推荐一个2023年风口项目吧,真很不错的项目,全程零投资,当做副业来做真的很稳定,不管你什么阶层的人,或多或少都网购吧?你们知道网购是可以拿提成,拿返利,拿分佣的吗?你们知道很多优惠券群里面,天天群主和管理发一些商品吗?他们其实在
高级 ECharts 技巧:自定义图表主题与样式
SnowMan1993
echarts 信息可视化 数据分析
ECharts是一个强大的数据可视化库,提供了多种内置主题和样式,但你也可以根据项目的设计需求,自定义图表的主题与样式。本文将介绍如何使用ECharts自定义图表主题,以提升数据可视化的吸引力和一致性。1.什么是ECharts主题?ECharts的主题是指定义图表样式的配置项,包括颜色、字体、线条样式等。通过预设主题,你可以快速更改图表的整体风格,而自定义主题则允许你在此基础上进行个性化设置。2.
01-Git初识
Meereen
Git git
01-Git初识概念:一个免费开源,分布式的代码版本控制系统,帮助开发团队维护代码作用:记录代码内容。切换代码版本,多人开发时高效合并代码内容如何学:个人本机使用:Git基础命令和概念多人共享使用:团队开发同一个项目的代码版本管理Git配置用户信息配置:用户名和邮箱,应用在每次提交代码版本时表明自己的身份命令:查看git版本号git-v配置用户名gitconfig--globaluser.name
Faiss:高效相似性搜索与聚类的利器
网络·魚
大数据 faiss
Faiss是一个针对大规模向量集合的相似性搜索库,由FacebookAIResearch开发。它提供了一系列高效的算法和数据结构,用于加速向量之间的相似性搜索,特别是在大规模数据集上。本文将介绍Faiss的原理、核心功能以及如何在实际项目中使用它。Faiss原理:近似最近邻搜索:Faiss的核心功能之一是近似最近邻搜索,它能够高效地在大规模数据集中找到与给定查询向量最相似的向量。这种搜索是近似的,
果然只有离职的时候,才有人敢说真话!
return2ok
今天公司出了神贴。今天中午吃饭,同事问我看了论坛上的神贴了吗?什么帖子?我问。同事显得很惊讶,你居然没看,现在那个帖子可能会成为年度最佳帖子。这么厉害?我等不及了,饭没吃完就快速的奔向办公室,打开公司论坛,我要一睹这个帖子的神奇。写这帖子的童鞋胆儿真肥。这哪里是一个帖子,这是很多个帖子,组成了一个系列。某人从公司文化、管理、人事、项目管理等多个方面分析了公司的概况,并抨击了公司的各种弊端,并提出了
如何选择最适合你的项目研发管理软件?TAPD卓越版全面解析
北京云巴巴信息技术有限公司
产品经理 需求分析
在当今快速发展的科技时代,项目研发管理软件已成为企业不可或缺的重要工具。面对市场上琳琅满目的产品,如何选择一款适合自己团队的项目研发管理软件呢?本文将围绕项目研发管理软件的选择标准,重点介绍TAPD卓越版的特点、优势以及使用体验,让你更好地理解和选择适合自己的项目研发管理软件。项目研发管理软件的选择标准在选择项目研发管理软件时,我们需要考虑以下几个方面的因素:功能全面性:软件是否覆盖了从需求管理、
OPENAIGC开发者大赛企业组AI黑马奖 | AIGC数智传媒解决方案
RPA中国
人工智能 AIGC 传媒
在第二届拯救者杯OPENAIGC开发者大赛中,涌现出一批技术突出、创意卓越的作品。为了让这些优秀项目被更多人看到,我们特意开设了优秀作品报道专栏,旨在展示其独特之处和开发者的精彩故事。无论您是技术专家还是爱好者,希望能带给您不一样的知识和启发。让我们一起探索AIGC的无限可能,见证科技与创意的完美融合!创未来AI应用赛-企业组AI黑马奖作品名称:AIGC数智传媒解决方案参赛团队:深圳市三象智能技术
insert into select 主键自增_mybatis拦截器实现主键自动生成
weixin_39521651
insert into select 主键自增 mybatis delete返回值 mybatis insert返回主键 mybatis insert返回对象 mybatis plus insert返回主键 mybatis plus 插入生成id
前言前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键。于是我就问他,那你们数据库表设置主键自动递增不就得了。他的回答是他们项目目前的id都是采用雪花算法来生成,因此为了项目稳定性,不会切换id的生成方式。朋友问我有没有什么实现思路,他们公司的orm框架是mybatis,我就建议他说,不然让你老大把mybatis切换成mybatis-plus。mybat
快乐春节
Lilywo
春节肯定是大多小朋友都喜欢的节日吧,因为春节的娱乐项目可多啦,下面我就带大家去看一看某些娱乐项目吧!第一件肯定就是穿新衣啦!因为辞旧迎新,一年过去了,要迎来新的一年。所以过年穿新衣也是一项习俗吧;第二件,收压岁钱。压岁钱大家都知道吧,过年的时候,小朋友们肯定都会受到大人们的压岁钱吧,对啦!大家知道为什么亲人们会给我们压岁钱呢?答案是因为亲人们希望我们在新的一年里可以健健康康、平平安安,幸福福的生活
spring如何整合druid连接池?
惜.己
spring spring junit 数据库 java idea 后端 xml
目录spring整合druid连接池1.新建maven项目2.新建mavenModule3.导入相关依赖4.配置log4j2.xml5.配置druid.xml1)xml中如何引入properties2)下面是配置文件6.准备jdbc.propertiesJDBC配置项解释7.配置druid8.测试spring整合druid连接池1.新建maven项目打开IDE(比如IntelliJIDEA,Ecl
vue项目element-ui的table表格单元格合并
酋长哈哈
vue.js elementui javascript 前端
一、合并效果二全部代码exportdefault{name:'CellMerge',data(){return{tableData:[{id:'1',name:'王小虎',amount1:'165',amount2:'3.2',amount3:10},{id:'1',name:'王小虎',amount1:'162',amount2:'4.43',amount3:12},{id:'1',name:'
android 更改窗口的层次,浮窗开发之窗口层级
Ms.Bu
android 更改窗口的层次
最近在项目中遇到了这样的需求:需要在特定的其他应用之上悬浮自己的UI交互(拖动、输入等复杂的UI交互),和九游的浮窗类似,不过我们的比九游的体验更好,我们越过了很多授权的限制。浮窗效果很多人都知道如何去实现一个简单的浮窗,但是却很少有人去深入的研究背后的流程机制,由于项目中浮窗交互比较复杂,遇到了些坑查看了很多资料,故总结浮窗涉及到的知识点:窗口层级关系(浮窗是如何“浮”的)?浮窗有哪些限制,如何
springboot+vue项目实战一-创建SpringBoot简单项目
苹果酱0567
面试题汇总与解析 spring boot 后端 java 中间件 开发语言
这段时间抽空给女朋友搭建一个个人博客,想着记录一下建站的过程,就当做笔记吧。虽然复制zjblog只要一个小时就可以搞定一个网站,或者用cms系统,三四个小时就可以做出一个前后台都有的网站,而且想做成啥样也都行。但是就是要从新做,自己做的意义不一样,更何况,俺就是专门干这个的,嘿嘿嘿要做一个网站,而且从零开始,首先呢就是技术选型了,经过一番思量决定选择-SpringBoot做后端,前端使用Vue做一
react-intl——react国际化使用方案
苹果酱0567
面试题汇总与解析 java 开发语言 中间件 spring boot 后端
国际化介绍i18n:internationalization国家化简称,首字母+首尾字母间隔的字母个数+尾字母,类似的还有k8s(Kubernetes)React-intl是React中最受欢迎的库。使用步骤安装#usenpmnpminstallreact-intl-D#useyarn项目入口文件配置//index.tsximportReactfrom"react";importReactDOMf
基于STM32与Qt的自动平衡机器人:从控制到人机交互的的详细设计流程
极客小张
stm32 qt 机器人 物联网 人机交互 毕业设计 c语言
一、项目概述目标和用途本项目旨在开发一款基于STM32控制的自动平衡机器人,结合步进电机和陀螺仪传感器,实现对平衡机器人的精确控制。该机器人可以用于教育、科研、娱乐等多个领域,帮助用户了解自动控制、机器人运动学等相关知识。技术栈关键词STM32单片机步进电机陀螺仪传感器AD采集电路Qt人机界面实时数据监控二、系统架构系统架构设计本项目的系统架构设计包括以下主要组件:控制单元:STM32单片机传感器
基于STM32的汽车仪表显示系统:集成CAN、UART与I2C总线设计流程
极客小张
stm32 汽车 嵌入式硬件 物联网 单片机 c语言
一、项目概述项目目标与用途本项目旨在设计和实现一个基于STM32微控制器的汽车仪表显示系统。该系统能够实时显示汽车的速度、转速、油量等关键信息,并通过CAN总线与其他汽车控制单元进行通信。这种仪表显示系统不仅提高了驾驶的安全性和便捷性,还能为汽车提供更智能的用户体验。技术栈关键词微控制器:STM32显示技术:TFTLCD/OLED传感器:速度传感器、温度传感器、油量传感器通信协议:CAN总线、UA
JAVA·一个简单的登录窗口
MortalTom
java 开发语言 学习
文章目录概要整体架构流程技术名词解释技术细节资源概要JavaSwing是Java基础类库的一部分,主要用于开发图形用户界面(GUI)程序整体架构流程新建项目,导入sql.jar包(链接放在了文末),编译项目并运行技术名词解释一、特点丰富的组件提供了多种可视化组件,如按钮(JButton)、文本框(JTextField)、标签(JLabel)、下拉列表(JComboBox)等,可以满足不同的界面设计
Python实现下载当前年份的谷歌影像
sand&wich
python 开发语言
在GIS项目和地图应用中,获取最新的地理影像数据是非常重要的。本文将介绍如何使用Python代码从Google地图自动下载当前年份的影像数据,并将其保存为高分辨率的TIFF格式文件。这个过程涉及地理坐标转换、多线程下载和图像处理。关键功能该脚本的核心功能包括:坐标转换:支持WGS-84与WebMercator投影之间转换,以及处理中国GCJ-02偏移。自动化下载:多线程下载地图瓦片,提高效率。图像
项目:事半功倍的法宝
小小效能
行动的三大流程:记录、排程和执行,也讲了易效能的4D原则以及T-step标签法。这些流程和方法能够解决我们眼前的一地鸡毛,让我们有更多时间和精力去关注更为长远的事情,完成工作、生活和人生中重要的项目。项目管理能够让我们围绕结果去做事情,达成事半功倍的效果,也就是做更少的事情,但达成更好的效果。如果我们能够不断地达成一个又一个的项目,那么我们的人生无疑会像滚雪球一样,在长坡道上面不断积累。一、项目的
博客网站制作教程
2401_85194651
java maven
首先就是技术框架:后端:Java+SpringBoot数据库:MySQL前端:Vue.js数据库连接:JPA(JavaPersistenceAPI)1.项目结构blog-app/├──backend/│├──src/main/java/com/example/blogapp/││├──BlogApplication.java││├──config/│││└──DatabaseConfig.java
【RabbitMQ 项目】服务端:数据管理模块之绑定管理
月夜星辉雪
rabbitmq 分布式
文章目录一.编写思路二.代码实践一.编写思路定义绑定信息类交换机名称队列名称绑定关键字:交换机的路由交换算法中会用到没有是否持久化的标志,因为绑定是否持久化取决于交换机和队列是否持久化,只有它们都持久化时绑定才需要持久化。绑定就好像一根绳子,两端连接着交换机和队列,当一方不存在,它就没有存在的必要了定义绑定持久化类构造函数:如果数据库文件不存在则创建,打开数据库,创建binding_table插入
Maven
Array_06
eclipse jdk maven
Maven
Maven是基于项目对象模型(POM), 信息来管理项目的构建,报告和文档的软件项目管理工具。
Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发文时使用 Maven,而且公司
ibatis的queyrForList和queryForMap区别
bijian1013
java ibatis
一.说明
iBatis的返回值参数类型也有种:resultMap与resultClass,这两种类型的选择可以用两句话说明之:
1.当结果集列名和类的属性名完全相对应的时候,则可直接用resultClass直接指定查询结果类
LeetCode[位运算] - #191 计算汉明权重
Cwind
java 位运算 LeetCode Algorithm 题解
原题链接:#191 Number of 1 Bits
要求:
写一个函数,以一个无符号整数为参数,返回其汉明权重。例如,‘11’的二进制表示为'00000000000000000000000000001011', 故函数应当返回3。
汉明权重:指一个字符串中非零字符的个数;对于二进制串,即其中‘1’的个数。
难度:简单
分析:
将十进制参数转换为二进制,然后计算其中1的个数即可。
“
浅谈java类与对象
15700786134
java
java是一门面向对象的编程语言,类与对象是其最基本的概念。所谓对象,就是一个个具体的物体,一个人,一台电脑,都是对象。而类,就是对象的一种抽象,是多个对象具有的共性的一种集合,其中包含了属性与方法,就是属于该类的对象所具有的共性。当一个类创建了对象,这个对象就拥有了该类全部的属性,方法。相比于结构化的编程思路,面向对象更适用于人的思维
linux下双网卡同一个IP
被触发
linux
转自:
http://q2482696735.blog.163.com/blog/static/250606077201569029441/
由于需要一台机器有两个网卡,开始时设置在同一个网段的IP,发现数据总是从一个网卡发出,而另一个网卡上没有数据流动。网上找了下,发现相同的问题不少:
一、
关于双网卡设置同一网段IP然后连接交换机的时候出现的奇怪现象。当时没有怎么思考、以为是生成树
安卓按主页键隐藏程序之后无法再次打开
肆无忌惮_
安卓
遇到一个奇怪的问题,当SplashActivity跳转到MainActivity之后,按主页键,再去打开程序,程序没法再打开(闪一下),结束任务再开也是这样,只能卸载了再重装。而且每次在Log里都打印了这句话"进入主程序"。后来发现是必须跳转之后再finish掉SplashActivity
本来代码:
// 销毁这个Activity
fin
通过cookie保存并读取用户登录信息实例
知了ing
JavaScript html
通过cookie的getCookies()方法可获取所有cookie对象的集合;通过getName()方法可以获取指定的名称的cookie;通过getValue()方法获取到cookie对象的值。另外,将一个cookie对象发送到客户端,使用response对象的addCookie()方法。
下面通过cookie保存并读取用户登录信息的例子加深一下理解。
(1)创建index.jsp文件。在改
JAVA 对象池
矮蛋蛋
java ObjectPool
原文地址:
http://www.blogjava.net/baoyaer/articles/218460.html
Jakarta对象池
☆为什么使用对象池
恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率。Jakarta Commons Pool组件提供了一整套用于实现对象池化
ArrayList根据条件+for循环批量删除的方法
alleni123
java
场景如下:
ArrayList<Obj> list
Obj-> createTime, sid.
现在要根据obj的createTime来进行定期清理。(释放内存)
-------------------------
首先想到的方法就是
for(Obj o:list){
if(o.createTime-currentT>xxx){
阿里巴巴“耕地宝”大战各种宝
百合不是茶
平台战略
“耕地保”平台是阿里巴巴和安徽农民共同推出的一个 “首个互联网定制私人农场”,“耕地宝”由阿里巴巴投入一亿 ,主要是用来进行农业方面,将农民手中的散地集中起来 不仅加大农民集体在土地上面的话语权,还增加了土地的流通与 利用率,提高了土地的产量,有利于大规模的产业化的高科技农业的 发展,阿里在农业上的探索将会引起新一轮的产业调整,但是集体化之后农民的个体的话语权 将更少,国家应出台相应的法律法规保护
Spring注入有继承关系的类(1)
bijian1013
java spring
一个类一个类的注入
1.AClass类
package com.bijian.spring.test2;
public class AClass {
String a;
String b;
public String getA() {
return a;
}
public void setA(Strin
30岁转型期你能否成为成功人士
bijian1013
成功
很多人由于年轻时走了弯路,到了30岁一事无成,这样的例子大有人在。但同样也有一些人,整个职业生涯都发展得很优秀,到了30岁已经成为职场的精英阶层。由于做猎头的原因,我们接触很多30岁左右的经理人,发现他们在职业发展道路上往往有很多致命的问题。在30岁之前,他们的职业生涯表现很优秀,但从30岁到40岁这一段,很多人
[Velocity三]基于Servlet+Velocity的web应用
bit1129
velocity
什么是VelocityViewServlet
使用org.apache.velocity.tools.view.VelocityViewServlet可以将Velocity集成到基于Servlet的web应用中,以Servlet+Velocity的方式实现web应用
Servlet + Velocity的一般步骤
1.自定义Servlet,实现VelocityViewServl
【Kafka十二】关于Kafka是一个Commit Log Service
bit1129
service
Kafka is a distributed, partitioned, replicated commit log service.这里的commit log如何理解?
A message is considered "committed" when all in sync replicas for that partition have applied i
NGINX + LUA实现复杂的控制
ronin47
lua nginx 控制
安装lua_nginx_module 模块
lua_nginx_module 可以一步步的安装,也可以直接用淘宝的OpenResty
Centos和debian的安装就简单了。。
这里说下freebsd的安装:
fetch http://www.lua.org/ftp/lua-5.1.4.tar.gz
tar zxvf lua-5.1.4.tar.gz
cd lua-5.1.4
ma
java-14.输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字
bylijinnan
java
public class TwoElementEqualSum {
/**
* 第 14 题:
题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是 O(n) 。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组 1 、 2 、 4 、 7 、 11 、 15 和数字 15 。由于
Netty源码学习-HttpChunkAggregator-HttpRequestEncoder-HttpResponseDecoder
bylijinnan
java netty
今天看Netty如何实现一个Http Server
org.jboss.netty.example.http.file.HttpStaticFileServerPipelineFactory:
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast(&quo
java敏感词过虑-基于多叉树原理
cngolon
违禁词过虑 替换违禁词 敏感词过虑 多叉树
基于多叉树的敏感词、关键词过滤的工具包,用于java中的敏感词过滤
1、工具包自带敏感词词库,第一次调用时读入词库,故第一次调用时间可能较长,在类加载后普通pc机上html过滤5000字在80毫秒左右,纯文本35毫秒左右。
2、如需自定义词库,将jar包考入WEB-INF工程的lib目录,在WEB-INF/classes目录下建一个
utf-8的words.dict文本文件,
多线程知识
cuishikuan
多线程
T1,T2,T3三个线程工作顺序,按照T1,T2,T3依次进行
public class T1 implements Runnable{
@Override
 
spring整合activemq
dalan_123
java spring jms
整合spring和activemq需要搞清楚如下的东东1、ConnectionFactory分: a、spring管理连接到activemq服务器的管理ConnectionFactory也即是所谓产生到jms服务器的链接 b、真正产生到JMS服务器链接的ConnectionFactory还得
MySQL时间字段究竟使用INT还是DateTime?
dcj3sjt126com
mysql
环境:Windows XPPHP Version 5.2.9MySQL Server 5.1
第一步、创建一个表date_test(非定长、int时间)
CREATE TABLE `test`.`date_test` (`id` INT NOT NULL AUTO_INCREMENT ,`start_time` INT NOT NULL ,`some_content`
Parcel: unable to marshal value
dcj3sjt126com
marshal
在两个activity直接传递List<xxInfo>时,出现Parcel: unable to marshal value异常。 在MainActivity页面(MainActivity页面向NextActivity页面传递一个List<xxInfo>): Intent intent = new Intent(this, Next
linux进程的查看上(ps)
eksliang
linux ps linux ps -l linux ps aux
ps:将某个时间点的进程运行情况选取下来
转载请出自出处:http://eksliang.iteye.com/admin/blogs/2119469
http://eksliang.iteye.com
ps 这个命令的man page 不是很好查阅,因为很多不同的Unix都使用这儿ps来查阅进程的状态,为了要符合不同版本的需求,所以这个
为什么第三方应用能早于System的app启动
gqdy365
System
Android应用的启动顺序网上有一大堆资料可以查阅了,这里就不细述了,这里不阐述ROM启动还有bootloader,软件启动的大致流程应该是启动kernel -> 运行servicemanager 把一些native的服务用命令启动起来(包括wifi, power, rild, surfaceflinger, mediaserver等等)-> 启动Dalivk中的第一个进程Zygot
App Framework发送JSONP请求(3)
hw1287789687
jsonp 跨域请求 发送jsonp ajax请求 越狱请求
App Framework 中如何发送JSONP请求呢?
使用jsonp,详情请参考:http://json-p.org/
如何发送Ajax请求呢?
(1)登录
/***
* 会员登录
* @param username
* @param password
*/
var user_login=function(username,password){
// aler
发福利,整理了一份关于“资源汇总”的汇总
justjavac
资源
觉得有用的话,可以去github关注:https://github.com/justjavac/awesome-awesomeness-zh_CN 通用
free-programming-books-zh_CN 免费的计算机编程类中文书籍
精彩博客集合 hacke2/hacke2.github.io#2
ResumeSample 程序员简历
用 Java 技术创建 RESTful Web 服务
macroli
java 编程 Web REST
转载:http://www.ibm.com/developerworks/cn/web/wa-jaxrs/
JAX-RS (JSR-311) 【 Java API for RESTful Web Services 】是一种 Java™ API,可使 Java Restful 服务的开发变得迅速而轻松。这个 API 提供了一种基于注释的模型来描述分布式资源。注释被用来提供资源的位
CentOS6.5-x86_64位下oracle11g的安装详细步骤及注意事项
超声波
oracle linux
前言:
这两天项目要上线了,由我负责往服务器部署整个项目,因此首先要往服务器安装oracle,服务器本身是CentOS6.5的64位系统,安装的数据库版本是11g,在整个的安装过程中碰到很多的坑,不过最后还是通过各种途径解决并成功装上了。转别写篇博客来记录完整的安装过程以及在整个过程中的注意事项。希望对以后那些刚刚接触的菜鸟们能起到一定的帮助作用。
安装过程中可能遇到的问题(注
HttpClient 4.3 设置keeplive 和 timeout 的方法
supben
httpclient
ConnectionKeepAliveStrategy kaStrategy = new DefaultConnectionKeepAliveStrategy() {
@Override
public long getKeepAliveDuration(HttpResponse response, HttpContext context) {
long keepAlive
Spring 4.2新特性-@Import注解的升级
wiselyman
spring 4
3.1 @Import
@Import注解在4.2之前只支持导入配置类
在4.2,@Import注解支持导入普通的java类,并将其声明成一个bean
3.2 示例
演示java类
package com.wisely.spring4_2.imp;
public class DemoService {
public void doSomethin