发表于: 2017-09-09 22:12:57
1 756
一.今天完成的主要事情
1.完成任务八的深度思考
(1). 什么是rmi?为什么要使用rmi框架?
Rmi全称Remote Method Invocation,即远程方法调用.它是构建在TCP/IP协议上的一种远程调用方法.RMI采用stubs和skeletons来进行远程对象的通讯.远程方法调用是一种计算机之间对象互相调用对方方法,启动对方进程的一种机制,使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时使用的程序须发规则和本地机上对象间的方法调用的语法规则一样.使用web和service分离的设计,我们可以将web层需要使用的服务分布到不同的服务器以及不同的端口上,这样可以继续将service细分,这样便于使用模块化开发,需要更新某个服务时,不用修改整个项目,只要更新相应的服务模块即可,而又因为Rmi有支持面向对象,跨服务器,高效率通信,安全性高,分布更新代码方便等优点,所以在将web和service分离的时候,通常会使用rmi.但rmi也有一个局限,就是web和service必须是java语言编写,它是跨平台但不是跨语言的框架.
(2). 什么是SCA?什么是分布式?分布式有什么优点?
SCA全称Service Component Architecture,即服务组件框架.它是一种面向服务的架构的设计模型,是一种和语言无关的编程模型,它提供一种统一的调用方式,从而使客户可以把不同的组件类型通过一种标准的接口来封装和调用.
分布式就是一群独立计算机集合共同对外提供服务,但是对于系统的用户而言,就像是一台计算机在提供服务一样.简单来说就是在多台不同的服务器中部署不同的服务模块,通过远程调用,协同工作,对外提供服务.分布式的优点主要是降低耦合度,增删一个功能,不会影响其他功能的模块,所以对于团队可以更好的分配开发任务,各个小团队负责一个独立的模块,除此之外,分布式还有可伸缩性与容错性等优点.
(3). 为什么要把web和service分离?应用了哪些概念?
将web和service分离非常有助于模块化开发,可以将一个项目分割成不同的子模块,各个模块之间同时开发,开发完成之后在web中调用不同的模块的服务即可,而且,如果后续需要更新某个模块时,可以只修改该模块的内容,同时还可以根据版本号对各个模块进行管理,方便更新模块之后的调试.
2.搭建tuscany框架.
网上关于tuscany的例子并不多,从官网上下载sample例子,先编写hello world
首先,要编写接口,这个和spring rmi没有什么区别
然后在服务端的spring配置文件中创建对象,但是创建对象时要加上sca标签:
其次,编写helloService.composite配置文件,在文件中,通过implementation标签引用spring的配置文件
然后在test中调用组件服务
运行测试方法即可
可是在这里出现一个问题,即即使我的写法和官网提供的例子一模一样,但也还是报错,报错内容为
INFO - XmlBeanDefinitionReader - Loading XML bean definitions from URL [file:/D:/迅雷下载/tuscany-sca-2.0.1/samples/getting-started/test/target/classes/spring-tuscany.xml]
java.lang.AbstractMethodError: org.apache.tuscany.sca.implementation.spring.context.SCAParentApplicationContext.getEnvironment()Lorg/springframework/core/env/Environment;
at org.springframework.context.support.AbstractApplicationContext.setParent(AbstractApplicationContext.java:458)
at org.springframework.context.support.GenericApplicationContext.setParent(GenericApplicationContext.java:150)
重点是标粗的那一行,然后在网上查找一圈无果,浪费了不少时间,然后继续简化,使用官网提供的不用spring配置文件的纯java的方式,测试成功,然后说明问题时出在了spring配置文件上,接着修改配置文件,发现成功了,还没来得及高兴,突然想起来,刚才跑不同spring配置文件的时候将工程中的spring相关包全部注释掉了,那么注释掉之后为什么改为spring配置的方式还可以跑通呢,随后恍然大悟,是依赖冲突的关系.
通过查看依赖树(这时候显示出还是idea好)官网提供的例子中自带maven的依赖关系,其中有一个包中引用了spring的jar包
如图所示,就是这个依赖中引用的spring的jar包,但是它引用的版本是3.0.5的和项目中添加的4.3.10的包冲突,所以会报错
找到问题后想办法解决,先尝试排除该包中的依赖,但是发现不行,因为这个包只能引用3.0.5版本的spring核心包,没办法,只有将所有的spring包的版本都降为3.0.5,但是这时项目中又出现了错误,错误就是@Aspect面向切面注解不能使用,因为3.0.5版本的包中还没有该功能,最后尝试讲spring-aspect包使用4.3.10版本,其他使用3.0.5版本,终于成功了
通过今天的踩坑,了解到如果出现什么奇葩的错误,就可以从包冲突中入手,基本上八九不离十.
二.明天的计划
1.完成web和service的分离
2.开启两个服务,通过一个web访问两个服务
3.如果有时间,做负载均衡
三.遇到的问题
以上
四.收获
又踩了一个坑,通过解决问题,自己对tuscany的理解确实比一开始要深入一些
五.任务进度情况
暂无延期风险
评论