JS 流程图

用法

转载自https://blog.olowolo.com/example-site/post/js-flowchart-diagrams/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
st=>start: Start|past:>http://www.google.com[blank]
e=>end: End:>http://www.google.com
op1=>operation: My Operation|past
op2=>operation: Stuff|current
sub1=>subroutine: My Subroutine|invalid
cond=>condition: Yes
or No?|approved:>http://www.google.com
c2=>condition: Good idea|rejected
io=>inputoutput: catch something...|request

st->op1(right)->cond
cond(yes, right)->c2
cond(no)->sub1(left)->op1
c2(yes)->io->e
c2(no)->op2->e
...

四色建模法-四个概念和五个步骤

四色建模法 四个概念概述: ”四色原型“模式,根据名字我们就可以大概猜出它是基于四个概念来分析我们的业务概念,下面我们来了解一下哪四个概念: 时标性对象:这在四色建模中最重要也是最难分析的图例,时标性对象指的是业务在在某个时间段内的发生和跟踪的事件,最重要的是2部分内容,1是事件,2是事件所留下的痕迹。比如订单是某个客户在某个时间段内购买了某个商品所发生的业务,也是这个过程留下的唯一证据。此概念就是用来跟踪实体发生的所有需要跟踪的事件。通常时标性对象的生命周期比较短,作用范围也以生命周期内有效,事务、日志类对象就是典型的时标类对象,比如订单、支付记录、操作日志等等。时标性对象使用粉红色来标识。 实体:也可以叫做物品,是业务事件发生过程中的参与者,通常是静态的,生命周期贯穿多次同一类业务,创建后就一直生效,配置性是典型的特征,比如:客户、商品。使用绿色来表示实体(参与者)。 角色:是指实体、时刻时段的...

基于Nginx&Lua 和Netflix Eureka的微服务网关

依赖:lua-resty-http 基于Nginx&Lua 和Netflix Eureka的微服务网关。 重新架构了内部组件,采用插件模式。 服务发现 Eureka Discovery 抽象discovery,用来支持多种服务发现?规划中… 动态路由 负载均衡 加权轮询 基于响应时间的动态权重轮询?开发中… 简单监控 隔离降级 限流 metrics 认证安全?规划中。。。 监控页面?开发中… 架构图: 使用方法 基于Nginx和Lua module。需要安装Nginx Lua环境或者直接下载openresty编译安装。 安装和配置ngx-lua-zuul 下载代码到/path/to/nginx/lua/lib/ git clone http://github.com/tietang/ngx-lua-zuul –depth=1 例子Eureka 服务 如果没有Eureka环境,也可以编译安装本例子中的EurekaDemo服务,参考编译和运行eureka-demo服务中的相关内容。 部署dicovery例子服务: 下载代码后: cd /path/to/ngx_lua-zuul/demo/java mvn clean install 将下载的代...

一次线上事故对“本地文件队列异步使用”的思考

事故描述 事故现象是部分服务http请求无响应。事故从发生到恢复,接近3个小时,事故过程中重启应用服务,只能坚持几分钟到十几分钟,在真正发现问题前通过不断重启服务实例来支撑,庆幸的是核心服务没有出现无响应的事故。 最终分析为AMQ出现故障,现象是MQ客户端sendMessage后等待响应,但一直在等待,AMQ监控端口ok,控制台也可以打开,由于紧急没有具体分析,直接重启AMQ服务,切换master,通过验证服务全部恢复。 这次故障大部分服务都使用了AMQ,但除了一个核心服务没受到明显影响外,其他使用AMQ的服务都不同程度的收到了影响,服务不可用。 事后通过分析这个核心服务正式使用了本地文件队列避免了事故放大,逃过一劫,当时如果这个核心服务也受到影响就可想而知了,事故间期正直商户业务高峰期,客户估计要炸了,公司也会受到很大的损失。 此次事故比较严重,就是因为使用了本地文件队列有效隔离故障,使得影响面不...

本地文件队列-异步隔离架构

常见的异步方式: 创建异步线程 每个新创建一个线程来执行异步任务,任务结束线程也终止。 线程的创建成本比较大,不建议使用。 使用Queue,producer/consumer方式 在内部创建一个Queue,worker线程直接将异步处理的任务放入queue,一个或多个异步线程从queue中消费并执行任务。 线程池 用线程池来替换每次创建线程,减少线程创建的成本,线程被复用,一次创建多处使用。 和使用Queue类似,也是通过BlockingQueue实现,但策略上更复杂,向线程池提交Callable&Runnable任务,由线程池调度执行。 参考:java.util.concurrent.ThreadPoolExecutor#execute spring @Async注解 通过注解来来简化了异步编程,只需要在需要异步的方法上使用@Async注解即可。 其本质也是在线程池功能上扩展的,将异步执行方法封装为一个Callab...

