美文网首页java学习之路
Spring boot + dubbox +zookeeper项

Spring boot + dubbox +zookeeper项

作者: 唯有努力不欺人丶 | 来源:发表于2020-04-27 19:50 被阅读0次

其实这个是挺有意思的一件事。分布式框架,第一家公司用的dubbo,所以dubbo我是用过的(dubbo+zookeeper),第二家公司当时的技术指导要求使用cloud,所以cloud也有使用经验(当时是cloud+eureka+zuul)。但是巧就巧在!!!现在这家公司,即将做的项目,领导指名要用dubbox!
这不是巧了么,虽然没有过大量数据,高并发,也没有遇到微服务的实际问题(因为之前两家做出来的东西现在估计上线了也没啥用户,大家都懂的这种状态,具体用起来有什么后遗症啥的完全不知道。尤其是第二家公司好像那个产品到现在也没上线。什么熔断之类的我倒是正常设置了,但是也不知道有没有用)但是这几个通用的微服务架构我倒是用了个全。

ps:我电脑是windows 10系统

dubbo和dubbox

当时领导让我用dubbox我就去百度了,其实也没啥,就是当当网对dubbo的另一层封装。当然了关于dubbo停止开发的背景感兴趣的可以去查查,我反正是吃了好大一个瓜。毕竟现在网友想象力贼丰富,不知道真假反正是觉得挺有意思。
好了,回归正题,说dubbox。
我先附上两个官网:

dubbo官网(现在属于阿帕奇):http://dubbo.apache.org/en-us/
dubbox官网(这个是git上的项目,也没官网):https://github.com/dangdangdotcom/dubbox

我这里只会简单说下我的理解啊,或者说官方说法的一部分,写的肯定没有人家的介绍详细,所以如果真的想要好好了解还是建议自己去官网看。我反正用谷歌浏览器翻译成中文,感觉大多数都能看懂的,英文渣的我只能这样学习,如果能直接看懂英文文档那更好不过了。。
其实简单的说,就是我第一句说的,dubbox只不过是在dubbo基础上做了一层封装使得其功能更加方便使用者。并且修改了一些bug。另外dubbo因为长时间没人维护所以支持的spring版本较低,dubbox改善了这一点。剩下还有一些较为方便的工具类的封装。下面是dubbox官网的介绍:


  • 支持REST风格远程调用(HTTP + JSON/XML):基于非常成熟的JBoss RestEasy框架,在dubbo中实现了REST风格(HTTP + JSON/XML)的远程调用,以显著简化企业内部的跨语言交互,同时显著简化企业对外的Open API、无线API甚至AJAX服务端等等的开发。事实上,这个REST调用也使得Dubbo可以对当今特别流行的“微服务”架构提供基础性支持。 另外,REST调用也达到了比较高的性能,在基准测试下,HTTP + JSON与Dubbo 2.x默认的RPC协议(即TCP + Hessian2二进制序列化)之间只有1.5倍左右的差距,详见文档中的基准测试报告。

  • 支持基于Kryo和FST的Java高效序列化实现:基于当今比较知名的KryoFST高性能序列化库,为Dubbo默认的RPC协议添加新的序列化实现,并优化调整了其序列化体系,比较显著的提高了Dubbo RPC的性能,详见文档中的基准测试报告。

  • 支持基于Jackson的JSON序列化:基于业界应用最广泛的Jackson序列化库,为Dubbo默认的RPC协议添加新的JSON序列化实现。

  • 支持基于嵌入式Tomcat的HTTP remoting体系:基于嵌入式tomcat实现dubbo的HTTP remoting体系(即dubbo-remoting-http),用以逐步取代Dubbo中旧版本的嵌入式Jetty,可以显著的提高REST等的远程调用性能,并将Servlet API的支持从2.5升级到3.1。(注:除了REST,dubbo中的WebServices、Hessian、HTTP Invoker等协议都基于这个HTTP remoting体系)。

  • 升级Spring:将dubbo中Spring由2.x升级到目前最常用的3.x版本,减少版本冲突带来的麻烦。

  • 升级ZooKeeper客户端:将dubbo中的zookeeper客户端升级到最新的版本,以修正老版本中包含的bug。

  • 支持完全基于Java代码的Dubbo配置:基于Spring的Java Config,实现完全无XML的纯Java代码方式来配置dubbo

  • 调整Demo应用:暂时将dubbo的demo应用调整并改写以主要演示REST功能、Dubbo协议的新序列化方式、基于Java代码的Spring配置等等。

  • 修正了dubbo的bug 包括配置、序列化、管理界面等等的bug。

注:dubbox和dubbo 2.x是兼容的,没有改变dubbo的任何已有的功能和配置方式(除了升级了spring之类的版本)


