当前位置 : 首页 » 文章分类 :  开发  »  接下来要学习的

接下来要学习的

待深入学习整理的to do list,工作中遇到不懂的想接下来慢慢研究的,会先放到这里。


技术文档写作

中文文案排版指北
https://github.com/sparanoid/chinese-copywriting-guidelines

Technical writing resources
https://developers.google.com/tech-writing/resources?hl=zh-cn

Google developer documentation style guide
https://developers.google.com/style?hl=zh-cn


SRS(基于nginx-rtmp的流媒体服务器)

SRS(Simple Realtime Server)
https://github.com/ossrs/srs

SRS/3.0,OuXuli,是一个流媒体集群,支持RTMP/HLS/WebRTC/SRT/GB28181,高效、稳定、易用,简单而快乐。


知乎上的Java主流技术总结

我来说下当前市场实际需要的和即将的主要趋势;基本上都是以业务中台和数据中台逐渐分离为主。这也意味着:

第一.java8,特别是jdk1.8是现阶段的主流,jdk11没必要学,直接就是jdk14. 这个主要是掌握juc里面的用法特别是如lock,reentrantlock, skiplist, copyonwritearraylist, deque,之类用法;多线程虽然主流使用是以异步为主,但是面试基本上还是以executor的几个线程池为主,看是否了解,因为现在的基本上都是在executor上封装,譬如scala的akka机制。

第二.springboot,springboot你需要调用run方法了解里面的enviroment,resource,listener是究竟怎么润起来的,spring的bean加载机制搞清楚comman runner和postconstruct就行了。

第三.idea 和git是必须掌握的,eclipse 过时了,但是mat 还可以用,但是大部分不会问那么仔细,最多jvm问下cms ps等,类加载,双亲委托之类,更复杂可能问下jstat dump怎么看gc日志。

第四. 中间件技术,redis,kafka,netty,ElasticSearch是必须了解乃至掌握基本api调用,非常重要,基本上这几个里面kafka你需要了解avro序列化或者json序列化,特别是netty基本上websocket也罢,akka也罢,都是需要了解的。一般公司你如果把reidis,redisson分布式锁讲清楚,kafka 0拷贝讲清楚基本上就ok了,rabitmq,rocketmq了解他们场景。

第五.数据库技术,分表分库sharding sphere和mycat二选一,当然阿里还有其他新鲜工具,

第六.rpc技术,目前主流有finagle,dubbo,thrift等,但是建议掌握dubbo/dubbox

第七.缓存技术,spring cache+reids缓存就够了,j2cache我看了下,觉得太繁琐了,简单就好。

第八.高性能队列,disruptor 你掌握了就可以出去吹很多水了,秒杀linkedblockqueue,linkedtansferque之类,秒杀git上有很多源码,了解下够了

第九. 微服务技术,基本上springcloud全家桶就行了,知道在service层配置ribbon,feign就可以了,至于zipkin,cat等其他技术了解下就知道了,http://spring.io多逛逛,有好处的。目前我生产主推的springboot2.2.2版本

第十.大数据技术, 这个其实对三万以下没什么要求,但是解决三万以上焦虑问题的,基本上flink,storm,spark这三个主流引擎都要了解原理,还有hbase,hadoop,至少掌握map reduce思想,当然如果没有map reduce机制,es做索引,mysql分表解决亿级以上数据的读写也要了解,特别是分表导致的分页查询全文搜索,mysql其实也需要了解innodb存储引擎,但是mysql8.0出来了后,分区表的一些查询用法也要掌握,反正主流现在是mysql8.0了。

第十一,数仓,其实主流都是四层或者三层 元数据层,明细层 集市 报表,阿里的那一套完全就是以后全家都得跟它混了,maxcompute 还是可以学习下,

第十二, service mesh技术这个是以后主流,现在主要是docker k8s, 三代的技术,我看了下非常有前景也是主要方向,istio可以多了解下,但是阿里我看到他们在搞sofa,git上有几个新项目,可以多提提代码pr,混个脸熟,如果leetcode的动态规划 线段树刷题刷了些后,掌握基本的八大排序算法和红黑树,跳跃表,快排,缺内网推荐非常简单的事情。

