03、Dubbo实战:Gradle打包可运行jar

学习快乐吗??!!这居然也能成为一个问题,明确答复:学习不快乐,还不如来一场Dota、一局王者欢乐,那还为啥学习啊,因为我想进步!让人进步的往往是痛苦的,纵观人类史,也成立。

现在的项目打包,一种是war,一种是jar,区别在哪?war包我想大家不陌生,代表了一个Web应用程序,它可以包含 Servlet、HTML页面、Java类、图像文件,放到容器比如三脚猫(tomcat)中,就能自解压运行,jar只是一个压缩归档文件,一些编译好的class文件和一些描述文件,运行有JRE环境即可,今天来玩一把Gradle打包,看似简单,还是有点上头的感觉。

目标:实现consumer从zk获取服务列表;使用zkClient获取某个服务的列表 ;能将项目打包为可运行jar

难度:新手--战士--老兵--将军

准备:idea2019.02 / ZK3.4.12 / Gradle5.4.1 /JDK11

步骤:

1、 为了紧跟时代,升级了JDK,注意一点,如果原来的JDK使用exe安装的,必须要卸载掉,否则即使配置环境变量,JDK11也无效;

*

2、 idea设置JDK,;

*

gradle的JVM也要设置,然后refresh下项目即可,

*

3、 项目整体架构不变,三个模块common/provider/consumer;

为啥将这个接口单独放common里?因为dubbo中生产者和消费者都要使用到这个interface,都要依赖这个公共模块,如果放某个业务模块里,容易造成“循环依赖”,程序报错,所以对于需要做RPC的接口,尽量放公共模块。

*

4、 引入zklcient依赖:;

compile group: 'com.101tec', name: 'zkclient', version: '0.11'

5、 写controller层,顺带学习下lamda表达式,非常简洁,这里使用了两种方式,当然,也可以使用iterator或listIterator循环输出;

*

6、 测试:http://localhost:8082/oneService;

就可以看到GreetingService服务的生产者有哪些了:

*

测试:http://localhost:8082/method

可以看到zk中“/dubbo”路径下的子路径了,

*

以上只是zkClient的两个例子,还有读数据readData(path),写数据writeData(path),删除节点delete(path),判断存在exist(path)等,具体可参阅API,通俗讲,zkClient就是操作zk的API方法集。

7、 打包:;

关键就是build.gradle文件,打包jar,应注意区别,一是供别的项目或模块引用,jar包内容结构如下:直接从顶级包名"com"开始,

*

直到某个具体的class文件,

*

所以别的地方可以引用:

import com.example.common.api.GreetingService;

二是可运行的,jar包内容结构如下:

*

顺带说一下,如果是maven项目,build指定下插件即可生成不同的jar:pom.xml的build标签下指定不同的build插件即可:

spring-boot-maven-plugin

maven-jar-plugin

8、 打包过程,build.gradle文件是核心,以consumer中的为例:;

buildscript:即是说明build的环境,

ext:缺省附加属性扩展依赖

/*default extra properties extension */

repositories和dependencies不解释

*

以下是插件引入,gradle2.1版本之后,使用{ }方式,之前的使用 apply plugin:方式,这里引入java、idea,才有了jar、build等各种操作指令。

*

jar{ } ,必须有,指定jar内main函数入口,这里是provider中的build.gradle,

*

sourceSets{ }指定java主目录和test主目录:

*

9、 provider模块下,先clean,再build:;

*

最后的成品:build目录的libs下,

*

10、 到jar包目录,按住shift键,右键进入powershell,运行命令:;

java -jar --server.port=XXX --dubbo.protocol.port=XXXXXX

注意每个jar的端口不能相同,否则会提示端口无法bind,

这样就成功启动了同一service的两个提供者了!也可启动更多个,将来组成集群模式,做负载均衡。

*

*

11、 使用consumer模块的zkClient可以看到多个provider的实时信息注意如果有提示端口冲突,可适当修改服务的端口我这里改为了8085:;

*

12、 源码地址:其中的day03;

https://github.com/xiexiaobiao/dubbo-project.git

后记:

1、 gradle如何生成两种不同的jar:“build”即生成可运行的jar,“jar”即生成可引用的jar,;
2、 jdk11下载,有两个版本,exe和zip压缩版,建议zip压缩版,这样能避免一些安装产生的异常,JDK11没有JRE了,;