【2】JMicro微服务部署架构及实例
序⾔
对Demo服务器说明,否则你可能会误解JMicro的可靠性。
由于服务器性能⽐较差(华为云免费30天服务器,单核CPU+2G内存),服务器上⾯同时启动10个左右JVM,所以部分服务运⾏时间长了后会因申请不到⾜够内存⽽被强制退出,但由于使⽤JMicro实现的服务编排系统,服务会被重新启动,此⽅式同时证明JMicro在极端环境下的⾼可⽤性。
下⾯以JMicro核⼼组件部署架构图为基础,讲构JMicro核⼼功能,并附⼀个可运⾏的部署实例。
⼀,部署架构
(1) 6⼤类核⼼组件
上图从下到上分别为客户端,API⽹关(API Gateway),应⽤服务器(InternalBussinessServer),消息服务器(PubsubServer),监控服务器(MonitorServer),熔断器(BreakServer)
(2)客户端
JMicro⽀持通过HTTP,WebSocket及Socket访问服务,三者遵循相同的JMicro数据包协议,意味着不管使⽤什么语⾔,只要遵循JMicro数据包协议,就可以作为JMIcro客户端访问JMicro开放的服务接⼝。⽬前实现了浏览器端的HTTP及Websocket访问API,Java客户端访问API,NodeJS访问API,以后视需要会不断加⼊其他语⾔的客户端API实现。客户端⽀持请求响应模式及消息推送模式,消息推送模式即从服务端推消息到客户端,相当于⼀个请求多个响应,消息推送模式需要长连接⽀持(即Socket及WebSocket)。
(3)API⽹关(API Gateway)
多个主从节点⼜可以构成API⽹关集。如下图在服务编排系统的两个配置,表⽰启动2+2=4个实例,每两个实例组成主备服务,两个配置的instanceName值不同所以构成集。如果值相同,那就会构成主备服务,⽐如编号为7的配置instanceName的值如果改为apigateway,则两个配置共4个实例将构成1主3备的服务。
(4)消息服务PubsubServer
为JMicro量⾝定制的消息服务,通过他可以实现RPC同步转异步,⽽RPC调⽤者感觉不到同步和异步的差别。传统发消息接⼝⼀般都是先把数据封装为消息类的实例,然后调⽤相应的消息接⼝发送消息,JMicro也⽀持这种⽅式,但同时提供更加友好的⽅式。⽐如下⾯通过消息队列发送邮件,
传统⽅式是:
Message msg = new Message();
msg.setTopic("mailTopic");
<("ZhangSan");
msg.SetContent("Hello JMicro");
msgServerProxy.sent(msg);
JMicro⽅式
@Reference
private Msg ServerProxy zs; //代表ZhangSan提供的⼀个邮件服务,JMicro发现@Reference注解会⾃动注⼊服务代理实例
zs.helloJmicro("Hello JMicro"); //使⽤者像调⽤普通⽅法⼀样就把邮件内容通过消息队列发送出去。
通过上⾯的⽐较,我们应该能明⽩为什么JMicro重做消息队列这个轮⼦,就是为JMicro 量⾝定做的消息服务,并且是⾮常轻量的消息服务。
和API⽹关⼀样,消息服务也可以做主备服务及多个主备服务组成集,这两个模式⼏呼通⽤于JMicro任何服务实现,如监控服务,熔断器服务,服务编排系统中的分配器服务,资源管理器服务,以及⾃⼰实现的服务(JMicro原⽣⽀持,不需要做额外的开发)。⽬前唯⼀不能适⽤集及主备模式的是编排系统的主机宿主代理服务,以后再细说。
(5)监控服务
监控服务分为主服务和分析服务,主服务负责收集其他服务上报数据,并根据各分析服务的需要分发数据。⽐如⽇志持久化分析服务对⽇志类的数据感兴趣,则主服务只将⽇志数据分发给他,别的不会分发给他。⽽服务流量统计分析服务器只对RPC请求及响应两个动作感兴趣,则分发服务刚将这两个动作的事件分发给他。
监控服务器从客户端到服务端都是异步的消息传输,所以能⽀持⾮常⾼并发量,但是另⼀⽅⾯,即⽆法确保数据⼀定不丢失。监控服务本⾝主要⽤于数据统计,⽐如算超时百分⽐,RPC的QPS,偶尔丢失⼀个两个,对结果并⽆影响。
监控服务器可以把加⼯好的数据通过消息服务发送出去,感兴趣的服务则可以通过服务⽅法订阅这些数据。⽐如熔断器服务对RPC调⽤的超时百分⽐值感兴趣,则可以订阅这个数据,如果超时百分⽐⼤于服务⽅法配置的值,则熔断此服务。
JMicro的监控服务就像⼈的神轻系统对于⼈的作⽤⼀样,监控特性植根于JMicro应⽤的每⼀个细胞中,为JMicro“智能⼤脑”提供数据⽀持。如果你打开JMicro后台就会发现,将近⼀半的功能与监控有直接或间接关系,因为对于微服务系统,发现问题⽐避免问题更有价值,并且更有可⾏性。
(6)熔断器
熔断器说⽩话点就是服务的开关,在没办法的情况下,直接切断服务,不让客户端再直接调⽤服务,防⽌服务“雪崩”。⽐如⼀个⾼并发的客户端调⽤服务B,B⼜调⽤C,C⼜调⽤D,依此类推直到服务G才返回,如果某个时刻G不可⽤,那么F再调⽤G得到的结果也是因为“超时”⽽失败,既然结果都是失败,为什么要等到超时才失败呢?所以还不如“快速失败”,让调⽤链直接返回。如果⾼并发情况下,每个请求都等到G超时才失败返回,整个系统就卡在这了,这就是RPC系统引起的“雪崩”。
友好的熔断器不应该直接返回“系统错误”,也不是“404”或“500”,这会让调⽤者⽆所适从,⽽应该返回⼀个服务应该返回的类型的默认值。JMicro服务实现者应该考虑清楚在极端情况下,怎么样才能让调⽤者更舒服地接受返回值,让调⽤者觉得获得的结果和正常调⽤结果⼀样。(7)应⽤服务器(InternalBussi
nessServer)
意为内部的业务服务器,⼀般部署于内⽹,不直接对外⽹提供服务,但可通过API⽹关提供对外⽹服务,此规则只是⼀般情况下如此,并不是绝对如此,实际上,如果需要,服务也可直接暴露于外⽹,⽽不需要通过API⽹关,⽽即使如此,也应该视为逻辑上的内部服务,内部服务通过外⽹相互调⽤。
⼆,部署实例
(1) 安装依赖
以使⽤windows做开发环境,linux部署环境为例
⾸先在windows上安装JDK,maven,nodejs ,npm及cnpm,并配置好PATH环境变量
linux 上安装Zookeeper监听在2181端⼝,Redis⼯作在6379端⼝,选装mongodb端⼝27017,保持默认配置启动,ps命令结果如下图所⽰(2)java源码及构建
运⾏如下命令构建全部Jar包
cd ${base_dir}
mvn clean install -st.skip=true
(3) 构建后台管理的前端资源⽂件
⾸先修改${base_dir}/mng.web/public/js/rpc.js⽂件的IP地址为你机器的IP,端⼝保持默认9090
构建后台前端代码,⾸先确保安装好nodejs,npm及cnpm, npm及cnpm区别请⾃⼰⽹上查资料
cd ${base_dir}/mng.web
cnpm run build
在${base_dir}/mng.web/dist⽬录下内容为构建好的资源⽂件
(4)Linux部署⽬录结构
按下图建⽬录
根⽬录为/home/ubuntu0/jmicro,可以是任意⽬录;
0agent及1agent代表两台机器的两个JMicro宿主代理⼯作⽬录,因为我现在只有⼀台机器,所以建两个⽬录代表两台机器,实际⽣产部署中这样做没多太意义;
controller表⽰服务分配器⼯作⽬录;
respserver表⽰资源服务器⼯作⽬录;
resp⽤于资源服务器存放全部资源,也就是运⾏⽤到的全部Jar包;
mngweb存放后台管理静态页⾯,JS,CSS等资源
(5)上传Jar包resp⽬录
在(2)构建成功后,可在其下相应的target⽬录到以下Jar包
⾸次部署需要借助FTP⼯具将Jar包上传到resp⽬录,此demo路径为/home/ubuntu0/jmicro
Jar包路径分别为:
\jmicro\agent\target
\choreography\choreography.agent\target
\ller\target
\pository\target
将(3)构建好${base_dir}/mng.web/dist⽬录下的全部⽂件上传到mngweb⽬录下,如下图
(6)编写启动脚本
以下服务启动成功与否都可以通过如下命令查看⽇志
tail -fn300 nohup.out
资源服务
cd /home/ubuntu0/jmicro/respserver
touch start.sh
chmod +x start.sh
vi start.sh
start.sh 内容如下,注意按⾃⼰的环境修改对应⽬录路径
nohup java -javaagent:/home/ubuntu0/jmicro/resp/jmicro-agent-0.0.1-SNAPSHOT.jar -Xmx64m -Xms16m \
-jar /home/ubuntu0/jmicro/pository-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
-D/ResourceReponsitoryService/dataDir=/home/ubuntu0/jmicro/resp &
/ResourceReponsitoryService/dataDir=/home/ubuntu0/jmicro/resp 这个⽬录⼀定不能配错,否则部署服务会启动失败
启动资源服务器
./start.sh
controller服务常用微服务架构
cd /home/ubuntu0/jmicro/controller
respserver touch start.sh
chmod +x start.sh
vi start.sh
命令内容如下
nohup java -javaagent:/home/ubuntu0/jmicro/resp/jmicro-agent-0.0.1-SNAPSHOT.jar \
-Xmx64m -Xms16m \
-jar /home/ubuntu0/jmicro/ller-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
-D/StaticResourceHttpHandler/staticResourceRoot_mng=/home/ubuntu0/jmicro/mngweb \
-DapiGatewayExportHttpIP=192.168.1.129 -DapiGatewayListenHttpPort=80 \
--0.0.1-SNAPSHOT-jar-with-dependencies.jar \
-DapiGatewayJarFile=jmicro-main.apigateway-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
-DinitGatewayAndMng=false &
apiGatewayExportHttpIP=192.168.1.129即为(3)步修改的rpc.js⽂件中对应的IP,
/StaticResourceHttpHandler/staticResourceRoot_mng=/home/ubuntu0/jmicro/mngweb 这个就是上⾯上传的JS,CSS,HTML页⾯所在⽬录,这个⼀定不能配错,
否⾯页⾯打不开
启动控制器
./start.sh
部署两个宿主代理
在0agent⽬录下建start.sh⽂件,以下命令如果涉及⽬录,则需根据⾃⼰的情况做修改,此Demo根⽬录为/home/ubuntu0/jmicro
cd /home/ubuntu0/jmicro/0agent
touch start.sh
chmod +x start.sh
vi start.sh
start.sh⽂件内容如下
nohup java -javaagent:/home/ubuntu0/jmicro/resp/jmicro-agent-0.0.1-SNAPSHOT.jar \
-Xmx64m -Xms16m \
-jar /home/ubuntu0/jmicro/resp/jmicro-choreography.agent-0.0.1-SNAPSHOT-jar-with-dependencies.jar &
启动
./start.sh
部署1agent
cd /home/ubuntu0/jmicro/1agent
cp ../0agent/start.sh ./
启动
./start.sh
以上命令全部执⾏成功后,jps命令可以看到如下6个进程,前⾯4个是我们通过脚本启动的主机代理进程,资源服务进程,控制器进程。后⾯两个是控制器进程在第⼀次启动时⾃动为我们创建的两个部署实例,对应API⽹关和后台管理服务。
以上部署实例并不能完全呈现部署结构图,即使API⽹关及管理服务都还存在单点问题,监控器,熔断器,消息服务器等服务都还没部署。为防⽌视⾓疲劳,确保单篇⽂章简短,更多部署及开发实例,留待下回分享
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论