对了,额外说一下,maven库中是没有dubbox的依赖的,所以用dubbox是要自己去下载的。
另外这个项目的注册中心我打算用zookeeper。毕竟以前用过dubbo+zookeeper。下面就是具体的搭建及使用。

dubbox环境搭建

上面说了,我是要用zookeeper做注册中心,所以zookeeper的安装下载是必不可少的部分。另外因为我是windows系统,所以从头到尾都讲述windows的操作,linux的就不说了,省的乱。其实这种教程网上很多,我这里也只不过是为了一个整理。

zookeeper下载安装启动
  1. 去官网下载:https://zookeeper.apache.org/releases.html
    这里有个小建议,也是我个人从别人那里获得的经验之传:一般不要下载最新版本的,因为容易有bug啥的,反正这个我是下载3.4.14的。直接点击就会下载。

    选择你喜欢的版本
  2. 解压并更改配置


    如图,解压

    然后加压后再目录中添加两个文件夹:data,logs(其实这里logs有人直接叫log,这都没问题,只要保证配置的和文件夹名字一样就行了)


    添加data和logs
    将zoo_sample.cfg复制粘贴,重命名zoo.cfg,这里也有人说删除那个sample.cfg
    就行,也有人说原地改名字。不过我本着能不删就不删的原则留着原来的那个了,然后在这个自己创建的zoo.cfg中改配置。
    创建zoo.cfg

    这两个地址就是之前创建的文件夹的名字。注意要一致。另外比如端口啊,心跳啊,还有断开连接时间什么的都可以设置,其实这个参数不多,而且我觉得属性名字挺好理解的,感兴趣的自己去看看配置。
    注意下这里的配置不是针对用户注册的那个客户端的,而且zookeeper集群的配置。还有这两个initLimit和syncLimit,数值代表个数,单位是tickTime。而且是zookeeper集群中就是比如图中默认断连是10.也就是10个心跳时间(10*2000)没有接收到客户端(Zookeeper 服务器集群中连接到 Leader 的 Follower 服务器)传来的消息,那么表明这个客户端连接失败。


    添加两个地址
  3. 启动
    双击运行bin目录下的zkServer.cmd(再次说明!我是windows系统)


    启动

至此,zookeeper的下载,安装,启动就完成了。正常启动后有有一个窗口显示实时情况的。正常操作下来不存在启动不成功的情况(我没遇到过),不过如果有问题建议可以看看错误信息。

tomcat的下载配置环境

这个也是个坑,因为我电脑上居然没有tomcat!!!不得不承认spring boot用惯了的我简直是个废人了。反正tomcat也是我这次做准备的时候下载的,所以也列出来(感觉我这样的情况不会很多)。

  1. tomcat官网下载喜欢的版本https://tomcat.apache.org/
    官网选择喜欢的版本下载
    这个我很果断了下载了最新版tomcat10,然后我的电脑是64windows,所以选择了对应的版本下载。
  2. 解压。


    image.png
  3. 环境变量问题
    找到bin目录下的 startup.bat 文件。
    打开后如果存在
 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome  

则表示 bin 目录下存在 catalina.bat文件即可访问tomcat页面(启动服务器后),
此时不需要配置环境变量。
双击startup.bat文件, 在浏览器中输入 http://localhost:8080/, 若能进入页面,则成功。
若进不去网址,则需要手动配置环境变量。
CATALINA_HOME:Tomcat的安装路径。 比如: D:\apache-tomcat
PATH:一些命令所在的路径。 比如:D:\apache-tomcat\bin
启动的话我习惯双击startup.bat启动。但是应该也可以cmd命令启动,大多数人这个应该都会,我就不墨迹了。

访问到这个页面说明你成功了!
至此,tomcat也完成了。
这里插个小问题,反正我的tomcat启动以后控制台是中文乱码了。解决办法就是把conf下的logging.preperties中所有的utf-8用GBK替换。不过我网上看了还有别的解决办法,可能出现乱码的原因不同,如果这样你解决不了你的乱码问题那就去百度吧。
解决乱码的办法
maven下载及环境的配置

这里有个问题,其实我之前电脑上因为都是用编译器工作,所以还真就没maven环境配置搭建。但是因为这个dubbox下载出来的不再maven库,所以要手动加入,所以我这里按照教程一步步配置了下maven环境。

  1. 下载http://maven.apache.org/
    上面附上的是官网的地址,进入点download,然后我直接下的maven3.6.3
  2. 配置环境变量
    这个怎么说呢,老一套,首先变量名为maven_home,变量值为maven的所在地址。然后path中添加到maven的bin的路径。然后确定就行了。
    新打开一个cmd,然后输入mvn -version。和我一样说明配置完成了。


    配置成功
