安装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 8 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 来动态加载这个...

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隔离策略是不能超时的,从1.4.0开始semaphore-isolated也支持超时时间了。 建议通过CommandKey设置不同微服务的超时时间,对于...

zuul 参数调优

zuul 参数调优 适用版本: spring-boot: 1.4.x.RELEASE spring-cloud:Camden.SR3 Hystrix: 1.5.6 spring-boot-tomcat 优化参数: 主要只有2个,最大和最小worker线程: 1 2 server.tomcat.max-threads=128 # Maximum amount of worker threads. server.tomcat.min-spare-threads=64 # Minimum amount of worker threads. spring-boot-undertow 优化参数: ioThreads 设置IO线程数, 它主要执行非阻塞的任务,它们会负责多个连接,默认取CPU核心数量,最小值为2。 Math.max(Runtime.getRuntime().availableProcessors(), 2); spring-boot 参数:server.undertow.io-threads= worker-threads 阻塞任务线程池, 当执行类似servlet请求阻塞操作, undertow会从这个线程池中取得线程,它的值设置取决于系统的负载,默认值为io-threads*8。 spring-boot 参数:server.undertow.worker-threads= buffer buffer-size: 每块buffer的空间大小,越小的空间被利用越充分。 **buffers-per-region: ** 每个区分配的buffer数量 , 所以pool的大小是buffer-size * buffers-per-region。 directBuffers 是否分配的直接内存。 获取JVM最大可用内存maxMemory=...

Maxwell MySQL binlog订阅和一些坑

maxwell 相关资源 http://maxwells-daemon.io/ https://github.com/zendesk/maxwell https://github.com/zendesk/open-replicator 配置MySQL master数据源 1 2 3 4 [mysqld] server-id=1 log-bin=master binlog_format=row 注意: MySQL必须开启了binlogs,即log-bin指定了目录 binlog_format必须是row master数据源配置REPLICATION权限: Maxwell需要储存他自己的一些状态数据,启动参数schema_database选型来指定,默认是maxwell. 1 2 GRANT ALL on maxwell.* to 'maxwell'@'%' identified by '123456'; GRANT SELECT, REPLICATION CLIENT, REPLICATION SLAVE on *.* to 'maxwell'@'%'; 问题列表 当binlog文件不存在时(被删除、移除、过期) 无法启动maxwell 正在运行的maxwell**可能**会stop 在阿里云RDS下的风险问题 binlog文件清理问题 binlog文件名在切换master主备或者阿里运维维护时会重置 RDS for MySQL 的 Binlog 生成和清理规则: 参考:RDS for MySQL 之 Binlog 日志生成和清理规则 其他问题 阿里RDS的binlog在被复制完成后,会将之前的最后的binlog文件复制到其他地方,如果maxwell挂起时...

RestTemplate遇上Hystrix

