百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

JMicro微服务Hello World 微服务 web

csdh11 2024-12-26 12:26 17 浏览

概述

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网关,服务路由,高可用,分布式锁和分布式事务,日志收集,链路监控等,请加关注!

相关推荐

探索Java项目中日志系统最佳实践:从入门到精通

探索Java项目中日志系统最佳实践:从入门到精通在现代软件开发中,日志系统如同一位默默无闻却至关重要的管家,它记录了程序运行中的各种事件,为我们排查问题、监控性能和优化系统提供了宝贵的依据。在Java...

用了这么多年的java日志框架,你真的弄懂了吗?

在项目开发过程中,有一个必不可少的环节就是记录日志,相信只要是个程序员都用过,可是咱们自问下,用了这么多年的日志框架,你确定自己真弄懂了日志框架的来龙去脉嘛?下面笔者就详细聊聊java中常用日志框架的...

物理老师教你学Java语言(中篇)(物理专业学编程)

第四章物质的基本结构——类与对象...

一文搞定!Spring Boot3 定时任务操作全攻略

各位互联网大厂的后端开发小伙伴们,在使用SpringBoot3开发项目时,你是否遇到过定时任务实现的难题呢?比如任务调度时间不准确,代码报错却找不到方向,是不是特别头疼?如今,随着互联网业务规模...

你还不懂java的日志系统吗 ?(java的日志类)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

谈谈枚举的新用法--java(java枚举的作用与好处)

问题的由来前段时间改游戏buff功能,干了一件愚蠢的事情,那就是把枚举和运算集合在一起,然后运行一段时间后buff就出现各种问题,我当时懵逼了!事情是这样的,做过游戏的都知道,buff,需要分类型,且...

你还不懂java的日志系统吗(javaw 日志)

一、背景在java的开发中,使用最多也绕不过去的一个话题就是日志,在程序中除了业务代码外,使用最多的就是打印日志。经常听到的这样一句话就是“打个日志调试下”,没错在日常的开发、调试过程中打印日志是常干...

Java 8之后的那些新特性(三):Java System Logger

去年12月份log4j日志框架的一个漏洞,给Java整个行业造成了非常大的影响。这个事情也顺带把log4j这个日志框架推到了争议的最前线。在Java领域,log4j可能相对比较流行。而在log4j之外...

Java开发中的日志管理:让程序“开口说话”

Java开发中的日志管理:让程序“开口说话”日志是程序员的朋友,也是程序的“嘴巴”。它能让程序在运行过程中“开口说话”,告诉我们它的状态、行为以及遇到的问题。在Java开发中,良好的日志管理不仅能帮助...

吊打面试官(十二)--Java语言中ArrayList类一文全掌握

导读...

OS X 效率启动器 Alfred 详解与使用技巧

问:为什么要在Mac上使用效率启动器类应用?答:在非特殊专业用户的环境下,(每天)用户一般可以在系统中进行上百次操作,可以是点击,也可以是拖拽,但这些只是过程,而我们的真正目的是想获得结果,也就是...

Java中 高级的异常处理(java中异常处理的两种方式)

介绍异常处理是软件开发的一个关键方面,尤其是在Java中,这种语言以其稳健性和平台独立性而闻名。正确的异常处理不仅可以防止应用程序崩溃,还有助于调试并向用户提供有意义的反馈。...

【性能调优】全方位教你定位慢SQL,方法介绍下!

1.使用数据库自带工具...

全面了解mysql锁机制(InnoDB)与问题排查

MySQL/InnoDB的加锁,一直是一个常见的话题。例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?下面是不同锁等级的区别表级锁:开销小,加锁快;不会出现死锁;锁定粒度...

看懂这篇文章,你就懂了数据库死锁产生的场景和解决方法

一、什么是死锁加锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。任何事务都需要获得相应对象上的锁才能访问数据,读取数据的事务通常只需要获得读锁(共享锁),修改数据的事务需要获...