【2】JMicro微服务部署架构及实例

Java面试必问:ThreadLocal终极篇 淦!

序言

JMicro是一个用Java语言实现的开源微服务全家桶,源码地址:https://github.com/mynewworldyyl/jmicro,Demo地址:http://47.112.161.111/  。功能简介: https://www.cnblogs.com/jmicro/p/13276739.html

 

对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网关才能访问JMicro服务,内部服务通过API网关暴露服务给外部访问,API网关相当于服务器与客户端之间一道防火墙。一般API网关同时开放一个静态资源访问端口,比如http://47.112.161.111/  开放了80端口提供后台管理静态页面访问。API网关支持主备模式以解决服务单点问题,并且支持多个从服务。如下图1主1备的API网关实例HA ENABLE =true表示启用高可用,IS MASTER=true表示主节点,false表示备用节点。

 多个主从节点又可以构成API网关集群。如下图在服务编排系统的两个配置,表示启动2+2=4个实例,每两个实例组成主备服务,两个配置的instanceName值不同所以构成集群。如果值相同,那就会构成主备服务,比如编号为7的配置instanceName的值如果改为apigateway,则两个配置共4个实例将构成1主3备的服务。

 

 

(4)消息服务PubsubServer

 为JMicro量身定制的消息服务,通过他可以实现RPC同步转异步,而RPC调用者感觉不到同步和异步的差别。传统发消息接口一般都是先把数据封装为消息类的实例,然后调用相应的消息接口发送消息,JMicro也支持这种方式,但同时提供更加友好的方式。比如下面通过消息队列发送邮件,

传统方式是:

Message msg = new Message();
msg.setTopic("mailTopic");
msg.to("ZhangSan"); msg.SetContent(
"Hello JMicro"); msgServerProxy.sent(msg);

JMicro方式

@Reference
private MsgServerProxy 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)应用服务器(InternalBussinessServer)

意为内部的业务服务器,一般部署于内网,不直接对外网提供服务,但可通过API网关提供对外网服务,此规则只是一般情况下如此,并不是绝对如此,实际上,如果需要,服务也可直接暴露于外网,而不需要通过API网关,而即使如此,也应该视为逻辑上的内部服务,内部服务通过外网相互调用。

服务与服务之间可以相互调用(当然前提是不引起死循环或死锁),也就是互为客户端。服务的类型和数量都是动态的,可以随时加入和退出,JMicro中,服务客户端代理可以先于服务提供者而存在,是一种松耦合关系,当然,也可以强制服务提供者一定要先于服务调用者而存在。服务与服务之间非常灵活且多变。应用服务器组成的集群网络就好像一个菜市场,”人们“可以自由出入,自由买卖,一个商家可以卖多种菜,每种菜也可由多个商家卖。“人们”可以决定买那种菜,买多少,自由组合,结果是他们开什么类型的饭店,汤粉店还是兰州拉面,还是海鲜太酒店,完全由菜品的组合决定。JMicro服务应用组合讲究的也是这种自由市场,积木式的服务组合应用,所以上面部署图唯独应用服务里面的小方形所代表的服务是乱序无规则排列的。而你观察http://47.112.161.111/里面的进程列表,也是经常有进程退出,新进程进来,因为当前单机服务很少,所以有时服务会断开,如果服务数量足够多,肯定感觉不到服务断开!

 

二, 部署实例

  (1)  安装依赖

   以使用windows做开发环境,linux部署环境为例

  首先在windows上安装JDK,maven,nodejs ,npm及cnpm,并配置好PATH环境变量

   linux 上安装Zookeeper监听在2181端口,Redis工作在6379端口,选装mongodb端口27017,保持默认配置启动,ps命令结果如下图所示

(2)java源码及构建

   首先从 https://github.com/mynewworldyyl/jmicro  下载源码到指定目录,以${base_dir}指代根目录,

运行如下命令构建全部Jar包

 cd ${base_dir}
 mvn clean install -Dmaven.test.skip=true

 

(3) 构建后台管理的前端资源文件

首先修改${base_dir}/mng.web/public/js/rpc.js文件的IP地址为你机器的IP,端口保持默认9090

LRU缓存实现案例

构建后台前端代码,首先确保安装好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

\choreography\choreography.controller\target

\choreography\choreography.repository\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/resp/jmicro-choreography.repository-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/resp/jmicro-choreography.controller-0.0.1-SNAPSHOT-jar-with-dependencies.jar \ -D/StaticResourceHttpHandler/staticResourceRoot_mng=/home/ubuntu0/jmicro/mngweb \ -DapiGatewayExportHttpIP=192.168.1.129 -DapiGatewayListenHttpPort=80 \ -DmngJarFile=jmicro-main.mng-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网关和后台管理服务。

 

到这里,就可以在浏览器中打开后台管理页面,浏览器中输入 http://192.168.1.129:9090,如下图是看到是进程实例,是不是和上面JPS输出的很相似

以上部署实例并不能完全呈现部署结构图,即使API网关及管理服务都还存在单点问题,监控器,熔断器,消息服务器等服务都还没部署。 为防止视角疲劳,确保单篇文章简短,更多部署及开发实例,留待下回分享

 

【2】JMicro微服务部署架构及实例
免责声明:非本网注明原创的信息,皆为程序自动获取互联网,目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责;如此页面有侵犯到您的权益,请给站长发送邮件,并提供相关证明(版权证明、身份证正反面、侵权链接),站长将在收到邮件12小时内删除。

网页消息推送