发表于: 2019-12-25 20:42:52

2 1159


啥也不说就是干!!!

今天完成的事情:

1、Linux 测试接口

Curl 是很方便的 Rest 客户端,利用 curl 指令,可以发送 HTTP GET、POST、PUT、DELETE ,同时也可以携带 HTTP Header、Cookie 满足对接口的测试。


Curl 常用的参数如下:

 -X/--request 使用指定的 http method 发送请求

-H/--header 设定 request 的 header

-i/--include 显示 response 的 header

-d/--data 设定 http parameters

-v/--verbose 输出比较多的信息

-u/--user 使用者账号、密码

-b/--cookie cookie

例如:

curl -X GET "http://www.rest.com/api/users"
curl -X POST "http://www.rest.com/api/users"
curl -X PUT "http://www.rest.com/api/users"
curl -X DELETE "http://www.rest.com/api/users"

加入 Header 头信息

curl -v -i -H "Content-Type:application/json" "http://www.rest.com/users"

加入 Http Parameter:http参数可以直接拼在 url 上,也可以用 -d 携带参数

curl -X GET -d "param1=value1&param2=value2"
//这里注意如果参数有中文则需要传递经过 url encode 后的值
curl -X POST -d "param1=value1&param2=value2"

传递 Post Json 数据

curl -X PUT -i -H "Content-Type:application/json" -d '{"boolean":false,"foo":"bar"}'

其他

#Session
curl -X GET 'http://www.rest.com/api/users' --header 'sessionid:1234567890987654321'

#将cookie保存至磁盘
curl -i -X POST -d username=kent -d password=kent123 -c ~/cookie.txt http://www.rest.com/auth
# 携带cookie到request中
curl -i --header "Accept:application/json" -X GET -b ~/cookie.txt http://www.rest.com/users/1

#文件上传 通过 HTTP multipart POST 上传资料, -F 是使用http query parameter的方式,指定文件位置的参数要加上@
curl -i -X POST -F 'file=@/Users/kent/my_file.txt' -F 'name=a_file_name'

如果网站是HTTP基本认证, 可以使用 –user username:password 登录
curl -i --user admin:123456 http://www.rest.com/api/foo'  


2、Linux 常用的性能统计命令

TOP:查看服务器整体的性能;(uptime)

vmstat:查看CPU的性能;vmstat -n 2 3

free:查看内存使用的情况; free -m 

iostat:查看磁盘读取速度; iostat -d 2 3(需要sysstat包);

ping:查看网络连通性,与Windows类似

netstat:查看端口号,一般都不使用这个命令,一般情况下都使用ps命令来查看

linux服务器主要查看的属性:

1.CPU

2.内存

3.磁盘

4.网络

5.权限

关于端口判断及 Telnet 命令

netstat -anp |grep 端口号 ;查看端口是否被占用

以3306为例,netstat -anp |grep 3306

监控状态为LISTEN表示已经被占用,最后一列显示被服务mysqld占用

netstat -nultp(此处不用加端口号) ;查看当前所有已经使用的端口情况 

例子:如何查看tomcat的端口号

先 ps -ef|grep tomcat 查看进程号;再 netstat -nultp 查看端口使用情况,如何根据进程号找对应端口

如何 使用 Telnet 命令判断端口是否打开:telnet 服务器ip 端口号

2、Nginx 学习

Nginx 是一个轻量级的、高性能的、基于 Http 的、反向代理服务器,静态 web 服务器

正向代理:若服务器对客户端进行代理,则为正向代理服务器。它的作用有隐藏、翻墙、提速、缓存、授权

反向代理:若服务器对其他服务器进行代理,则为反向代理服务器。它的作用是保护隐藏、负载均衡、动静分离、数据缓存

高并发:不做性能优化的情况下,Nginx 并发量可以达到 1000。在硬件条件允许的情况下,并发 量可以达到 3-5w。 

低消耗:1w 连接,Nginx 消耗 2.5M 内存

热部署:平滑重启 Nginx -s reload,可提供 7*24 小时服务器

高可用:Nginx 中有一个主进程,多个 worker  进程

高扩展:C 语言扩展模块,与 LUA 脚本扩展模块

Nginx 常用命令