第十三,分布式事务这个阿里有个fescar,可以了解下思想,但是除非电商类,但是大部分不会怎么问

第十四,机器学习和ai技术这个主流机器学习算法和神经网络,卷积神经网络,蒙特卡洛,遗传算法等都需要了解下算法,这块主要是掉包学习吧,pytorch虽然是主流,tensorflow学习下也没坏处,这个知乎大佬太多,我只是工业界,这辈子是没指望技术有建树的,混混日子罢了。

第十五,编译器优化就是王垠大神的领域了,绝对的神域了,我是知道有人在华为ai编译器优化,阿里p9 200万package挖都不去 ,有空实现下语法分析,掌握编译原理,jvm虚拟机指令。

第十六。 规则引擎这个主要是风控系统,优惠券设计需要用到,现在主流的有drools,urule之类,核心是rete算法,这个个人感觉实现都有些繁琐,drools 还是特别占内存,改天我想个办法写个好点的简单点的,把那些决策,规则塞到数据库里面去感觉更合适,虽然还有groovy,scala脚本之类,但是个人还是觉得java大法好,java+数据库够用了

第十七 新语言Rust,Scala,Haskell这个是个人比较喜欢的,python 用用就好,玩java 默认都会,scala函数编程还有大数据处理的生产力工具,Rust我看到觉得这就是真正统一所有码农审美和认知的终极工具,实在是优雅的令人赞叹,Haskell主要是掌握思想。一般面试很少会问这些,了解下

第十八 前端技术目前前后端分离是主流,国内主要是vue vuex,webpack,其他less elementui ,js掌握核心匿名函数,回调地狱,作用域链,对于后端来讲就够用了,反正虽然知乎不少前端大神,但是说句得罪所有前端大佬的话,前端都是玩具。

第十九 操作系统作为工业界,没事多看看linux内核源代码,特别是select epoll机制,这个基本上大厂都会问

目前 Java 后端有哪些不是很有必要去学的? - 萧三刀的回答 - 知乎
https://www.zhihu.com/question/305924723/answer/1223768347


要整理的几个算法题

41 缺失的第一个正数
https://leetcode-cn.com/problems/first-missing-positive/

287 寻找重复数
https://leetcode-cn.com/problems/find-the-duplicate-number/

1371 每个元音包含偶数次的最长子字符串
https://leetcode-cn.com/problems/find-the-longest-substring-containing-vowels-in-even-counts/

210 课程表 II
https://leetcode-cn.com/problems/course-schedule-ii/

面试题 08.11. 硬币
https://leetcode-cn.com/problems/coin-lcci/


Spring 事件

SpringBoot | 第三十二章:事件的发布和监听
https://blog.lqdev.cn/2018/11/06/springboot/chapter-thirty-two/


微信小程序

sendUniformMessage

下发小程序和公众号统一的服务消息
https://developers.weixin.qq.com/miniprogram/dev/api-backend/sendUniformMessage.html

getWXACodeUnlimit

获取小程序码,适用于需要的码数量极多的业务场景。通过该接口生成的小程序码,永久有效,数量暂无限制。
https://developers.weixin.qq.com/miniprogram/dev/api-backend/getWXACodeUnlimit.html

code2Session

登录凭证校验。通过 wx.login() 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。
https://developers.weixin.qq.com/miniprogram/dev/api-backend/code2Session.html

getAccessToken

获取小程序全局唯一后台接口调用凭据(access_token)。调调用绝大多数后台接口时都需使用 access_token,开发者需要进行妥善保存。
https://developers.weixin.qq.com/miniprogram/dev/api-backend/getAccessToken.html

获取用户基本信息(UnionID机制)

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140839

获取用户基本信息(UnionID机制)
在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的。对于不同公众号,同一用户的openid不同)。公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称、头像、性别、所在城市、语言和关注时间。

请注意,如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。

UnionID机制说明:
开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。


canal binlog的增量订阅/消费组件

阿里巴巴mysql数据库binlog的增量订阅、消费组件 。

canal的工作原理
1、canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议
2、mysql master收到dump请求,开始推送binary log给slave(也就是canal)
3、canal解析binary log对象(原始为byte流)

alibaba/canal
https://github.com/alibaba/canal


mybatis获取插入数据的主键selectkey用法

