NodeJs整合elk+zipkin,输出日志到logstash
依赖 web框架(要求2.7+) 1"koa": "^2.13.1" 日志(基于tcp协议) 12"log4js": "^3.0.5","log4js-logstash-tcp": "^2.0.0" zipkin 12"zipkin-instrumentation-koa": "^0.22.0","zipkin-transport-http": "^0.22.0" 代码(ziplin部分)1234567891011# 下游(上游略,上游改localServiceName即可)const {Tracer, BatchRecorder, ExplicitContext} = require('zipkin');const {koaMiddleware} = require('zipkin-instrumentati...
Node项目中使用ESlint
ESLint1、介绍 ESLint是最流行的JavaScript Linter。 Linter 是检查代码风格/错误的小工具。其他类似的 Linter 工具还有:TSLint、stylelint。 它包含三个功能: (1)check syntax (2)find problems 前两个可以统称为 Code-quality rules,例如 no-unused-vars 规则。 (3)enforce code style 最后一个可以称为 Formatting rules ,例如 keyword-spacing 规则。 下面介绍的 Prettier 就只有这一个 Formatting rules 功能。 2、安装1234npm install -g eslint全局安装。npm i -D eslint局部安装。 3、使用 (1) 生成配置文件 1234下面的命令,可以在项目的根目录创建.eslintrc.js配置文件。eslint --init按照交互提示,依次选择进行: (2) 校验文件 12345eslint yourfile.js命令行会返回出现...
koa+cls+log4js实现全链路日志系统
什么是全链路日志 在线上项目运行期间,经常会出现各种莫名奇妙的bug,而且一个请求往往会经过多个项目的接口调用,比如电商中的下订单,可能会调用到商品服务,优惠券满减服务,会员服务之类的,假如某一时刻下单失败,前端报了个系统异常,怎么样快速定位到底是哪个服务发生了异常,以及定位发生异常的服务具体是报了什么异常日志呢。这就是全链路日志要做的事情,它把这个请求内调用到的所有请求通过全局id串起来,通过全局id可以把所有涉及到的系统日志都快速的定位出来。 日志开发架构图 之后logstash后可能需要加queue为后续大数据做准备 技术栈 功能 技术栈 日志 log4js 异步资源追踪 cls-hooked web框架 koa node 12 rest-传递header[trace-id] axios 思路12341. 请求打进来, 由网关下发全局唯一id2. koa框架可以获取同步请求的上下文, 但在异步中需要上下文持久的问题(比如async_hook)3. 需要保证当前项目所有category的log可用,且打印trace-id4. 需要考虑解耦...
linux安装node
历史版本可从https://nodejs.org/zh-cn/download/releases/下载 通过ftp工具上传到linux服务,解压安装包1tar -xvf node-v10.16.0-linux-x64.tar.xz 移动并改名文件夹(不改名也行)123cd /usr/local/mv /var/ftp/pub/node-v10.16.0-linux-64 . //后面的.表示移动到当前目录mv node-v10.16.0.0-linux-64/ nodejs 让npm和node命令全局生效(方式选择任一)方式一:环境变量方式(这种方式只对登录用户有效) 1)、加入环境变量,在 /etc/profile 文件末尾增加配置 12vi /etc/profileexport PATH=$PATH:/usr/local/nodejs/bin 2)、执行命令使配置文件生效 1source /etc/profile 方式二:软链接方式(推荐)12ln -s /usr/local/nodejs/bin/npm /usr/local/bin...
探究分布式事务原理1
分布式事务<谨供参考> 分布式事务顾名思义就是要在分布式系统中实现事务,它其实是由多个本地事务组合而成。 关于分布式事务目前也有许多种解决方案,常说的几种如2pc,3pc,TCC,本地消息表,消息事务,最大努力通知 关于几种方案的介绍可以看下敖丙的文章<分布式事务的六种解决方案> 无论是哪种解决方案,目的都是希望保证多个系统的事务方法统一提交,要么全成,全么全败(原子性),所以这篇文章指在建立这样的想法上,手写一个分布式事务解决方案的demo,以为之后的分布式事务框架以及知识学习做积累在开发之前需要知道一点,spring的事务管理是基于(jdbc/java.sql.xxx)进行拓展,所以我们可以从这里着手 修改获取Connection的逻辑 设计图如下 图中画了四个角色 服务调用者(server1) 服务被调用者(server2) 全局事务管理者(tx-manager) 中间协调者(global-tx)-负责和tx-manager交互的 整个调用链路如下: 123456789101. 访问server1接口,server...
SpringRestDocs结合单元测试的使用
简介通过将手写文档与Spring MVC Test生成的自动生成的片段结合起来,记录RESTful服务。 详细说就是,通过编写单元测试利用asciidoctor生成aodc文档,然后将这些adoc片段输出html 代码示例pom.xml123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657<spring-restdocs.version>2.0.4.RELEASE</spring-restdocs.version><!--restdoc--><dependency> <groupId>org.springframework.restdocs</groupId> <artifactId>spring-restdocs-mockmvc</artifactId> <scope>test</scope></de...
时间复杂度和空间复杂度
摘自:https://zhuanlan.zhihu.com/p/50479555 算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。 那么我们应该如何去衡量不同算法之间的优劣呢? 主要还是从算法所占用的「时间」和「空间」两个维度去考量。 时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。 因此,评价一个算法的效率主要是看它的时间复杂度和空间复杂度情况。然而,有的时候时间和空间却又是「鱼和熊掌」,不可兼得的,那么我们就需要从中去取一个平衡点。 下面我来分别介绍一下「时间复杂度」和「空间复杂度」的计算方式。 时间复杂度我们想要知道一个算法的「时间复杂度」,很多人首先想到的的方法就是把这个算法程序运行一遍,那么它所消耗的时间就自然而然知道了。 这种方式可以吗?当然可以,不过它也有很多弊端。这种方式非常容易受运行环境的影响,在性能高的机器上跑出来的结果与在性...
keycloak https required
keycloak登录提示 At this point, you have two options; 1) Install HTTPS in Wildfly or 2) Tunnel via SSH into the remote machine and proxy your browser through it, go to the admin console and turn off the SSL requirement (Realm Settings -> Login -> Require SSL). This works because SSL is not required for local connections. keycloak 用私有地址可以不使用ssl登录方式,如果用公网就需要用ssl登录方式。 解决方案:设置某realm不强制使用ssl 启动: 1./standalone.sh -b 0.0.0.0 -bmanagement 0.0.0.0 添加账号 1./add-user-keycloak -r master -u <&g...
Dockerfile参数详解
Dockerfile什么是 Dockerfile1Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。 Dockerfile的作用123安装dockerfile中的指令定义docker容器或者容器中的应用程序以及服务Dockerfile制作一个镜像模板安装模板统一生成容器Dockerfile 中每一个指令都会建立一层 Dockerfile的基础结构12345#开头的表示注释行,说明dockerfile中的指令维护者的信息镜像操作指令容器操作指令基础镜像信息 Dockerfile中常见的操作指令和作用1234567891011121314151617181920212223242526272829FROM:指定创建镜像的基础镜像MAINTAINER:Dockerfile作者信息,一般写的是联系方式RUN:运行Linux系统的命令使用CMD:指定容器启动执行的命令;启动容器中的服务LABEL:指定生成镜像的源数据标签EXPOSE:指定镜像容器监听端口号;发布服务使用ENV:使用环境变量ADD:对压缩文件进行解压缩;将数据移动到指定的...
ENTRYPOINT和CMD
ENTRYPOINT和CMD都是让用户指定一个可执行程序, 这个可执行程序在container启动后自动启动 执行运行一个没有调用ENTRYPOINT或者CMD的docker镜像, 一定返回错误 12$ docker run alpineFATA[0000] Error response from daemon: No command specified 覆盖 首先两者都可以执行命令覆盖, 覆盖的情况如下 在写Dockerfile时, ENTRYPOINT或者CMD命令会自动覆盖基础镜像的ENTRYPOINT或者CMD命令. 在docker镜像运行时, 用户也可以在命令指定具体命令, 覆盖在Dockerfile里的命令. CMD: CMD命令可以直接接命令进行覆盖ENTRYPOINT: 使用--entrypoint参数覆盖默认的ENTRYPOINT 因为CMD命令很容易被docker run命令的方式覆盖, 所以, 如果你希望你的docker镜像的功能足够灵活, 建议在Dockerfile里调用CMD命令 执行命令的两种方法shell表示法:1CMD exe...
