- 博客(46)
- 收藏
- 关注
原创 spring boot学习(7)— 自定义中的 HttpMessageConverter
在我们开发自己的应用时,有时候,我们可能需要自定义一些自己的数据格式来传输,这时,自定义的数据传输和类的实例之间进行转化就需要统一起来了, Spring MVC 中的 HttpMessageConverter 就派上用场了。HttpMessageConverter 的声明:public interface HttpMessageConverter<T> { /** ...
2019-04-21 16:58:07 874
原创 spring boot学习(7)— 配置信息的获取方式
1. 使用 ConfigurationProperties 来使用 properties 的值。启用自定义配置: @Configuration @EnableConfigurationProperties({YourConfigClass}.class)@ConfigurationProperties(prefix) 注解自定义的 YourConfigClass通过 bean 来使用自定义...
2019-03-31 22:50:51 473
原创 spring boot学习(6)— 配置信息及其读取优先级
1. properties 信息从哪里取在不同的环境,我们需要使用不同的配置,Spring boot 已经提供了相关功能,可以是 properties 文件, yaml 文件 或是命令行参数。优先级如下Devtools global settings properties on your home directory (~/.spring-boot-devtools.properties ...
2019-03-30 21:52:44 486
原创 spring boot学习(5): 进程exit code自定义
在线上环境中,应用可能因为一些异常而终止,我们如果需要及时找到原因,根据 exit code 来定位,是个很好的途径。 spring boot 为开发者提供了相关的接口,方便开发者通过异常类型来定义自己的 exit code:ExitCodeGenerator 和 ExitCodeExceptionMapper.1. ExitCodeGenerator:用于主动退出应用,在 SpringApp...
2019-03-21 22:55:17 1535
原创 spring boot学习(4): 命令行启动
在使用spring boot 构建应用启动时,我们在工作中都是通过命令行来启动应用,有时候会需要一些特定的参数以在应用启动时,做一些初始化的操作。spring boot 提供了 CommandLineRunner 和 ApplicationRunner 这两个接口供用户使用。1. CommandLineRunner1.1 声明:@FunctionalInterfacepublic int...
2019-03-16 21:36:36 223
原创 spring boot学习(2): SpringApplication和自定义banner
SpringApplication一般,我们用 SpringApplication 来启动spring boot应用。如@SpringBootApplicationpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.c...
2019-03-14 00:00:47 488
原创 spring boot学习(3): SpringApplication 事件监听
spring application listener在 spring 框架中,有多种事件, 这些时间会在不同的运行时刻发布,来通知监听者。本文仅仅介绍 SpringApplicationEvent 的事件的监听。事件类型EventType发布时间ApplicationContextInitializedEvent在 SpringApplication正在启动, App...
2019-03-13 23:59:20 629
原创 Spring Boot 学习 (1): 初始化工程
spring boot 项目初始化,介绍三种方式:IntelliJ 创建、Spring CLI 创建以及手动创建,工程使用 gradle 构建工具。IntelliJ创建选择 spring initializr填写自己想要的配置信息选择依赖包:配置工程名和工程所在目录:进入到工程,如下图所示:创建完成。Spring CLI创建示例:spring init -dweb...
2019-03-07 09:23:17 396
原创 自己常用的git命令
git clone拉取代码仓库到本地git add xxxx or git add .添加修改的或是新增的文件到暂存区git commit -m 'xxx'添加提交记录git fetch从远端拉取当前分支的最新记录git rebase [branch_name]将本地commit 衍合到本地对应分支已经跟踪到远程的最新记录之上。branch_name 为空时,...
2019-01-16 20:29:04 124
原创 CDN 的简述
之前,公司内部知识分享,讲了些关于 CDN 方面的知识,但是那两天都加班到很晚,精神有点不好,没有整理。今天梳理一下,做一点输出, 是个简单的内容。CDN 能够加速请求,是因为能够将数据或是静态文件缓存起来,当请求到达并命中缓存时, 就能直接返回请求结果了。并且,CDN 服务商的节点通常是比较多的, 一般都会根据你的实际 IP 所在的位置来分配最近的节点,减少传输的节点,加速传输速度。CDN ...
2019-01-13 22:08:50 456
原创 学习 python logging(6): 用代码定义 Logger 的流程
在之前的章节有介绍,我们有三种方式去定义 Logger, 这一节来看一下用代码来定义的实际过程。logging.getLogger :1 定义如下:def getLogger(name=None): """ Return a logger with the specified name, creating it if necessary. If no name is...
2019-01-10 22:18:05 686
原创 学习 python logging(5): `Formatter`、`Filter`、`LogRecord`解析
不看日志信息中那些文件信息、行号、进程号等附加信息,我们来看看各个组件中的方法和实现,有助于我们去了解我们在配置时需要加那些配置信息以及配置信息的规则。1. LogRecord1.1 LogRecord.__init__def __init__(self, name, level, pathname, lineno, msg, args, exc_info,...
2019-01-08 22:30:42 1648
原创 学习 python logging(4): 标准库中的Handlers
在 python 的标准库中,有了很多已经定义好的 Handler , 这些 Handler 能覆盖我们在使用中的大部分情况, 包括将日志记录到文件中、将日志上传指定服务器等等,接下来就过一过这些 Handler 的基本信息。1. StreamHandler将日志消息发送到一个 File like的流对象实例中。 一个 StreamHandler 的实例中,初始化时会持有一个 stream 参...
2019-01-06 17:12:57 934
原创 学习 python logging(3):组合自己的Logger
python logging模块中各个基础组件在项目中,我们可能需要定义不同的日志格式,有时需要定位到某一行,有的就不需要,并且根据情况要筛选不同的日志等级,例如,生产环境就不需要打印 DEBUG 级别的日志。这就涉及到需要多个日志模型。python中定义了基本的日志组件让我们可以去组装和自定义以实现日志模型,功能包括日志信息过滤(脱敏)、筛选日志等级等等。这些组件包括:logging.Lo...
2019-01-05 17:18:44 3528 1
原创 学习 python logging(2): 格式化日志输出
1. 简介在实际项目中,我们可能需要根据实际需要去记录日志,包括记录的时间、进程号、日志的等级、出现的对应文件及行号等等,以帮助我们定位问题,分析过程。python已经为我们提供了基础的这些,包括:nameformat_strmeaningasctime%(asctime)sHuman-readable time when the LogRecord was crea...
2019-01-03 21:58:49 6574
原创 学习 python logging(1): 基本用法
简介日志在编程中是十分重要,可以帮助我们跟踪事件、应用的运行情况、查问题、统计数据等。在记录日志时,通常表示某件事情的发生。python 中 logging 模块提供记录的基础方法:debug, info,warning, error, critical这五个方法的严重等级依次增加,对应关系:LEVELvalueused timeDEBUG10分析问题的时候...
2019-01-02 22:05:13 243
原创 TCP-IP详解笔记8: TCP传输控制协议
TCP提供一种面向连接的、可靠的字节流服务。TCP将用户数据打包构成报文段;它发送数据后启动一个定时器;另一端对收到的数据进行确认,对失序的数据重新排序,丢弃重复数据;TCP提供端到端的流量控制,并计算和验证一个强制性的端到端检验和TCP首部TCP为应用层提供全双工服务,因此,数据能在两个方向上独立地传输。连接的每一段都必须保持每个方向上的传输数据序号。首部长度: 多少个32bit的数...
2018-10-28 11:45:49 365
原创 TCP-IP详解笔记7: DNS,域名系统
概念DNS 是一种用于TCP/IP应用程序的__分布式数据库__,提供了主机名字和IP地址之间的转换和有关电子邮件的选路信息。DNS基础层次结构, 每个节点有一个至多63个字符长的标识, 不区分大小写。域名书中的每个节点都有一个唯一的域名,但不同节点可使用相同的标识。以‘.’结尾的域名成为绝对域名, sun.tuc.noao.edu.。顶级域名:arpa7个普通三字符长的普通...
2018-10-28 11:45:02 374
原创 TCP-IP详解笔记6: UDP
前言UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报。UDP数据报封装成一份IP数据报的格式IP首部UDP首部UDP数据RFC 768 [Postel 1980]是UDP的正式规范UDP不提供可靠性:把应用程序传递给IP层的数据发送出去, 但不保证数据到达目的地。可能需要分片, 要关注...
2018-10-28 11:43:53 155
原创 TCP-IP详解笔记5:ICMP
类型ICMP报文的类型:不同类型由报文中的类型字段和代码字段来共同决定。分为查询、差错等大类, 各个类型如下为了防止过去允许ICMP差错报文对广播分组响应所带来的广播风暴,不会产生ICMP差错报文的情况:ICMP差错报文(但是,ICMP查询报文可能会产生ICMP差错报文)。目的地址是广播地址或多播地址的IP数据报。作为链路层广播的数据报。不是IP分片的第一片。源地址不是单个主机的...
2018-10-24 17:43:06 175
原创 TCP-IP详解笔记4:ARP和RARP协议
ARP为IP地址到对应的硬件地址之间提供动态映射。RFC 826 [Plummer1982 ]是ARP规范描述文档。32位Internet地址A| ^R| | RARPPV |48位以太网地址ARP 是广播当我们输入ftp test.com的时候,从开始到arp的过程是:FTP客户端调用函数gethostbyname把主机名testcom 转...
2018-10-23 09:33:18 236
原创 TCP-IP详解笔记3: IP网际协议
3.1 特点不可靠:它不能保证IP数据报能成功地到达目的地。IP仅提供最好的传输服务。任何要求的可靠性必须由上层来提供如TCP。无连接:IP并不维护任何关于后续数据报的状态信息。每个数据报的处理是相互独立的。3.2 IP报文格式3.2.1 说明首部长度: 是指首部占32bit字的数目,占用4bit,因此,首部最大长度为4 * 15 = 60服务类型(TOS):一个 3 b...
2018-10-22 21:18:09 151
原创 TCP-IP详解笔记2: 链路层
1. 链路层的作用1 为IP模块发送和接受IP数据报为ARP模块发送ARP请求和ARP应答。为RARP发送RARP请求和RARP应答。2. 帧的格式SLIP: serial line ip压缩 SLIPPPP, 点对点协议3. 环回接口同一台主机上的客户程序和服务器程序通过TCP/IP进行通信.传给环回地址(一般是 127.0.0.1)的任何数据均作为IP输入。传...
2018-10-22 21:16:38 158
原创 TCP-IP详解笔记: 1.协议栈
1. 分层层次信息作用协议应用层处理特定的应用程序细节HTTP, Telnet, FTP, SMTP, SNMP运输层负责两台主机上应用程序端到端的通信TCP, UDP网络层处理分组在网络中的活动, 分组的选路等IP, ICMP, IGMP协议链路层操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的...
2018-10-22 21:15:05 131
原创 最近的想法
不要偷懒 最近工作,发现了很多技术债务,逻辑混杂在一起,没有分层,想到了以前,项目又很多坑,但是没人去调整,因为怕出问题,没有人去改进,这也就算了,有相同的功能,也是直接复制过来的,尼玛,位置都不变,然后,看到这些就很烦, 他自己也很不爽。 这体现了很重要的一点,在编程工作中,一定不能懒,懒了之后就是越来越多的欠账,更不想改进。然后破窗效应,蔓延到整个项目,好了,一首凉凉送给你。这个不是危言...
2018-08-05 11:53:49 173
原创 python中super方法的注意点
之前,碰到一个很有意思的问题,调用super之后,并没有按照预期执行。大概是如下的:#!/usr/bin/env python# -*- coding=utf-8 -*-class A(object): def __init__(self): print(type(self).mro()) def test(self): prin...
2018-07-26 21:57:24 271
原创 自定义python logging handler
1. 在实际操作中要考虑的点在工作中,日志是必不可少的信息来源,特别是在排错的时候。在不同公司,有这不同的日志文件风格,有的是每个日志文件按照日期,放在同一个文件夹下面,有的是根据pid去区分,可能都有自己特殊的需求。总结起来,就是如何去分割日志文件。在python中,logging模块只是线程安全的,并没有保证进程安全,因此,在实际的生产环境中,都是每个应用启动多个进程,实现longgi...
2018-07-25 22:54:03 2040
原创 恶(被前公司坑后,心疼自己一秒钟)
这里是描述在上一家公司经历。那家公司是做聚合支付的公司A,项目还不错,资金充裕,所以加入了,接着后面两三个月急速扩张,老板想到一个点子算一个点子,不管会不会有市场,到了5个月左右之后,也就是2017年10月份的时候,开始拖欠工资了,据老板说是投资人跑路了,工资发不了,了,但是很快会融到资金,什么格力愿意投资我们,然后等了一个月,到了11月份,老板说,马上要签合同了,资金到了就发工资,到了12月...
2018-06-23 14:57:56 859
原创 Python中使用logging调用Logger.info方法的处理过程
本次分析一下Logger.info的流程1. Logger.info源码: def info(self, msg, *args, **kwargs): """ Log 'msg % args' with severity 'INFO'. To pass exception information, use the keyword ...
2018-05-19 20:39:32 57112 1
原创 python logging模块注册流程
python logging模块注册流程(以logging.config.dictConfig流程为例)最近在查看python logging相关的模块,用到了dictConfig这一函数,尝试着跟踪了一下,捋一捋在调用dictConfig之后,这些都发生了什么,我想,用fileConfig的流程也差不多,先记载dictConfig的加载流程,后面跟踪源码了之后再做更新。logging...
2018-05-17 23:23:04 751
原创 解决vim跳转到定义处无法针对python源码跳转的问题
今天换成了SpaceVim的配置,初次使用,不是很习惯,遇到了很多坑,但是喜欢界面风格。特别恶心的就是跳转问题,好了,用原生的先试试,后期慢慢熟悉,但是遇到了问题:跳转python源码无法跳转,之前也遇到过,不过使用jedi vim绕过的,不好,今天尝试用其他的解决办法:从python py源码生成tags文件在vim配置文件中加入set tags+=/the/path/of/tags...
2018-04-25 18:32:53 1775
原创 写在收到offer之后的流水账
本人刚收到offer,公司很中意,不再找了。自工作以来,一共经历了三次换工作,每次都是只要收到了offer,就接受了,大概我懒吧。我曾经和以前的领导说过,我这个人,工作很大一部分程度上是看直属领导,如果领导认可我,赏识我,我会跟着他一直干,当然,这是经济条件允许的情况下,因此,在面试时感觉技术面试官认可我的技术,我一般都会接受offer,第一份工作如此,第二份工作如此,第三份工作如此,第四份工作亦...
2018-04-21 08:41:44 750
原创 想法记录--http封装celery
前提celery是分布式任务队列,使用起来也十分方便,但是,在项目中会有所限制,不能把相关代码独立。导致有时候项目很臃肿。之前的文章中提到了把celery相关的做成基础库,来摆脱限制,但是有些不合理,不能够使用celery的一些特性,譬如频率限制等。但是,这也不方便且不合理:做成基础库之后需要再每个使用到相关任务的工程所在的机器或是容器装一遍。使用原味的celery如何解决参考...
2018-04-10 13:50:50 235
原创 python :字符串
分割没有规则分隔符的字符串有些情况,需要分割字符串,用简单的split函数就可以了,但是,有些情况下,分隔符有多个,这时,需要用另外的方法:re.split>>> line = 'asdf fjdk; afed, fjek,asdf, foo'>>> import re>>> re.split(r'[;,\s]\s*', lin...
2018-02-16 19:34:13 199
原创 python:数据结构
保留最新的N个元素使用collections.deque可以实现当创建了固定容量的deque之后,在容量已满的情况下,再插入数据,会自动移除对应个数的最旧的数据元素:>>> q = deque(maxlen=3)>>> q.append(1)>>> q.append(2)>>> q.append(3)&...
2018-02-07 11:39:38 216
原创 解决YouCompleteMe"encoding" is an invalid keyword 错误
今天试着配置vim关于python的设置,在使用YouCompleteMe操作的时候,提示'encoding' is an invalid keyword argument on python files,查看message,为:~/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/utils.py中的ReadFile引起的问题: def ReadF
2017-07-11 09:26:13 856
原创 python中partial的使用规则
前天看到了partial的一个新用法,记录一下。概念函数声明如下:functools.partial(func[,*args][, **keywords])返回一个可以像函数一样被调用的partial实例,在调用时使用args和keywords参数。使用python实现时,类似于:def partial(func, *args, **keywords): def newfunc(
2017-07-11 09:26:11 5278
原创 记Nginx正向代理请求参数
nginx正向代理配置: location ~ \/someuri { access_log /var/log/nginx/uploads.log; proxy_pass_header Server; proxy_set_header Host $http_host; proxy_redirect off; prox
2017-07-11 09:26:08 1404
原创 摆脱celery限制
最近使用了celery,但用着感觉不是很爽,因为它需要把worker和任务调用的逻辑放在同一个工程里面。所以,当分布式使用时,需要将这个工程复制到不同的机器上,而不是将worker与任务调用的逻辑分开。这段时间都在思考如何摆脱这个限制,想到了一个方案:一般,celery任务调用如下:@app.taskdef add(x, y): return x + yfrom tasks
2017-07-11 09:26:05 548
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人