• 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:opensourcegithubjmicro_demosexpjmicro.helloworld目录,运行如下命令

    mvn clean install -Dmaven.test.skip=true

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

    运行

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

    title expjmicro.helloworld.order
    java ^
    -Xbootclasspath/a:%MAVEN_RESP_HOME%orgjavassistjavassist3.24.0-GAjavassist-3.24.0-GA.jar ^
    -javaagent:%MAVEN_RESP_HOME%cnjmicrojmicro.agent0.0.3-RELEASEjmicro.agent-0.0.3-RELEASE.jar ^
    -jar  %MAVEN_RESP_HOME%cnexpjmicroexpjmicro.helloworld.order0.0.3-RELEASEexpjmicro.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网关,服务路由,高可用,分布式锁和分布式事务,日志收集,链路监控等,请加关注!

    如非授权,禁止用于商业用途,转载请注明出处
    作者:mynewworldyyl
    邮箱:mynewworldyyl@gmail.com
  • 相关阅读:
    python自动更新chromedriver与chrome兼容
    Python生成exe可执行文件
    windows下安装python 且 安装pip
    python运行的时候报错line 192, in _run_module_as_main return _run_code(code, main_globals, None 解决方案
    log4j2配置文件log4j2.xml
    log4j配置文件中的additivity属性
    Druid作连接池的数据库的主从动态切换
    Win10进入安全模式的方法
    Win10复制文件或是从网站另存图片提示“客户端没有所需的特权”怎么解决?
    druid添加log4j2
  • 原文地址:https://www.cnblogs.com/jmicro/p/14831868.html
Copyright © 2020-2023  润新知