- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
"I don’t care if it works on your machine! We are not shipping your machine!" - Vidiu Platon 。
“我才不管它能不能在你的机器上运行捏!我们又不会给你提供机器!” —— 韦都·柏拉图 。
随着微服务架构风格的推广应用,开发人员的本地开发和调试成本大大提高,甚至不堪重负。动不动就要依赖一揽子东西,注册中心、Redis、MQ、基础服务ABC……等等.
开发人员如果手工在本地启停多个基础服务和中间件,将会浪费大量时间,降低开发效率.
Docker 和 Kubernetes ,不缺钱也不缺人的首选。什么双活、负载均衡统统来个四五套,把寒气也传给运维人员.
为了节约成本,当然是要在本地启动一整套系统节点啦,毕竟内存成本比人力成本低得多。但是手工启停太浪费时间了,这样会导致本来就不多的摸鱼时间所剩无几。人生苦短,我用脚本.
确定了方案,我就开始着手编排了,以一个Zookeeper + Redis(一主二从三哨兵)的启停脚本为目标,配置过程就略过了,着重解决启停的问题.
@echo off
color 5f
title fake-docker
echo ^>^>^>^>^>^>^>^>bootstrapping redis...
start "redis-master" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.master-1.conf"
start "redis-slaver-1" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.slaver-1.conf"
start "redis-slaver-2" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.slaver-2.conf"
start "redis-sentinel-1" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-1.conf" --sentinel
start "redis-sentinel-2" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-2.conf" --sentinel
start "redis-sentinel-3" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-3.conf" --sentinel
echo ^>^>^>^>^>^>^>^>done!
echo ^>^>^>^>^>^>^>^>bootstrapping zookeeper...
start "zookeeper-dev" "c:\dev\apache-zookeeper-3.6.3-bin\bin\zkServer.cmd"
echo ^>^>^>^>^>^>^>^>system is hot!
@echo off
color 5f
echo ^>^>^>^>^>^>^>^>shutdowning...
taskkill /t /f /fi "imagename eq redis-server.exe" >nul
taskkill /t /f /fi "windowtitle eq zookeeper-dev" >nul
echo ^>^>^>^>^>^>^>^>system is down!
pause>nul
第一个版本,解决了启动和停止的问题,但是是手动档的,重启中间件的话要执行两个脚本。待改进的问题有两个:
第一个问题容易解决,先停后起,先执行停止指令,再把应用拉起来.
第二个问题有点麻烦,一开始想尝试无窗口启动,反复尝试未果,后来采用了折中方案,在 CMD 的 start 命令帮助中有如下描述:
C:\Users\Master>help start 。
启动一个单独的窗口以运行指定的程序或命令.
START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED] [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL] [/NODE ] [/AFFINITY ] [/WAIT] [/B] [command/program] [parameters] 。
"title" 在窗口标题栏中显示的标题。 path 启动目录。 B 启动应用程序,但不创建新窗口。 应用程序已忽略 ^C 处理。除非应用程序 启用 ^C 处理,否则 ^Break 是唯一可以中断 该应用程序的方式。 I 新的环境将是传递 给 cmd.exe 的原始环境,而不是当前环境。 MIN 以最小化方式启动窗口。 MAX 以最大化方式启动窗口。 SEPARATE 在单独的内存空间中启动 16 位 Windows 程序。 SHARED 在共享内存空间中启动 16 位 Windows 程序。 LOW 在 IDLE 优先级类中启动应用程序。 NORMAL 在 NORMAL 优先级类中启动应用程序。 HIGH 在 HIGH 优先级类中启动应用程序。 REALTIME 在 REALTIME 优先级类中启动应用程序。 ABOVENORMAL 在 ABOVENORMAL 优先级类中启动应用程序。 BELOWNORMAL 在 BELOWNORMAL 优先级类中启动应用程序。 NODE 将首选非一致性内存结构(NUMA)节点指定为 十进制整数。 AFFINITY 将处理器关联掩码指定为十六进制数字。
根据描述,如果 start 时带上 /b 参数,就能让多个程序在一个窗口中寄宿。修改后得到最终版本:
@echo off
color 5f
title %date%
echo ^>^>^>^>^>^>^>^>cleaning up context...
echo ^>^>^>^>^>^>^>^>killing previous runner...
taskkill /t /f /fi "imagename eq redis-server.exe" >nul
taskkill /t /f /fi "windowtitle eq fake-docker*" >nul
timeout /t 3 /nobreak >nul
rd /s /q "c:\tmp\zookeeper">nul
echo ^>^>^>^>^>^>^>^>clean up context done!
title fake-docker
echo ^>^>^>^>^>^>^>^>bootstrapping redis...
start /b "redis-master" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.master-1.conf"
start /b "redis-slaver-1" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.slaver-1.conf"
start /b "redis-slaver-2" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.slaver-2.conf"
start /b "redis-sentinel-1" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-1.conf" --sentinel
start /b "redis-sentinel-2" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-2.conf" --sentinel
start /b "redis-sentinel-3" "c:\dev\redis-x64-3.2.100\redis-server.exe" "c:/dev/redis-x64-3.2.100/redis.sentinel-3.conf" --sentinel
echo ^>^>^>^>^>^>^>^>done!
echo ^>^>^>^>^>^>^>^>bootstrapping zookeeper...
start /b "zookeeper-dev" "c:\dev\apache-zookeeper-3.6.3-bin\bin\zkServer.cmd"
echo ^>^>^>^>^>^>^>^>system is hot!
最终版本,实现了一键启停,只会产生一个命令行窗口,属于能用的范畴了。在此基础上,可以根据项目情况,自行添加其他中间件或基础服务的启停命令.
分布式应用调试和部署不可避免会面临几个问题:
通常由于架构的原因,为了调试某个中间节点或上游应用的功能,需要把相关的应用都启动起来,如果手工启停,无疑是痛苦的.
如果不能把整个系统都在本地启动起来,那么本地就会有一部分服务依赖于外部公共环境,它们通常不止一个人甚至不止一个团队在用。 一旦外部服务不可用,就会影响到本地的开发和测试.
因此准备一个微型本地开发环境是有必要的,至少在开发和调试阶段。况且如果最困难的启停问题被解决了,何乐不为呢?
最后此篇关于本地同时启停多个中间件的优雅方案的文章就讲到这里了,如果你想了解更多关于本地同时启停多个中间件的优雅方案的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我应该编写一个函数来打印一组给定的三个数字中两个较大数字的平方和。 我对这种情况的处理相当笨拙。我没有编写返回一组 3 中最大的两个数字的函数,而是编写了函数,以便表达式减少到两个所需的数字。 # S
如果有人可以提供帮助,我将不胜感激。我一直在敲我的头一天试图让这个工作。我已经在互联网上搜索并重新阅读了手册,但我就是不明白。 guile << __EOF__ ( define heading-li
目前我正在处理一个方案问题,其中我们正在使用方案列表表示一个图。我们使用的第一个变体是表示为 的边列表图 '((x y) (y z) (x z)) 我们正在使用的图的第二个变体被称为 x 图,表示为
我正在尝试创建一个函数,该函数将两个函数作为参数并执行它们。 我尝试使用 cond ,但它只执行 action1 . (define seq-action (lambda (action1 act
我提前为我的原始英语道歉;我会尽量避免语法错误等。 两周前,我决定更新我对 Scheme(及其启示)的知识,同时实现我在手上获得的一些数学 Material ,特别是我注册的自动机理论和计算类(cla
Scheme中有没有函数支持分数的“div”操作? 意思是 - 11 格 2.75 = 4。 最佳答案 我认为你的问题的答案是:没有,但你可以定义它: #lang racket (define (di
我在scheme中实现合并排序,我必须通过定义两个辅助方法来实现:merge和split。 Merge 需要两个列表(已经按递增顺序)并将它们合并在一起。我这样做了如下: (define merge
尝试从终端加载方案文件。我创建了一个名为 test.scm 的文件,其中包含以下代码: (define (square x) (* x x)) (define (sum-of-squares x y)
我有以下代码: (define (howMany list) (if (null? list) 0 (+ 1 (howMany (cdr list))))) 如果我们执行以
我有点了解如何将基本函数(例如算术)转换为Scheme中的连续传递样式。 但如果函数涉及递归怎么办?例如, (define funname (lambda (arg0 arg1)
我正在尝试附加两个字符串列表 但我不知道如何在两个单词之间添加空格。 (define (string-concat lst1 lst2) (map string-append lst1
这个问题已经有答案了: How do I pass a list as a list of arguments in racket? (2 个回答) 已关闭 8 年前。 我有一个函数,它需要无限数量的
我对这段代码的工作方式感到困惑: (define m (list 1 2 3 '(5 8))) (let ((l (cdr m))) (set! l '(28 88))) ==>(1 2 3 (5 8
我正在为学校做一项计划作业,有一个问题涉及我们定义记录“类型”(作为列表实现)(代表音乐记录)。 我遇到的问题是我被要求创建一个过程来创建这些记录的列表,然后创建一个将记录添加到该列表的函数。这很简单
我有以下代码: (define (howMany list) (if (null? list) 0 (+ 1 (howMany (cdr list))))) 如果我们执行以
我正在尝试附加两个字符串列表 但我不知道如何在两个单词之间添加空格。 (define (string-concat lst1 lst2) (map string-append lst1
如何使用抽象列表函数(foldr、foldl、map 和 filter 编写函数),无需递归,消耗数字列表 (list a1 a2 a3 ...) 并产生交替和 a1 - a2 + a3 ...? 最
我试图找出在 Scheme 中发生的一些有趣的事情: (define last-pair (lambda (x) (if (null? (cdr x))
这个问题在这里已经有了答案: Count occurrence of element in a list in Scheme? (4 个答案) 关闭 8 年前。 我想实现一个函数来计算列表中元素出现
我正在尝试使用下面的代码获取方案中的导数。谁能告诉我哪里出错了?我已经尝试了一段时间了。 (define d3 (λ (e) (cond ((number? e) 0) ((e
我是一名优秀的程序员,十分优秀!