java项目src下的dao_Java开发大型互联网-Dubbo项目拆分下踩坑的记录

引言

Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。

Dubbo项目拆分下踩坑的记录

autowired一个服务失败

服务引用配置,明明就已经声明了xxx的服务,但service bean通过autowried引用,总提示xxx不存在,原因是xxx 服务少了id的设置,查看官网文档,dubbo:reference表签,id属性为必填项。但dubbo启动时却没有发出警告,导致问题被隐含了。

超时(timeout)与重试机制(retires)

dubbo通过设置短的超时机制+重试次数,马上将当前超时服务提供者provider切换到其他可用的provider,通过这种思路实现快速响应。但对于一些新增记录的操作来说,有可能因为设定时间内,provider无法响应,客户端执行n次重试,导致新增记录操作的请求发了n次,数据库里这时候保存了n条记录数据。暂时解决方式是将那些响应时间相对旧一些的服务,它的超时时间设置长一点,并将重试次数retries设置为0

.

占用内存问题

内存满了以后常见影响:

  • A.导致接口异常(如数据请求失败)
  • B.导致程序启动国漫

项目拆由原来单一个应用(可以看成单一个provider)按照业务功能便捷,拆分成好几个provider, 但不是全部都拆了出来,还保留了一个原始比较大的provider。

基本上每个provider 至少占用100M 的内存,有的还会占用300M,对于原始provider 会用上500M内存!!!

也就是说比如原来单一个provider 跑程序可能占用 500M以上的内存,经过拆分若干过以后,就会变成 500M + ( 100M~300M ) * N。

我们这边服务器配置比较低,基本上要两台服务器才能把所有provider部署下来,不然全部部署同一个服务器,最后一个启动的provider有可能因为内存满了,而加载很慢,从而影响整个应用服务不能正常运作。

PS:内存相关检测工具提示 top命令、jmap命令、MAT(memory analyzer tool)工具。

3.多个Provider更新维护脚本

关键词 : svn + maven + shell

另外一点:由于拆分了好多个服务,所以如果要一次批量全部更新的话,要在linux上不断的cd 、 nohup java -jar ......

A.svn搭建

搭建一个专门用来 存放各个环境(如开发环境、测试环境)的运行目录所需要的程序,包括provider, web部署目录。

更新的时候,先本地把包提交到svn ,然后登上运行的服务器进行svn checkout。

PS:如果是生产环境的包就不能这样做,有可能需要新建一个目录然后checkout。

B.运行脚本startup.sh

为每一个provider 编写startup.sh 脚本:

! /bin/sh

jar=find . -iname "*.jar" -maxdepth 1

conf=pwd

conf=$conf/spring-config.xml

echo "using spring config file:$conf"

nohup java -Ddubbo.container=spring -Ddubbo.spring.config=spring-config.xml -jar $jar &

放在maven 项目 src, 即与main 、test目录同一级:

7d23ab5c2646fc5313f51f478275333e.png

现在有了每个provider 的startup.sh了,为了一件启动,所以还需要写一个总运行的脚本,

startup_all.sh :

! /bin/sh

echo 'please run this shell using command "source"'

echo "shell start...";

cur=pwd

modules=("providerA"

"providerB");

for module in ${modules[*]}; do

binpath="$module/bin/"

echo "$module starting..."

cd $cur;

temp=pwd

echo "cd $temp "

cd $binpath;

temp=pwd

echo "cd $temp"

./startup.sh;

done;

由于开发环境或测试环境服务器内存不够,有可能要将不同的provider部署到不同的服务器上,这时就要把startup_all.sh 文件拆分成两个文件来运行。

C.Maven 处理

自动将所有项目输出目录 指向同一个 目录下,目录结构例如

buildAll

buildAll/ProviderA

buildAll/ProviderB

只需要在pom文件 build标签中设定directory的值即可

cn-jufuns-residences-origin-provider

../../buildAll/${build.env}/${artifactId}

其中${build.env} 可选的值为dev 、test、 production,分别表示开发环境、测试环境、生产环境。由parent 项目(定义所有子项目的依赖)里的pom 文件定义。

另外由于maven 输出包含一些多余文件,所以我利用maven resources插件将需要的文件 或目录 ,如jar,lib目录,properties文件,shell文件,拷贝到输出目录底下的bin目录:

84fd9169d847d8339fff9549df8b1f88.png

maven 插件配置:

org.apache.maven.plugins

maven-resources-plugin

copy-resources

install

copy-resources

${build.directory}/bin

src/sh

*.*

src/main/resources/

*.*

${build.directory}

*.jar

lib

copy-lib

install

copy-resources

${build.directory}/bin/lib

${build.directory}/lib

*.*

这里要主要这个插件一定要放到最后,所以要注意下phase 这个值。

总结

以 上就是我对Java开发大型互联网-Dubbo项目拆分下踩坑的记录 问题及其优化总结,分享给大家,觉得收获的话可以点个关注收藏转发一波喔,谢谢大佬们支持!

最后,每一位读到这里的网友,感谢你们能耐心地看完。希望在成为一名更优秀的Java程序员的道路上,我们可以一起学习、一起进步!都能赢取白富美,走向架构师的人生巅峰!

想了解学习Java方面的技术内容以及Java技术视频的内容可加群:722040762 验证码:头条(06 必过)欢迎大家的加入哟!

7a84a149417cb2687a56f5d51bbe9de5.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值