概述

JMicro是本人开发的基于Java实现的微服务框架,前两天发布0.0.3正式版本,并已发布到maven中央仓库。

项目源码github:
https://github.com/mynewworldyyl/jmicro,
Maven地址:
https://mvnrepository.com/search?q=cn.jmicro
Demo:http://jmicro.cn
账号:test00 密码:1

JMicro是基于Java技术实现的简单轻量(相对于Dubbo,Spring Cloud)微服务平台,让服务开发者及服务使用者完全面向接口或方法,无需关注底层实现,甚至感觉不到跨进程,跨服务调用的存在;可作为Serverless平台基础,跨系统,跨平台,跨语言无差别的一致性使用方式。多租户,账号权限控制,SSL连接(web端同样支持,非HTTPS);原生支持JVM级别的主备实现,多实例集群及纵向分布式解决方案,缓存,分布式锁,原生支持服务路由及负载均衡,可灵活配置的日志分析及呈现方案,精细化的RPC链路监控可以看到RPC相关的全部细节并可重现回放;支持分布式事务;内置高性能可靠消息服务;

安装依赖

JMicro依赖ZK及Redis,为了方便入门的同学,我提供这两包的下载链接如下:

Windows版本Redis:
https://pan.baidu.com/s/13i7T1riw10zdqd5oYmJizQ 提取码:whrl

下载Redis后解压到任意目录,双击redis-server.exe文件即可启动单机版本Redis。

ZK:
https://pan.baidu.com/s/1MLYPLfjUAnkmp1JEjddPJw 提取码:t58p

下载后解到压任意目录,找到bin/zkServer.cmd文件,双击即可运行单机版ZK.

下载并运行样例源码

声明在前:样例只是为了模拟RPC远程服务调用及实现方式,并不会真正做下单或支付操作。

从Github
https://github.com/mynewworldyyl/jmicro_demos 下载样例源码到任意目录,如D:\jmicro_demos。cmd命令行窗口进入到D:\opensource\github\jmicro_demos\expjmicro.helloworld目录,运行如下命令

mvn clean install -Dmaven.test.skip=true

如无报错,则进入下一步,如有报错则根据错误提示修正后重新执行以上命令即可。

运行

在每个模块根目录下,有个start.bat的批处理文件,用文本编辑器打开任意一个,里面脚本如下:

title expjmicro.helloworld.order
java ^
-Xbootclasspath/a:%MAVEN_RESP_HOME%\org\javassist\javassist\3.24.0-GA\javassist-3.24.0-GA.jar ^
-javaagent:%MAVEN_RESP_HOME%\cn\jmicro\jmicro.agent\0.0.3-RELEASE\jmicro.agent-0.0.3-RELEASE.jar ^
-jar %MAVEN_RESP_HOME%\cn\expjmicro\expjmicro.helloworld.order\0.0.3-RELEASE\expjmicro.helloworld.order-0.0.3-RELEASE-with-core.jar ^
-DsysLogLevel=2 -DclientId=25500 -DadminClientId=0 -Dlog4j.configuration=%JMICRO_DEMO_HOME%\log4j.xml -Dpwd=1

重点看MAVEN_RESP_HOME和JMICRO_DEMO_HOME这两个环境变量引用,

MAVEN_RESP_HOME表示我们本地maven仓库根目录;

JMICRO_DEMO_HOME表示刚刚下载源代码的根目录;

将这两个变量配置到本机的环境变量中,如我的配置如下图:

配置环境变量

配置好环境变量后,分别(无先后顺序)进入shop,order,payment目录运行start.bat文件,如都无报错误,则表示启动3个服务成功;

进入client模块,同样运行start.bat文件,client会每间隔3秒调用一次shop服务模拟一次商品购买操作,请自行查看命令行窗口输出日志。

如果你按以上操作不能让服务运行起来,请评论区骂我!

实现过程

服务调用关系图

图中每个矩形代表一个JVM服务。服务接口关系图如下

服务接口类图

ITxShopService:表示商店接口,只提供一个方法Resp<Boolean> buy(int goodId,int num),模拟客户购买商品,其实现代码如下,服务实现类实现接口ITxShopService,并用Component和Service注解,就这样实现了一个远程服务,同时通过Reference注解引用订单服务,是不是很简单!

@Component
@Service(version="0.0.1")
public class TxShopServiceImpl implements ITxShopService { private final static Logger logger = LoggerFactory.getLogger(TxShopServiceImpl.class); @Reference//引用订单服务
private ITxOrderService orderSrv; @Override
public Resp<Boolean> buy(int goodId,int num) {
Resp<Boolean> r = new Resp<>(Resp.CODE_FAIL,false);
logger.info("开始购买商品:"+goodId+",数量:" + num);
Good g = new Good();
g.setId(goodId);
r = orderSrv.takeOrder(g,num);//调用下单服务
if(r.getData()) {
logger.info("购买商品成功:"+goodId+",数量:" + num);
}else {
logger.info("购买商品失败:"+goodId+",数量:" + num+",Reason: "+r.getCode()+",msg:"+r.getMsg());
}
return r;
}
}