JDBC如何开启事务

面试了很多人,每每问到“JDBC如何开启一个事务?”,大部分人的回答是:“通过openTransaction方法”,有的说是通过Connection,有的是说通过Statement,更有的说通过Connection拿到一个Transaction实例,再通过openTransaction方法来开启,那么同样关闭事务就有close方法“closeTransaction”。 想必这些人都是被“hibernate”害了还是“不注重java基础”,一上来就被框架误导呢? 先看看一个标准的JDBC例子伪代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 Connection conn = DriverManager.getConnection(...); try{ con.setAutoCommit(false); Statement stmt = con.createStatement(); //1 or more queries or updates con.commit(); }catch(Exception e){ con.rollback(); }finally{ con.close(); } 所以,看到上面的例子,开启手动事务的关键是con.setAutoCommit(false),JDBC事务默认是开启的,并且是自动提交: 关闭自动提交:java.sql.Connection.setAutoCommit(false) s...

微服务Eureka Server原理

Eureka的相关知识,在之前的《微服务之Eureka服务发现》中已经讲了很多,这里不再重复,本文主要通过Eureka Server源码和配置来阐述Eureka Server的工作原理。 Eureka提供了一系列REST的API,供Eureka Client来调用,实现服务注册,注销,心跳,状态更新等等操作,参考官网EurekaREst操作。 1 2 3 4 5 6 REST API <Jersey> Response Cache <com.google.common.cache.LoadingCache> InstanceRegistry <ConcurrentHashMap> EvictionTimer<java.util.Timer> CacheUpdateTask<java.util.Timer> REST API 基于Jersey实现,主要以appId[appname]和instanceId为操作维度,内容可以是xml或者json。相关的实现可以在com.netflix.eureka.resources包中找到。基于appId和instanceId和各种操作组合的实现,可以认为是InstanceRegistry的操作入口。 InstanceRegistry Registry是Eureka Server的核心,服务发现就是围绕Registry来实现。以下提到的类都可以在c...

安装Nginx Lua环境

安装Nginx Lua模块 环境准备: $ yum -y install pcre-devel $ yum -y install openssl openssl-devel 下载所需文件 亦可参考官方安装指南:lua-nginx-module Installation 这是我总结的安装,供参考: 需要最新版的Nginx,LuaJIT,ngx_devel_kit,lua-nginx-module等安装文件: Nginx LuaJIT Lua或者LuaJIT都是可以的,但是出于性能的考虑,推荐安装LuaJIT ngx_devel_kit lua-nginx-module 参考命令下载: $ curl -O http://nginx.org/download/nginx-1.10.1.tar.gz $ curl -O http://luajit.org/download/LuaJIT-2.1.0-beta2.tar.gz $ curl -L -O https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz $ curl -L -O https://github.com/openresty/lua-nginx-module/archive/v0.10.5.tar.gz 安装LuaJIT $ wget http://luajit.org/download/LuaJIT-.tar.gz $ tar zxvf LuaJIT-.tar.gz $ cd LuaJIT- $ make $ sudo make install 编译安装lua-nginx-module 1 2 3 4 5 6 7 export LUAJIT_LIB=/usr/local/lib export LUAJIT_INC=/usr/local/include/luajit-2.1 cd nginx-1.10.1 ./configure --prefix=/opt/nginx --with-ld-opt="-Wl,-rpath,/usr/local/lib" --add-module=/path/to/ngx_devel_kit-0.3.0 --add-module=/path/to/nginx/lua-nginx-module-0.10.5 make make install 动态module方式 Nginx 1.9.11 开始可以编译module为一个动态module,在执行./configure命令时用–add-dynamic-module=PATH替换–add-module=PATH。编译后可以在nginx.conf配置中使用 load_module 来动态加载这个m...

Hystrix semaphore和thread隔离策略的区别及配置参考

Hystrix semaphore和thread隔离策略的区别及配置参考 通用设置说明 Hystrix所有的配置都是hystrix.command.[HystrixCommandKey]开头,其中[HystrixCommandKey]是可变的,默认是default,即hystrix.command.default;另外Hystrix内置了默认参数,如果没有配置Hystrix属性,默认参数就会被设置,其优先级: hystrix.command.[HystrixCommandKey].XXX hystrix.command.default.XXX Hystrix代码内置属性参数值 Hystrix隔离策略相关的参数 策略参数设置 execution.isolation.strategy= THREAD|SEMAPHORE execution.isolation.thread.timeoutInMilliseconds hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds用来设置thread和semaphore两种隔离策略的超时时间,默认值是1000。 建议设置这个参数,在Hystrix 1.4.0之前,semaphore-isolated隔离策略...