序言

JMicro是一个用Java语言实现的开源微服务全家桶,源码地址:https://github.com/mynewworldyyl/jmicro,Demo地址:http://124.70.152.7  。功能简介: 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://124.70.152.7  开放了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://124.70.152.7里面的进程列表,也是经常有进程退出,新进程进来,因为当前单机服务很少,所以有时服务会断开,如果服务数量足够多,肯定感觉不到服务断开!

二, 部署实例

  (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

构建后台前端代码,首先确保安装好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=0.0.0.0 \
-DmngJarFile=jmicro-main.mng-0.0.1-SNAPSHOT-jar-with-dependencies.jar \
-DapiGatewayJarFile=jmicro-main.apigateway-0.0.1-SNAPSHOT-jar-with-dependencies.jar &
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.-SNAPSHOT.jar \
-Xmx64m -Xms16m \
-jar /home/ubuntu0/jmicro/resp/jmicro-choreography.agent-0.0.-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网关及管理服务都还存在单点问题,监控器,熔断器,消息服务器等服务都还没部署。 为防止视角疲劳,确保单篇文章简短,更多部署及开发实例,留待下回分享

【JMicro】微服务部署架构及实例的更多相关文章

  1. Chris Richardson微服务翻译:微服务部署

    Chris Richardson 微服务系列翻译全7篇链接: 微服务介绍 构建微服务之使用API网关 构建微服务之微服务架构的进程通讯 微服务架构中的服务发现 微服务之事件驱动的数据管理 微服务部署( ...

  2. 基于Spring Boot、Spring Cloud、Docker的微服务系统架构实践

    由于最近公司业务需要,需要搭建基于Spring Cloud的微服务系统.遍访各大搜索引擎,发现国内资料少之又少,也难怪,国内Dubbo正统治着天下.但是,一个技术总有它的瓶颈,Dubbo也有它捉襟见肘 ...

  3. 微服务实战(六):选择微服务部署策略 - DockOne.io

    原文:微服务实战(六):选择微服务部署策略 - DockOne.io [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺点.随后的文章讨论了微服务不同 ...

  4. docker微服务部署之:六、Rancher管理部署微服务

    docker微服务部署之:五.利用DockerMaven插件自动构建镜像 一. 什么是Rancher Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源 ...

  5. 【13】JMicro微服务-ID生成与Redis

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到12小节 1. 微服务中ID地位 如果说前面小节的功能点是微服务的大脑,那么全局唯一ID则是微服务 ...

  6. 【12】JMicro微服务-Zookeeper

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到11小节 1. CuratorFramework支持 JMicro目前基于Zookeeper实现统 ...

  7. 【11】JMicro微服务-配置管理

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到10小节 JMicro目前仅支持基于Zookeeper做配置管理,全部配置信息可以在ZK做增删改查 ...

  8. 【8】JMicro微服务-JMicro ZKUI

    ZKUI是一个开源项目,是一个查看,修改ZK数据非常方便的工具.JMicro基于ZK做服务治理,配置管理,因此使用ZKUI会提供非常大的方便. Github地址:https://github.com/ ...

  9. 【2】JMicro微服务-Hello World

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. 首先完成 JMicro微服务-RPC体验 的1到5步. 按默认方式启动ZK及Redis: JDK需要Java8及以上. ...

随机推荐

  1. linux crontab 定时任务 邮件问题 及其相关的 dead.letter 问题

    最近开发项目的时候发现公司服务器用root账号登录的时候 一直会提示有新的信件,一直提示一直提示. 联想到另一台服务器上 的dead.letter文件每天都不断的变大  而且在 root家目录里 ,系 ...

  2. linux就该这么学 第一天学习笔记

    题外话 在每天的网上冲浪中,一次无意间的点击,发现了linux就该这么学的网站,然后就看了一晚上,当时还是学生的我特别想要参加培训,可是碍于眼前的经济状况,只得将这个想法深深的藏在了心里,并加了一下网 ...

  3. bash默认组合按键

    组合按键 运行结果 Ctrl + C 终止目前的命令 Ctrl + D 输入结束 (EOF),例如邮件结束的时候: Ctrl + M 就是 Enter 啦! Ctrl + S 暂停屏幕的输出 Ctrl ...

  4. String 类的其他功能

    12.01_常见对象(Scanner的概述和方法介绍)(掌握) A:Scanner的概述 B:Scanner的构造方法 Scanner(InputStream source) System.in C: ...

  5. How many ways?? HDU - 2157 矩阵快速幂

    题目描述 春天到了, HDU校园里开满了花, 姹紫嫣红, 非常美丽. 葱头是个爱花的人, 看着校花校草竞相开放, 漫步校园, 心情也变得舒畅. 为了多看看这迷人的校园, 葱头决定, 每次上课都走不同的 ...

  6. tabBar配置和修改

    1.tabBar(底部导航栏) 属性 默认值 描述 平台支持 color   tab上未被选中时文字的颜色   selectedColor   tab上被选中时文字的颜色   backgroundCo ...

  7. 一文搞定 Spring Data JPA

    Spring Data JPA 是在 JPA 规范的基础上进行进一步封装的产物,和之前的 JDBC.slf4j 这些一样,只定义了一系列的接口.具体在使用的过程中,一般接入的是 Hibernate 的 ...

  8. Django---进阶2

    目录 数据的查,改,删 django orm中如何创建表关系 django请求生命周期流程图(必会) 路由层 路由匹配 无名分组 有名分组 无名有名是否可以混合使用 反向解析 作业 数据的查,改,删 ...

  9. Redux的理解与使用

    一.什么是Redux? Redux是一个第三方状态管理的js库,它不仅仅可以适用于react框架,还可以用于其他的vue,auglar等框架.只不过react的生态中不包括一个状态管理的库而已,所以与 ...

  10. day25 ATM项目(第一天)

    项目的说明书 项目:ATM + 购物车 项目需求: 1.额度15000或自定义 --> 注册功能 2.实现购物商城,买东西加入购物车,调用信用卡接口结账 --> 购物功能.支付功能 3.可 ...