MyBatis获取插入数据主键
https://www.jianshu.com/p/5e7ee487dd78

<insert id="insertAndGetId" useGeneratedKeys="true" keyProperty="userId" parameterType="com.chenzhou.mybatis.User">
   insert into user(userName,password,comment)
   values(#{userName},#{password},#{comment})
</insert>

Mybatis获取插入记录的自增长ID
https://my.oschina.net/wangrikui/blog/510189

@Insert("insert into Demo(name,password) values(#{name},#{password})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")

71.mybatis 如何获取插入的id【从零开始学Spring Boot】
http://412887952-qq-com.iteye.com/blog/2314219

@insert 注解返回主键

步骤有三:

  1. 写 SQL,但不要自己插入主键值
  2. 配置@Options(useGeneratedKeys=true, keyProperty=”对象.属性”) 这个的作用是设置是否使用 JDBC 的getGenereatedKeys()方法获取主键并赋值到 keyProperty 设置的对象的属性中,说白了就是把自增长的主键值赋值给对象相应的属性
  3. 在插入后,使用对象.主键属性的getXXId()方法 获取主键值

示例:

@Insert("INSERT INTO api(component, clientApi, scribeDescribe, clientApiVersion, invokeTimeout, authType, sessionRequire, openType) VALUES(#{api.component}, #{api.clientApi}, #{api.scribeDescribe}, #{api.clientApiVersion}, #{api.invokeTimeout}, #{api.authType}, #{api.sessionRequire}, #{api.openType})")
@Options(useGeneratedKeys = true, keyProperty = "api.apiId")
void add(@Param("api") Api api);

然后调用 api.getApiId()即可

mybatis 注解 insert 返回主键
http://bbs.itmayiedu.com/article/1492234758902?p=1&m=0

selectKey子元素 详解

作用:在insert元素和update元素中插入查询语句。

其属性如下:
keyProperty ,默认值unset,用于设置getGeneratedKeys方法或selectKey子元素返回值将赋值到领域模型的哪个属性中
resultType ,keyPropety所指向的属性类全限定类名或类型别名
order属性 ,取值范围BEFORE|AFTER,指定是在insert语句前还是后执行selectKey操作
statementType ,取值范围STATEMENT,PREPARED(默认值),CALLABLE

注意:selectKey操作会将操作查询结果赋值到insert元素的parameterType的入参实例下对应的属性中。并提供给insert语句使用

MyBatis魔法堂:Insert操作详解(返回主键、批量插入)
https://www.cnblogs.com/fsjohnhuang/p/4078659.html


Java

ConcurrentSkipListMap跳表

【死磕Java并发】—–J.U.C之Java并发容器:ConcurrentSkipListMap
http://cmsblogs.com/?p=2371


数据库

外键缺少索引引发的死锁

外键缺少索引引发的死锁(Oracle)
https://blog.csdn.net/hotdust/article/details/51258965

谈谈我对MySQL外键字段必须索引的一些理解
https://blog.csdn.net/sweeper_freedoman/article/details/61426736

查看mysql隔离级别

show variables like ‘%isolation%’

upsert是什么?

UPSERT是INSERT, ON CONFLICT UPDATE的简写,简而言之就是:插入数据,正常时写入,主键冲突时更新。

PostgreSQL 9.5 发布,带来 UPSERT 等新特性
http://www.phperz.com/article/16/0108/181548.html

mysql 事务死锁分析

mysql死锁-查询锁表进程-分析锁表原因
https://blog.csdn.net/lin443514407lin/article/details/56489587

【MySQL】mysql死锁以及死锁日志分析
https://segmentfault.com/a/1190000009469556

Deadlock found when trying to get lock; try restarting transaction

org.springframework.dao.DeadlockLoserDataAccessException:
### Error updating database.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
### The error may involve com.masikkk.tractMapper.updateByPrimaryKey-Inline
### The error occurred while setting parameters
### SQL: update ordert     set order_no = ?,       short_url = ?,       contract_template_id = ?,       contract_name = ?,       contract_file_id = ?,       status = ?,       sign_online = ?,       sign_time = ?,       create_time = ?,       update_time = ?     where id = ?
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
; SQL []; Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:263) ~[spring-jdbc-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) ~[spring-jdbc-4.3.16.RELEASE.jar:4.3.16.RELEASE]
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:75) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:447) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at com.sun.proxy.$Proxy142.update(Unknown Source) ~[?:?]
    at org.mybatis.spring.SqlSessionTemplate.update(SqlSessionTemplate.java:295) ~[mybatis-spring-1.3.0.jar:1.3.0]
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:59) ~[mybatis-3.4.0.jar:3.4.0]
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) ~[mybatis-3.4.0.jar:3.4.0]
    at com.sun.proxy.$Proxy196.updateByPrimaryKey(Unknown Source) ~[?:?]