RestTemplate遇上Hystrix RestTemplate集成Hystrix和Robbin 查看RestTemplate源代码,可以看到RestTemplate继承了InterceptingHttpAccessor类,InterceptingHttpAccessor类通过ClientHttpRequestInterceptor接口提供了扩展功能。 实现intercept方法,在该方法中封装HystrixCommand和Ribbon逻辑即可。 下面的代码是集成了HystrixCommand的例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 @Override public ClientHttpResponse intercept( final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException { final URI originalUri = request.getURI(); String serviceName = mapCommandKey(originalUri); log.info("{} :{} {} ", serviceName, request.getMethod().name(), originalUri.toString()); return new RestTemplateHystrixCommnad(serviceName, () -> { return execution.execute(request, body); }, hystrixFallback).execute(); } 下面是集成了HystrixCommand和Ribbon的例子 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Override public ClientHttpResponse intercept( final HttpRequest request, final byte[] body, final ClientHttpRequestExecution execution) throws IOException { final URI originalUri = request.getURI(); String serviceName = mapCommandKey(originalUri); log.info("{} :{} {} ", serviceName, request.getMethod().name(), originalUri.toString()); return new RestTemplateHystrixCommnad(serviceName, () -> { return this.loadBalancer.execute(serviceName, instance -> { HttpRequest...

软件开发中的单一职责

软件开发中的单一职责 最近在实践微服务化过程中,对其“单一职责”原则深有体会。 那么只有微服务化才可以单一职责,才可以解耦吗?答案是否定的。 单一职责原则是这样定义的:单一的功能,并且完全封装起来。 我们做后端Java开发的,应该最熟悉的就是标准的3层架构了,尤其是使用Spring.io体系的:Controller,Service,Dao/Repository。为什么要分层?就是为了保证单一职责,数据模型的事情交给Controller,业务逻辑的事情交给Service,和数据打交道的事情就交给Dao/Repository。有时候或者有些人会分层分的更多,4层,5层,我自己也这样干过,说白了也是为了保证单一职责,3层不能满足单一职责了,耦合度高了,就分。 我们都知道一个webapp在经过一定时间的开发后,就惨不忍睹,即便是有标准的分层,页面或模板文件一大堆,最初的很清晰的3层标准架构也变味了,Cont...

负载均衡之加权轮询算法

负载均衡之加权轮询算法 算法举例说明 服务实例 权重 127.0.0.1:8001 1 127.0.0.1:8002 2 127.0.0.1:8003 3 共有三个实例,总权重为6,那么实现效果应该为每调用6次: 每个实例应该被调用权重次数 权重数大的优先被调用 根据以上说明,那么进行排列组合: 先按照权重大小排序 把权重数做为调用次数排列 排列的结果是这样的: 序号 服务实例 权重 1 127.0.0.1:8003 3 2 127.0.0.1:8003 3 3 127.0.0.1:8003 3 4 127.0.0.1:8002 2 5 127.0.0.1:8002 2 6 127.0.0.1:8001 1 貌似没问题,但每个实例调用不是交替的,分布不够均匀,改进一下重新排列组合: 序号 服务实例 权重 1 127.0.0.1:8003 3 2 127.0.0.1:8002 2 3 127.0.0.1:8003 3 4 127.0.0.1:8002 2 5 127.0.0.1:8003 3 6 127.0.0.1:8001 1 或者 序号 服务实例 权重 1 127.0.0.1:8003 3 2 127.0.0.1:8002 2 3 127.0.0.1:8003 3 4 127.0.0.1:8001 1 5 127.0.0.1:8003 3 6 127.0.0.1:8002 2 2个权重变量:weight,current_weight weight 配置的固定不变的权重 current_weight 会动态调整的权重,初始化为0,运行时动态调整。 选取开始时,先重新调整current_weight= current_weight+weight,然后通过current_weight值从大到小排序,选择current_weight值最大...

Hystrix降级模式总结

失败回退降级模式 失败回退需要实现HystrixCommand.getFallback方法或者HystrixObservableCommand. HystrixObservableCommand()方法。 快速失败Fail Fast 如果业务异常,就抛出一个异常 静默失败Fail Silent 失败时返回一个空response或者移除业务功能,例如返回null,空字符串,空map,空list等 Fallback: Static 失败时,返回默认值来替代引起失败的原因 Fallback: Stubbed 返回替代值,还没理解 Fallback: Cache via Network 当后端服务失败时,从网络缓存获取返回值 Primary + Secondary with Fallback 故障转移,当主服务失败时,调用从服务。当从服务也失败时结合其他模式 Client Doesn’t Perform Network Access * Get-Set-Get with Request Cache Invalidation...

Hystrix简介

What Is Hystrix? What Is Hystrix For? What Problem Does Hystrix Solve? What Design Principles Underlie Hystrix? How Does Hystrix Accomplish Its Goals? 在分布式环境中,不可避免的有许多服务依赖,而且有时候一些服务会失败。Hystrix library通过添加延迟容忍和容错逻辑来控制分布式服务之间的相互影响。Hystrix通过服务之间访问的隔离点阻止连锁故障,并提供了失败回退机制(fallback),来改进系统服务的弹性。 Hystrix的历史 Hystrix是在2011年由Netflix API 团队的弹性工程演变而来。在2012年,Hystrix日益完善和成熟,在Netflix的许多团队也开始采用。现在,在Netflix,每天有成千上万的线程隔离和数百亿的信号隔离被调用执行。这已经在可用性和弹性上产生了很大的改进。 下面的链接提供了围绕Hystrix和挑战,试图解决: “Making Netflix API More Resilient” “Fault Tolerance in a High Volume, Distributed System” “Performance and Fault Tolerance for the Netflix API” “Applicati...

wrk基准测试工具安装使用

git https://github.com/wg/wrk git clone https://github.com/wg/wrk.git 安装 在makefile中33行 LDIR = deps/luajit/src LIBS := -lluajit $(LIBS) CFLAGS += -I$(LDIR) LDFLAGS += -L$(LDIR) 下面添加: LDFLAGS += -L/usr/local/opt/openssl/lib CFLAGS += -I/usr/local/opt/openssl/include make 基本使用 Basic Usage wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html This runs a benchmark for 30 seconds, using 12 threads, and keeping 400 HTTP connections open. Output: 1 2 3 4 5 6 7 8 Running 30s test @ http://127.0.0.1:8080/index.html 12 threads and 400 connections Thread Stats Avg Stdev Max +/- Stdev Latency 635.91us 0.89ms 12.92ms 93.69% Req/Sec 56.20k 8.07k 62.00k 86.54% 22464657 requests in 30.00s, 17.76GB read Requests/sec: 748868.53 Transfer/sec: 606.33MB 参数说明 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 $ wrk Usage: wrk <options> <url> Options: -c, --connections <N> Connections to keep open -d, --duration <T> Duration of test -t, --threads <N> Number of threads to use -s, --script <S> Load Lua script file -H, --header <H> Add header to request --latency Print latency statistics --timeout <T> Socket/request timeout -v, --version Print version details Numeric arguments may include a SI unit (1k, 1M, 1G) Time arguments may include a time unit (2s, 2m, 2h)...

Hystrix 参数详解

hystrix.command.default和hystrix.threadpool.default中的default为默认CommandKey Command Properties Execution相关的属性的配置: hystrix.command.default.execution.isolation.strategy 隔离策略,默认是Thread, 可选Thread|Semaphore thread 通过线程数量来限制并发请求数,可以提供额外的保护,但有一定的延迟。一般用于网络调用 semaphore 通过semaphore count来限制并发请求数,适用于无网络的高并发请求 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds 命令执行超时时间,默认1000ms hystrix.command.default.execution.timeout.enabled 执行是否启用超时,默认启用true hystrix.command.default.execution.isolation.thread.interruptOnTimeout 发生超时是是否中断,默认true hystrix.command.default.execution.isolation.semaphore.maxConcurrentRequests 最大并发请求数,默认10,该参数当使用ExecutionIsolationStrategy.SEMAPHORE策略时才有效。如果达到最大并发请求数,请求会被拒绝。理论上选择semaphore size的原则和选择thread size一致,但选用semaphore时每次执行的单元要比...