dubbox的下载
  1. 我最开始就说了,现有的maven库是没有dubbox的依赖的,所以使用的话只能自己下载。首先去git上下载。
    这个下载地址上面提到过,这里再粘贴一下:https://github.com/dangdangdotcom/dubbox
    进去以后直接下载压缩包:
    下载dubbox压缩包
  2. 解压压缩包


    解压后的页面
  3. 用maven编译文件
    因为这个其实是把好多个项目打包,所以比较慢。然后maven命令如下:
mvn install -f D:\dubbox\dubbox-master\pom.xml  -D maven.test.skip=true

上面的命令-D那个是 不执行测试用例,也不编译测试用例类。(因为我不懂特意百度的。)前面的 -f是强制使用指定pom文件。
额,说个题外话,因为一般打包都是在编译器(idea,eclipse里面打包,所以直接控制台打包还蛮新鲜的,刚刚查了下指令参数)

maven命令参数
在此感谢整理这个的大大,我顺便附上链接地址:
maven命令参数整理

(这个打包还挺慢的,我在这一边打包一遍看帖子,预测到以后会遇到不少坑了。)
一点不夸张,我打包用了18分钟。。。


打包成功!

然后打包完毕下一步。把dubbo-admin这个war包放到tomcat的webapps下面。(正常打包出来的都带着版本号,是dubbo-admin-2.8.4.我看所有的教程上都说改名字,所以我也改了下,改成dubbo-admin)
这里还有个题外话,我之前下载的是tomcat10.然后dubbo-admin运行总是起不来。。后来查了原因可能是tomcat版本问题,因为是人家的源码又不好改,所以只能选择改tomcat了,所以我最后跑起来是用tomcat8跑的。
如下截图:


war改名字放到tomcat的webapps下
注意我的tomcat版本是8

然后返回tomcat的bin中,startup.bat启动tomcat:


启动成功!我端口改成9090了,在tomcat的配置文件中改

然后我直接网址是localhost:9090/dubbo-admin:


运行成功后需要登录。

默认账号密码都是root,所以我直接登录:


进入到注册中心页
反正到这一个基本的服务注册我觉得是完成了,接下来只要自己去创建服务者消费者什么的,然后注册到这个注册中心,并实现调用。
在这其实正常来讲什么提供者消费者啥的还要根据业务划分模块,做公共引用啥的,比如之前看过一个教程视频是把所有的实体类和dao层还有一些通用的工具类封装成一个公共的引用包。不过我这边要怎么实现还没想好,现在也在纠结,不过这块其实和dubbox啥的没关系了。起码不是技术上的联系,所以我打算只是简单的写两个提供者消费者注册一下,看能不能实现就行了。接下来我要去写各种伪代码了。

框架搭建与实现

过了一个周末了,然后这个基本上的dubbo之间的相互调用什么的是ok了的。我从头整理一下然后一步一步列出来,另外真的这个流程贼感谢一个好友的帮助,中间还有远程帮忙啥的。反正好人一生平安吧。然后其实前期的都算是准备工作,下面的是真正的demo(说是demo是因为好多东西都没做完,我只是实现了一个简单的消费者提供者api啥的基本功能。不涉及业务逻辑)

  • 第一步:启动zookeeper注册中心

上面我们zookeeper安装启动都是跑过的了。这里就是一个启动:
双击zookeeper的bin目录下的zkServer.cmd


启动zookeeper
  • 启动dubbo-admin启动

上面的教程也有如何dubbo-admin下载打成war包,放到tomcat中,这里就是启动tomcat:


dubbo-admin放到tomcat的webapps下
双击tomcat的bin目录下的startup.bat

正常启动dubbo-admin后,网页访问ip+端口:dubbo-admin是可以访问到dubbo的管理页面的


dubbo-admin启动成功
  • 实现提供者,消费者,api等

说到这还不得不说一下微服务的概念。就是服务之间的解耦与并行开发。我们项目是个电商项目。又是我之前提到的帮了我很多的那个朋友随口说了几个电商项目的分模块的可分项,比如用户模块,订单模块,商品模块等。然后还有一些关于dubbo微服务拆分之类的知识。不过这些细碎又杂乱。我这里先把简单的使用方法写出来,最后会记录一些我个人的使用微服务的思路(个人色彩比较浓,然后正不正确也不是算术一样对就是对不对就是不对,所以仅供参考,哪怕我写错了也不要喷我呀)。
然后这种项目一般是用父子项目类型来做。我个人感觉是为了项目之间项目依赖方便。还有就是引入依赖的版本统一管理。反正我这里也是用的这个(ps:这个项目也是别人搭的我用的现成的)。
我先截个图说明下项目结构:


反正挺丑的

