发表于: 2017-12-11 23:33:32

1 587


今天做的事情:


                 修改了昨天日报的错误,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));
}


               控制台信息:


            



           

                                                                        总结一下:soasac

SOA,即service-oriented architecture,面向服务架构。是一种组件模型,或者说是一种思想,是将程序中不同的单元,或者说不同的服务通过良好的接口来连接起来。这种接口的定义可以实现松耦合,提升代码的灵活性,在项目部分内容需要修改的时候可以很好的适应。

SOA的用途:对 SOA 的需要来源于需要使业务 IT 系统变得更加灵活,以适应业务中的改变。通过允许强定义的关系和依然灵活的特定实现,IT 系统既可以利用现有系统的功能,又可以准备在以后做一些改变来满足它们之间交互的需要。

 

SACSCA是一个可执行的模型,用于将不同的 服务集成到一个业务解决方案。是为了实现soa的一种解决方案。


 

               


遇到的问题:


                如上,都解决了,不过,关于Tuscany的例子不多,而且大同小异



收获:


              学习了Tuscany,了解SOA,SCA是什么及作用,进行下一步。


             禅道:http://task.ptteng.com/zentao/my-task.html










返回列表 返回列表
评论

    分享到