JMicro微服务Hello World
概述
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的更多相关文章
- 【13】JMicro微服务-ID生成与Redis
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到12小节 1. 微服务中ID地位 如果说前面小节的功能点是微服务的大脑,那么全局唯一ID则是微服务 ...
- 【12】JMicro微服务-Zookeeper
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到11小节 1. CuratorFramework支持 JMicro目前基于Zookeeper实现统 ...
- 【11】JMicro微服务-配置管理
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到10小节 JMicro目前仅支持基于Zookeeper做配置管理,全部配置信息可以在ZK做增删改查 ...
- 【10】JMicro微服务-API网关
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 往下看前,建议完成前面1到9小节 1. Api网关基本特性: Api网关作为对外网提供服务的基本入口,地位类似于NGINX, ...
- 【8】JMicro微服务-JMicro ZKUI
ZKUI是一个开源项目,是一个查看,修改ZK数据非常方便的工具.JMicro基于ZK做服务治理,配置管理,因此使用ZKUI会提供非常大的方便. Github地址:https://github.com/ ...
- 【2】JMicro微服务-Hello World
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. 首先完成 JMicro微服务-RPC体验 的1到5步. 按默认方式启动ZK及Redis: JDK需要Java8及以上. ...
- 【3】JMicro微服务-服务超时,重试,重试间隔
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 接下来的内容都基于[2]JMicro微服务-Hello World做Demo 微服务中,超时和重试是一个最基本问题下面Dem ...
- JMicro微服务之超时&重试
JMicro是本人开发的基于Java实现的微服务框架,当前正式版本为0.0.3,并已发布到maven中央仓库.项目源码github:https://github.com/mynewworldyyl/j ...
- 【6】JMicro微服务-服务日志监控
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. 微服务相关 在前面的1到5节中,总共涉及服务提供者,服务消费者,服务监听服务,发布订阅服务,熔断器服务5种类型的猪 ...
- 【9】JMicro微服务-发布订阅消息服务
如非授权,禁止用于商业用途,转载请注明出处作者:mynewworldyyl 1. JMicro消息服务目前实现特性 a. JMicro只支持发布订阅消息服务,不支持队列式消息服务: b. 不支持消息持 ...
随机推荐
- 工作区和GOPATH
工作区和GOPATH 1.特性: 1.1.5版本的自举(即用 Go 语言编写程序来实现 Go 语言自身) 2.1.7版本的垃圾回收器 2.GOROOT.GOPATH 和 GOBIN GOROOT:Go ...
- JavaScript遍历对象方法总结
前言 本篇内容将按照下图展开: 遍历Object Object最常见的遍历方法方法就是使用for...in...,但其有一定的局限性,比如只能遍历可枚举属性.虽然Object无法直接使用for循环和f ...
- 工厂模式之简单工厂模式,head first设计模式
简单设计模式比较简单,15分钟的时间,跟着我做,十几分钟学会简单设计模式,开始吧: 1.使用new实例化一个对象时,你肯定知道这种代码缺少弹性,绑定着具体的类会导致代码更加脆弱,简单工厂模式就是针对接 ...
- KMP(梅开三度之数据结构详解版
前言 KMP算法是一种字符串匹配算法,其重中之重是next数组的构建,其代码的简洁与神奇使其广受关注. 但不难发现,acm中学到的KMP和数据结构里面学到的KMP并不一样o(︶︿︶)o 之前我写过ac ...
- css选择器中:first-child 与 :first-of-type的区别
## css选择器中:first-child 与 :first-of-type的区别 ---- :first-child选择器是css2中定义的选择器,从字面意思上来看也很好理解,就是第一个子元素.比 ...
- 【Scrapy(二)】Scrapy 中的 Pipline,Item,Shell组件
Pipline: 1.爬虫项目与爬虫的区别与关联: 一个爬虫项目可以包含多个爬虫,如下图中爬虫项目firstspider 包含多个爬虫itcst 和爬虫itcast1 2.多个爬虫是公用一套Pipli ...
- POJ 1201 差分约束(集合最小元素个数)
题意: 给你一个集合,然后有如下输入,a ,b ,c表示在范围[a,b]里面有至少有c个元素,最后问你整个集合最少多少个元素. 思路: 和HDU1384一模一样,首先这个题目可 ...
- 论文解读丨基于局部特征保留的图卷积神经网络架构(LPD-GCN)
摘要:本文提出一种基于局部特征保留的图卷积网络架构,与最新的对比算法相比,该方法在多个数据集上的图分类性能得到大幅度提升,泛化性能也得到了改善. 本文分享自华为云社区<论文解读:基于局部特征保留 ...
- 【python】Leetcode每日一题-笨阶乘
[python]Leetcode每日一题-笨阶乘 [题目描述] 通常,正整数 n 的阶乘是所有小于或等于 n 的正整数的乘积.例如,factorial(10) = 10 * 9 * 8 * 7 * 6 ...
- Spring Cloud Gateway + Nacos(1)简单配置
当初我学习时候就是参考这位大佬的博客: Nacos集成Spring Cloud Gateway 基础使用 现在学习到spring cloud alibaba 使用nacos做服务中心,dubbo做通信 ...