Client使用商店服务代码如下,只需Reference注解ITxShopService上面的服务接口即可获取服务实例,是不是不敢相信!
@Component  //容器根据此注解实例化组件
public class ShopClient extends PostFactoryAdapter{ private final static Logger logger = LoggerFactory.getLogger(ShopClient.class); //Reference注解获得Shop服务代理引用
@Reference
private ITxShopService shop; //容器启动成功后调用此方法
@Override
public void afterInit(IObjectFactory of) {
//为了不Block主线程,我们在此启动一个线程每间隔3秒调用一次商店提供的购买方法
new Thread(()->{
for(;true;) {
try { //调用商店服务
Resp<Boolean> rst = shop.buy(1, 1);
if(rst.getCode() != Resp.CODE_SUCCESS) {
//系统组错误
logger.info(rst.getMsg()+"," + rst.getCode());
}else if(rst.getData()) {
//业务购买失败
logger.info("Success buy good");
}else {
//成功
logger.info("Failure buy good");
}
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
logger.error("",e);
}
}catch(Throwable e) {
logger.error(e.getMessage());
}
}
}).start();
}
}

同理的,下单服务及支付服务实现代码请查看源码,在此不再贴出来了,太烦人了。

必须自夸一下

相比当年入门Dubbo的HelloWorld(Spring Clound更别提了,本人至今还没入门),入门JMicro真的太单了,简单到不相信中间真的做了远程调用。但中间确实启动了多个JVM,如果你还不相信,请将每个服务在不同的物理机上启动,Client也在不同的机器上启动,看效果是不是一样!

这种简单使我不知道再需要说点什么,Component,Service,Reference注解这需要说吗?需要说的请评论区回复,我单独写一篇详细的实现细节。

后面持续发表JMicro实现微服务相关的细节,如超时,重试,熔断,限流,降级,API网关,服务路由,高可用,分布式锁和分布式事务,日志收集,链路监控等,请加关注!

JMicro微服务Hello World的更多相关文章

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

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

  2. 【12】JMicro微服务-Zookeeper

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

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

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

  4. 【10】JMicro微服务-API网关

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到9小节 1. Api网关基本特性: Api网关作为对外网提供服务的基本入口,地位类似于NGINX, ...

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

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

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

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

  7. 【3】JMicro微服务-服务超时,重试,重试间隔

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 接下来的内容都基于[2]JMicro微服务-Hello World做Demo 微服务中,超时和重试是一个最基本问题下面Dem ...

  8. JMicro微服务之超时&重试

    JMicro是本人开发的基于Java实现的微服务框架,当前正式版本为0.0.3,并已发布到maven中央仓库.项目源码github:https://github.com/mynewworldyyl/j ...

  9. 【6】JMicro微服务-服务日志监控

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl   1. 微服务相关 在前面的1到5节中,总共涉及服务提供者,服务消费者,服务监听服务,发布订阅服务,熔断器服务5种类型的猪 ...

  10. 【9】JMicro微服务-发布订阅消息服务

    如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. JMicro消息服务目前实现特性 a. JMicro只支持发布订阅消息服务,不支持队列式消息服务: b. 不支持消息持 ...

随机推荐

  1. L'ane Trotro(小驴托托) 67集法语字幕+11集无字幕 百度云

    <小驴托托>(L'ane Trotro)是法国经典的少儿动画片,讲述了小驴托托的生活,它的对白浅显易懂,非常适合法语初学者培养语感以及学习日常表达. 百度云链接自取:https://pan ...

  2. Vue3发布半年我不学,摸鱼爽歪歪,哎~就是玩儿

    是从 Vue 2 开始学基础还是直接学 Vue 3 ?尤雨溪给出的答案是:"直接学 Vue 3 就行了,基础概念是一模一样的." 以上内容源引自最新一期的<程序员>期刊 ...

  3. kafka管理工具-kafka manager安装

    kafka-manager 简介 # 项目信息 https://github.com/yahoo/kafka-manager 安装 环境要求: Kafka 0.8.. or 0.9.. or 0.10 ...

  4. 473. Matchsticks to Square

    Remember the story of Little Match Girl? By now, you know exactly what matchsticks the little match ...

  5. android签名分析及漏洞修复

    本篇我们来看看android的签名机制.发布出来的apk都是有META-INF文件夹,里面包含如下三个文件: 下面来一一解释这三个文件的作用(打包apk时签名过程):SignApk.main() 1. ...

  6. UVA11992不错的线段树段更新

    题意:       给你一个矩阵,最大20*50000的,然后有三个操作 1 x1 y1 x2 y2 v  把子矩阵的值全部都加上v 2 x1 y1 x2 y2 v  把子矩阵的值全部都变成v 2 x ...

  7. UVA10294项链和手镯(等价类计数问题)

    题意:       给你一串珠子(连接成了一个环),共有n个珠子组成,你有t种颜色,现在你来给这个珠子染色,问染成项链有多少种方法?染成手镯有多少种方法?在项链里,经过顺时针旋转后相同的算一个,在手镯 ...

  8. 【Redis】启动redis提示Could not connect to Redis at 127.0.0.1:6379: Connection refused 已解决

    1.配置redis.conf文件,将daemonize no 为 daemonize yes即可(让redis作为守护进程运行)

  9. Spring Boot & Cloud 轻量替代框架 Solon 1.3.33 发布

    Solon 是一个微型的Java开发框架.强调,克制 + 简洁 + 开放的原则:力求,更小.更快.更自由的体验.支持:RPC.REST API.MVC.Micro service.WebSocket. ...

  10. Windows进程间通讯(IPC)----WM_COPYDATA

    WM_COPYDATA通讯思路 通过向其他进程的窗口过程发送WM_COPYDATA消息可以实现进程间通讯. 只能通过SendMessage发送WM_COPYDATA消息,而不能通过PostMessag ...