log4j2

聊一聊log4j2配置文件log4j2.xml
http://www.cnblogs.com/hafiz/p/6170702.html

Log4j2配置文件详解
https://www.cnblogs.com/yudar/p/5113655.html

官方xml配置参考

Configuration Syntax - Strict XML
https://logging.apache.org/log4j/2.x/manual/configuration.html#XML

Log4j2 自动配置刷新

When configured from a File, Log4j has the ability to automatically detect changes to the configuration file and reconfigure itself. If the monitorInterval attribute is specified on the configuration element and is set to a non-zero value then the file will be checked the next time a log event is evaluated and/or logged and the monitorInterval has elapsed since the last check. The example below shows how to configure the attribute so that the configuration file will be checked for changes only after at least 30 seconds have elapsed. The minimum interval is 5 seconds.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="30">
...
</Configuration>

Automatic Reconfiguration
https://logging.apache.org/log4j/2.x/manual/configuration.html#AutomaticReconfiguration

不同环境设置不同日志级别

修改启动脚本,针对不同环境给变量LOG_LEVEL设置不同的值,然后通过jvm参数传入,log4j2.xml配置文件中读取此jvm参数来设置日志级别

#!/bin/bash

if [ $# != 1 ]; then
    exit 1
fi

BASE_DIR=$(cd "$(dirname "$0")/..";pwd)
cd $BASE_DIR

if [[ -f relation.pid ]]; then
    kill -9 `cat relation.pid`
    rm -f relation.pid
fi

JVM_PARAMS="-Xmn1g -Xms2g -Xmx2g"
if [ "$1" == "dev" ]; then
    JVM_PARAMS="-Xmn1g -Xms2g -Xmx2g"
    LOG_LEVEL="info"
elif [ "$1" == "test" ]; then
    JVM_PARAMS="-Xmn1g -Xms2g -Xmx2g"
    LOG_LEVEL="info"
elif [ "$1" == "staging" ]; then
    JVM_PARAMS="-Xmn2g -Xms5g -Xmx5g"
    LOG_LEVEL="info"
elif [ "$1" == "prod" ]; then
    JVM_PARAMS="-Xmn2g -Xms5g -Xmx5g"
    LOG_LEVEL="info"
fi

[ -f $BASE_DIR/conf/swc-uds-*-log.yml ] &&   ls -l /etc/filebeat.d/ || exit 1
cp $BASE_DIR/conf/swc-uds-*-log.yml /etc/filebeat.d
filebeat.sh -configtest -e
systemctl restart filebeat

nohup java $JVM_PARAMS -jar \
        -Dspring.profiles.active=$1 \
        -Dspring.config.location=classpath:/application-base.yml,classpath:/application.yml \
        -Djava.security.auth.login.config=$BASE_DIR/conf/kafka.conf \
        -Dlog.level=$LOG_LEVEL \
        -XX:+UseConcMarkSweepGC  \
        -XX:+UseParNewGC \
        -XX:+PrintGCDetails \
        $BASE_DIR/bin/relation.jar >/dev/null 2>&1 &

echo $! > relation.pid
python $BASE_DIR/bin/health_check.py $1

然后log4j2.xml中

<configuration>
... ...

<loggers>
  <AsyncRoot level="${sys:log.level}" includeLocation="true">
    <appenderref ref="Console"/>
    <appenderref ref="RollingRandomAccessFile"/>
    <appenderref ref="RollingRandomAccessJsonFormatFile"/>
  </AsyncRoot>
</loggers>
</configuration>

Additivity

《Log4j 2 官方文档》多余性(Additivity)
http://ifeve.com/log4j-2-additivity/

运行中删除日志后无法重新生成

程序运行中将日志文件删除,发现日志文件不能重新生成,导致日志不能记录。
解决方法:
重启服务,就会新生成了
最好不要手动删除,如果是必须的话,那就再原地,新建立一个同名的文件,就行了。
建议,不要直接删除文件,你可以尝试清空文件:
echo “” > x.log

这个和Linux文件系统设计相关,可以这么理解:
log4j open(“log.file”) 之后就取得了一个 file_id这个file_id是和inode关联,你在shell中调用”rm -rf log.file”,只是将 log.file和这个inode的关系断了。但是log4j还是一直在向这个inode写数据,只是没有一个file path和这个inode关联,你再也找不回来了.

类似的问题还有:
进程1: open(“file”) -> write(“xxxx”) -> close();
进程2: open(“file”) -> write(“yyyy”) -> close();

两个进程打开相同的文件 “file”, 同时向文件写不同的内容.

你会发现那个最后close(),就是那个进程的内容.
因为本质上 两个进程在内核层打开了两个inode,各自写各自的. 直到close会重新建立
file path和inode的关系.


其他

git flow工作流

Git工作流指南:Gitflow工作流
https://www.cnblogs.com/jiuyi/p/7690615.html

GitHub ranking

中国区follow排行榜
http://githubrank.com/

GitHub 全球 Developers, Organizations and Repositories 排行榜 - diycode
https://www.diycode.cc/trends

GitHub中国开发者星榜
排名依据为开发者在某种编程语言上的所有项目(repo)所收获的星星(star)总数
对涉及多种编程语言的项目(repo),以GitHub认定的首要编程语言(primary language)为准
排名只针对个人(user)用户,不包括机构(organization)用户
http://githuber.cn/rank

SpringBoot+Mybatis+thymeleaf博客

http://13blog.site/
My Blog是由Docker+SpringBoot+Mybatis+thymeleaf等技术实现的Java博客系统,博客模板是@biezhi大神的开源项目tale,本来是一个docker和springboot的实战练习项目,目前已经开源,功能齐全、部署简单及完善的代码
https://github.com/ZHENFENG13/My-Blog

谈谈服务限流算法的几种实现

令牌桶算法
通过Google开源的guava包,我们可以很轻松的创建一个令牌桶算法的限流器。
通过RateLimiter类的create方法,创建限流器。

RateLimiter rateLimiter = RateLimiter.create(10);

谈谈服务限流算法的几种实现 - 占小狼的博客
https://mp.weixin.qq.com/s/zs6rkSmGeTzS5IgaqULFlA

线程并发级别

并发级别主要分为阻塞、无饥饿、无障碍、无锁、无等待几种。

Java并发编程中很重要的概念以及并发级别解析
https://www.jianshu.com/p/927d638d2544

并发级别
https://blog.csdn.net/Dustin_CDS/article/details/79368978

elasticsearch logstash kibana EKI技术栈

ELK(ElasticSearch, Logstash, Kibana)搭建实时日志分析平台
https://my.oschina.net/itblog/blog/547250

ELK日志系统:Elasticsearch + Logstash + Kibana 搭建教程
https://blog.csdn.net/qq_36864672/article/details/79238627

美团监控框架CAT

深度剖析开源分布式监控CAT
https://tech.meituan.com/CAT_in_Depth_Java_Application_Monitoring.html

LAMP

LAMP是指一组通常一起使用来运行动态网站或者服务器的自由软件名称首字母缩写:

Linux,操作系统
Apache,网页服务器
MariaDB或MySQL,数据库管理系统(或者数据库服务器)
PHP、Perl或Python,脚本语言

mvn install是干啥的

Bearer token

OAuth 2.0: Bearer Token Usage
https://www.cnblogs.com/XiongMaoMengNan/p/6785155.html


上一篇 Jackson

下一篇 iTerm2使用笔记

阅读
评论
4.8k
阅读预计20分钟
创建日期 2018-07-15
修改日期 2020-07-25
类别
标签

页面信息

location:
protocol:
host:
hostname:
origin:
pathname:
href:
document:
referrer:
navigator:
platform:
userAgent:

评论