发表于: 2017-12-11 23:33:32
1 588
今天做的事情:
修改了昨天日报的错误,Calculator.composite文件,虽然有点显示txt文档。经过测试,是可以被解析的。更改了jar包。也都可以实现。
三个jar包
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-base-runtime</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-binding-rmi-runtime</artifactId>
<version>2.0.1</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-spring-runtime</artifactId>
<version>2.0.1</version>
</dependency>
出错点在于这个regerence的引用
<reference name="addI" target="AddComponent"/>
在这个CalculatorImpl实现类中,private增加的接口,addI , 而在配置文件引用的是add。所以一直没有跑通。
成功信息:
Add 的终端 - 具有约束力的sca - add的组件 / add的实现类。
在做rmi的时,也是先在xml中引用一个实现类,作为service,在参数加上这个实现类的internace,而Tuscany中,都是实现类起作用。
在这个基础上,加了一个减法的实现。步骤如下:
1.减法的接口,和一个做减法的方法
2.实现这个接口
3.在计算的类中,private减法接口,set,get方法
4.在配置文件中,加上减法实现的组件,在总的组件中引用。
5.运行
配置文件:
<component name="CalculatorServiceComponent">
<implementation.java class="com.jnshu.tuscany.CalculatorImpl" />
<reference name="addI" target="AddComponent"/>
<reference name="subtractionI" target="Subtracation"/>
</component>
以上只是在本地进行装配,并没有将计算类作为服务发布出去,下面将其作为服务发布出去,只需要暴露一个host、port、serviceName就可以。
在配置文件里加入:
<service name="ICalculator">
<interface.java interface="com.jnshu.tuscany.ICalculator"/>
<tuscany:binding.rmi uri="rmi://127.0.0.1:8099/CalculatorRMIService"/>
</service>
name不能随便起
而且必须在计算类中加入 @Remotable
才能启动成功。
客户端:
以上是在一个项目里测试的。下午尝试在两个项目测试。
遇到的问题是,服务开启了。客户端连接不上,显示host问题,但是并没有问题,要不是我之前成功测试了一次,就又掉坑里了。
public class StartService {
public static void main(String[] args) {
Node node = NodeFactory.newInstance().createNode(
"Calculator.composite");
node.start();
System.out.println("service启动");
// ICalculator c = node.getService(CalculatorImpl.class,
// "CalculatorServiceComponent");
// System.out.println(c.add(2, 2));
//
// System.out.println(c.subtration(4,2));
}
@Test
public void startServer(){
Node node = NodeFactory.newInstance().createNode(
"Calculator.composite");
node.start();
System.out.println("service启动");
}
}
在main函数里面启动服务,客户端才能调用。切记切记,不要在测试方法里面。切记切记
Service和Reference是Component和外界交互的接口。和Spring一样,SCA中都是针对接口编程的,叫法在业务上有一个不同。虽然两大平台都是针对接口,但SCA在逻辑层称向外和向内的接口为“服务”。
Service是这个Composite提供给其他Composite。
Reference是这个Composite使用其他Composite。
而具体的协议就是依靠其中定义的Binding实现的,binging的协议囊括了各种同步、异步的类型。这就是SCA倡导的“服务型架构”。它实现了:实现和接口的分离!
1.定义域:
域是服务之间的划分范围,不同的服务使用的范围要受到限制。有的服务只可以在域内应用,有的则可跨域操作。
简单例子后,我们知道了,我们可以直接调用使用component的实现,而服务是启动域时或启动节点发布,node就是节点
Node node = NodeFactory.newInstance().createNode(
"Calculator.composite");
node.start();
System.out.println("service启动");
2:binging 绑定:
3. reference 引用:
适用于一个组件引用其他组件处理;
XML : reference标签:
属性: 1.name (必须) – 变量名,必须与类的变量名相同
说明: <reference name="reture" target="EchoReture">
private EchoReture reture = null; // 两处名称必须相同;
2.promote (compusite层时必须) –指定相关的组件实现;
3.target(可选) – 被引用的组件名字 - 组件名/服务名,声明此属性,则是在同compusite调用;
子标签: 1.binding(选定) - 绑定调用的接口或服务,用于调用不再一个域内的服务;
2.interface(选定) - 引用接口,暂时只在回调时用到,其他用处不详
@Reference : 属性: name(可选的) — 注入变量名,默认为Java类的数据成员名;
required(可选的) — 是否必须注入服务。默认为true;
将加减乘除完善:原来官网就是这个例子。。
客户端:
public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
ICalculator c = (ICalculator) Naming.lookup("//127.0.0.1:8199/CalculatorRMIService");
double i = 10;
double j = 10;
System.err.println("n1 为:"+i+"\t n2 为 :"+j);
System.out.println("n1 + n2 = "+c.add(10,10));
System.out.println("n1 / n2 = "+c.divide(10,10));
System.out.println("n1 * n2 = "+c.multiply(10,10));
System.out.println("n1 - n2 = "+c.subtration(10,10));
}
控制台信息:
总结一下:soa,sac
SOA,即service-oriented architecture,面向服务架构。是一种组件模型,或者说是一种思想,是将程序中不同的单元,或者说不同的服务通过良好的接口来连接起来。这种接口的定义可以实现松耦合,提升代码的灵活性,在项目部分内容需要修改的时候可以很好的适应。
SOA的用途:对 SOA 的需要来源于需要使业务 IT 系统变得更加灵活,以适应业务中的改变。通过允许强定义的关系和依然灵活的特定实现,IT 系统既可以利用现有系统的功能,又可以准备在以后做一些改变来满足它们之间交互的需要。
SAC:SCA是一个可执行的模型,用于将不同的 服务集成到一个业务解决方案。是为了实现soa的一种解决方案。
遇到的问题:
如上,都解决了,不过,关于Tuscany的例子不多,而且大同小异
收获:
学习了Tuscany,了解SOA,SCA是什么及作用,进行下一步。
禅道:http://task.ptteng.com/zentao/my-task.html
评论