Nginx -t 检查 nginx.conf 文件是否正确 (nginx -tq 如果有错误信息则显示)

nginx -s (stop 强制重启)(quit 优雅停止)(reload 重新加载)

nginx -c 配置文件路径(用自定义的 conf 文件启动)

请求定位:

http://ip:port/xxx/ooo

会定位到服务器的 /opt 路径下,然后在 opt 路径下找 /xxx/ooo 然后定位到 index 指定的文件,如果有则显示,如果没有则 404 (http://ip:port/xxx/ooo/hello.html 还可以明确指定访问哪个文件)


路径匹配优先级:普通匹配 < 长路径匹配 < 正则匹配 < 短路匹配 < 精确匹配

Nginx 访问日志:

在 /usr/local/nginx/conf/nginx.conf 中打开日志记录及格式

$request_time 整个请求的总时间,单位为分,精确到微秒



其他的还有日志切割:https://www.baoguoxiao.com/2019/02/17/nginx-statistics-request-time/

Nginx 静态代理:

将所有的静态资源,如:css、js、html、jpg 等资源存放到 Nginx 服务器,而不是放在应用服务器 Tomcat 中。

扩展名拦截

目录名拦截

动静分离

当请求访问静态资源时候,Nginx 会转发至配置的 静态服务器上面

负载均衡

负载均衡策略:

1)轮询:每个请求按时间顺序逐一分配到不同的后端服务器,如果某端服务器down掉,能自动剔除。

2)ip_hash :每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 

3)weight:指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

3)least_conn:


3、AOP 日志记录

使用 AspectJ 实现错误日志记录

1)首先在 SpringMVC.xml 配置文件中开启注解

<!--开启 AspectJ 支持-->
<aop:aspectj-autoproxy proxy-target-class="true"/>

2)编写通知增强类

@Component
@Aspect
public class ControllerAspect {
private Logger logger= LoggerFactory.getLogger(ControllerAspect.class);
     private static final ObjectMapper mapper = new ObjectMapper().disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
     public ControllerAspect(){}

    @AfterThrowing(throwing = "ex",pointcut = "@annotation(org.springframework.web.bind.annotation.RequestMapping)")
    public void logAspect(JoinPoint joinPoint,Throwable ex) throws JsonProcessingException {

       HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
       String uri = request.getRequestURI();
       String ip = request.getRemoteAddr();
//        String className = joinPoint.getTarget().getClass().getName(); //切入方法所属类名
//        String methodName = joinPoint.getSignature().getName(); //切入的方法名
       Object[] params = joinPoint.getArgs(); //目标方法传入的参数
//        logger.error("[Exception]:["+className+"]"+methodName+":" + ex.getMessage()+"[params]:"+param);
       ControllerAspect.LogContent content = new ControllerAspect.LogContent( params, ex.getMessage() , uri, ip);
       logger.error(mapper.writeValueAsString(content));

   }

   private class LogContent implements Serializable {
       private Object params;
       private String error;
       private String url;
       private String ip;
       LogContent(Object[] params, String error, String url, String ip) {
           this.params = this.ignoreServletObjectInArgs(params);
           this.error = error;
           this.url = url;
           this.ip = ip;
       }
       public Object getParams() {
           return params;
       }
       public String getError() {
           return error;
       }
       public String getUrl() {
           return url;
       }
       public String getIp() {
           return ip;
       }
       private Object ignoreServletObjectInArgs(Object[] params) {
           if (params == null || params.length == 0) {
               return null;
           } else {
               List args = new ArrayList();
               int i = 0;
               for(int l = params.length; i < l; ++i) {
                   Object arg = params[i];
                   if (!(arg instanceof ServletRequest) && !(arg instanceof ServletResponse)) {
                        args.add(arg);
               }
           }
           return args.size() == 1 ? args.get(0) : args;
           }
      }
   }
}

当 Controller 在 执行期间报错,可被拦截,记录 接口地址,入参,及错误的详细信息,从而定位查找错误


明天计划的事情:

1、Http 协议相关内容

2、完结任务二(明天一定要完结!!)

遇到的问题:

暂无
收获:

学习了 Nginx 负载均衡,AOP 日志记录


返回列表 返回列表
评论

    分享到