然后这里简单说下:

  • api是这个模块中所有的接口,也就是service层。
  • provider是这个模块中方法的具体实现的,相当于serviceImpl。(那个朋友告诉我说实体和dao层也会在这里,不过我也看到一种做法是所有的dao和实体放到一个公共引用里。)
  • consumer是这个模块中对外的接口,就是前端能访问的。也就是controller层。
    反正其实还是经典的三层结构,只不过是把每一层变成了每一个项目。
    然后消费者和提供者之间的引用要用api来调用。下面是简单的测试代码:
    首先是api模块,这里我之前简单说了,就是一个接口。所以这个是最简单的,也没啥配置,也没啥依赖,简简单单写个接口就行了,下面是截图:


    api

    其次是提供者。毕竟先实现再调用。然后在pom中引入api的依赖。我觉得父子项目最好的点就是这个依赖的引用好方便。我之前一直以为要编译好然后把jar包放到lib下呢。我顺便附上这块需要的依赖:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>order-service</artifactId>
        <groupId>com.lsj</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>order-provider</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>com.lsj</groupId>
            <artifactId>order-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.spring.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>1.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.5.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
</project>

如上。spring boot start,spring boot web不说了。剩下的因为我这还没业务逻辑,所以只引用了dubbox和zookeeper所需要的依赖。另外最上面那个api就是我自己定义的api模块。我是觉得很方便,也都是实时的。
另外附上我的配置(没有任何数据库,redis和业务中需要的配置,暂时是最简版的):

server.port =8902
spring.dubbo.port=20802
spring.dubbo.protocol=dubbo

spring.dubbo.appname=provider
spring.dubbo.registry=zookeeper://192.168.10.201:2181

如上,只是定义了注册中心地址和自己的名字还有端口啥的。
准备工作都做完了,开始实现api中接口的方法:


实现api中的方法

如图所示,其实就是把api中的接口当做一个普通接口来实现就好了。注意一下这里有个注解比较特殊。是dubbo中的注解:@Service()然后参数就是实现的那个接口的名字。其实感觉跟spring的service是差不多的,只不过因为这个不是在一个项目中,所以要用dubbo的注解。让我们能通过接口找到实现。
最后一步在启动类上加个注释:@EnableDubboConfiguration
然后启动项目。
正常情况下现在在看我们的注册中心,是应该有变化的了。

提供者注册成功!

然后是消费者,首先依赖大同小异,因为要引用api所以肯定把api引入依赖的。其次配置文件也是大同小异,注册中心啥的一样一样的。这里注意端口啥的别重复了就行。
然后具体的代码就简单的多。这个项目主要是对外暴露接口,所以只需要一个controller类。我直接截图:

消费者实现
这里注意用到了一个注释@Reference。也是dubbo包里的。然后作用可能就是通过之前咱们在提供者的实现类上那个Service的注释,找到具体方法的实现(这个是我瞎猜的)。然后这个启动类上也要加注解@EnableDubboConfiguration,然后启动就完事了。
这个时候看我们的注册中心,消费者是不是也增加了:
消费者注册成功!

到了这里,我们的服务提供者,消费者都正常注册了。接下来可以测试一下远程调用。不过因为我做的是最简单的demo、感觉没用调用不成功的可能。

测试结果,rpc调用成功!
注意看,我访问的是消费者提供的接口,然后正常获取到了提供者中的数据(这个测试成功是写在provider的方法实现中的)。因为我本地是都在一台电脑上启动所以可能感触不深。但是如果这个换成多台电脑,那么这个其实就是很好理解的远程调用。不同于平时用的jar,sdk引用啥的。其实大家仔细想想,我们的消费者从头到尾都没有直接依赖于提供者,消费者也看不到提供者的源码。
其实看了好多资料,甚至以前也用cloud做过项目,但是这次的学习dubbox让我对微服务有了更加深刻的认识。以前觉得微服务就是服务的拆分,解耦,单纯的减少服务器压力什么的,但是现在觉得更是一种适合多人协同开发,保护代码安全的选择。反正也不知道我说的对不对。暂时这个就是我这几天的理解。
然后本来我是想着把拆分项目的思路,依据,心路历程甚至最终结果都整理出来(不涉及项目的隐私,只是一些想法上的东西)。但是现在觉得这个是随着对业务的理解,分析,设计才能一点点构思完善的,甚至可能有各种坑,做出各种错误的设计。所以我决定那个等日后项目完全做出来再总结。这个先到这里吧。
这篇笔记就到这里,如果稍微帮到你了记得点个喜欢点个关注。另外最近几个月都会用dubbox做个项目,有同样经历或者也是在做微服务的小伙伴可以私聊或者留言或者加入下面的群里共通交流,一起爬坑。

java技术交流群:130031711,欢迎各位萌新大佬踊跃加入,探讨技术上的问题~!

相关文章

网友评论

    本文标题:Spring boot + dubbox +zookeeper项

    本文链接:https://www.haomeiwen.com/subject/jkarihtx.html