发表于: 2017-12-19 11:05:41

1 631



今天完成的事

【学习使用git】

CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢?


Git是什么?

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

Git有什么特点?简单来说就是:高端大气上档次!

那什么是版本控制系统?


创建一个仓库。



仓库放入一个新文件。

并且提交。



修改文件。

并检查修改并且提交。


同步我的远程库



可以看到这是一个java界冉冉升起的新星。




【配置RMI】

配了配。搞定。


<bean id="studentServiceRmi" class="org.springframework.remoting.rmi.RmiServiceExporter">
   <!--服务物件-->
   <property name="service">
       <ref bean="studentService"/>
   </property>
   <!--服务名称-->
   <property name="serviceName">
       <value>studentService</value>
   </property>
   <!--代理介面-->
   <property name="serviceInterface">
       <value>service.StudentService</value>
   </property>
   <!--设置注册端口-->
   <property name="registryPort" value="9999"/>
   <!--设置服务端口-->
   <property name="servicePort" value="9999"/>
</bean>

<bean id="featureServiceRmi" class="org.springframework.remoting.rmi.RmiServiceExporter">
   <!--服务物件-->
   <property name="service">
       <ref bean="featureService"/>
   </property>
   <!--服务名称-->
   <property name="serviceName">
       <value>featureService</value>
   </property>
   <!--代理介面-->
   <property name="serviceInterface">
       <value>service.FeatureService</value>
   </property>
   <!--设置注册端口-->
   <property name="registryPort" value="9999"/>
   <!--设置服务端口-->
   <property name="servicePort" value="9999"/>
</bean>
<bean id="professionServiceRmi" class="org.springframework.remoting.rmi.RmiServiceExporter">
   <!--服务物件-->
   <property name="service">
       <ref bean="professionService"/>
   </property>
   <!--服务名称-->
   <property name="serviceName">
       <value>professionService</value>
   </property>
   <!--代理介面-->
   <property name="serviceInterface">
       <value>service.ProfessionService</value>
   </property>
   <!--设置注册端口-->
   <property name="registryPort" value="9999"/>
   <!--设置服务端口-->
   <property name="servicePort" value="9999"/>
</bean>
<bean id="userServiceRmi" class="org.springframework.remoting.rmi.RmiServiceExporter">
   <!--服务物件-->
   <property name="service">
       <ref bean="userService"/>
   </property>
   <!--服务名称-->
   <property name="serviceName">
       <value>userService</value>
   </property>
   <!--代理介面-->
   <property name="serviceInterface">
       <value>service.UserService</value>
   </property>
   <!--设置注册端口-->
   <property name="registryPort" value="9999"/>
   <!--设置服务端口-->
   <property name="servicePort" value="9999"/>
</bean>
<bean id="studentService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean" >
   <property name="serviceUrl" value="rmi://127.0.0.1:9999/studentService"/>
   <property name="serviceInterface"  value="service.StudentService"/>
</bean>

<bean id="featureService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
   <property name="serviceUrl" value="rmi://127.0.0.1:9999/featureService"/>
   <property name="serviceInterface" value="service.FeatureService"/>
</bean>

<bean id="professionService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
   <property name="serviceUrl" value="rmi://127.0.0.1:9999/professionService"/>
   <property name="serviceInterface" value="service.ProfessionService"/>
</bean>
<bean id="userService" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
   <property name="serviceUrl" value="rmi://127.0.0.1:9999/userService"/>
   <property name="serviceInterface" value="service.UserService"/>
</bean>


大致的理解和dubbo差不多。

主要还是将服务层和客户端分开。

一个知识点


  为什么要声明两个端口? Spring RMI会占用两个端口?

我赶脚。
Spring RMI 有两个端口,一个是注册端口(默认为1099),还有一个是数据传输端口,如果不指定,数据传输端口是随机分配的。

负载均衡还没做,准备明天用dubbo来实现一波。还要借一下别人的服务器。难受啊兄dei~





【学习了一下tuscany】


SCA 的基本概念以及 SCA 规范的具体内容并不在本文的范畴之内,有兴趣的读者可以通过一些相关文档了解相关内容,这也是阅读本文的基础。下面本文首先对 Tuscany 框架做一定的介绍。

Tuscany 是 Apache 的开源项目,它是 IBM、Oracle、SAP 等厂商联合成立的 SOA 标准化组织 -OSOA 支持下开发出的 SCA 框架,它既是开源界 SCA 的试金石,也是当前开源界最成熟的 SCA 框架之一。

tuscany是一套开源的sca框架模型,是做soa的基础架构

SCA是什么?

SCA为构建基于SOA的应用和解决方案提供了编程模型。它基于这样的理念:将业务功能作为一系列的服务而提供,并由这一系列的服务组装起来的解决方案来满足特定业务需求。这些组合的应用既包括为应用而新创建的特定服务,也包括源自已已存在系统和应用的业务逻辑,这些业务逻辑作为组合构件的一部分被复用。SCA既为服务的组合也为服务构件的创建提供了模型,包括对SCA组组合构件中对已存在应用功能的复用。

SCA的基础工件就是component,它是SCA的构成单元。构件(component)由一个实现的可配置(implementation)实例所组成。在该构件中,实现是提供业务功能的程序代码片段。该业务功能作为服务(service)而提供,为其他构件所使用。实现也许依赖于由其他构件所提供的服务,这些依赖被称作”引用”(reference)。实现可以有一个可设置的属性(properties),该属性是可以影响业务功能操作的数据值。构件通过提供属性值和连线(wire)到由其他构件提供服务的引用来配置实现。

 

还是通过实例来看一下SCA到底实现了什么样的功能吧!

看一下发布一个基本的加减乘除的示例,这个是tuscany的官方示例


Tuscany 是 Apache 的开源项目,它是 IBM、Oracle、SAP 等厂商联合成立的 SOA 标准化组织 -OSOA 支持下开发出的 SCA 框架,它既是开源界 SCA 的试金石,也是当前开源界最成熟的 SCA 框架之一。


tuscany是一套开源的sca框架模型,是做soa的基础架构。


但是他的版本只更新到2002年,但是因为公司在用,没办法,跑了一个demo。


这里我更新到了我的私人博客。

排版看着不舒服请点击下面的链接。


http://blog.csdn.net/gaomind/article/details/78848682

开发环境

idea 2017.1.1  maven3.3.9  Java1.8  Tuscany 2.0.1(经测试Java1.6可以)


目录结构

我实现的是一个计算器的小demo(官网的小例子)
所需依赖
<dependencies>
   <!--https://mvnrepository.com/artifact/org.apache.tuscany.sca/tuscany-base-runtime-->
   <dependency>
       <groupId>org.apache.tuscany.sca</groupId>
       <artifactId>tuscany-base-runtime</artifactId>
       <version>2.0.1</version>
   </dependency>
   <!-- https://mvnrepository.com/artifact/org.apache.tuscany.sca.aggregation/tuscany-binding-rmi-runtime-aggregation -->
   <dependency>
       <groupId>org.apache.tuscany.sca.aggregation</groupId>
       <artifactId>tuscany-binding-rmi-runtime-aggregation</artifactId>
       <version>2.0.1</version>
   </dependency>
   <!-- https://mvnrepository.com/artifact/org.apache.tuscany.sca.aggregation/tuscany-binding-ws-runtime-axis2-aggregation -->
   <dependency>
       <groupId>org.apache.tuscany.sca.aggregation</groupId>
       <artifactId>tuscany-binding-ws-runtime-axis2-aggregation</artifactId>
       <version>2.0.1</version>
   </dependency>
</dependencies>


加减乘除的方法都是写在接口里。


addInterface.class

/**
* Created by ${MIND-ZR} on 2017/12/19.
*/
public interface addInterface {
public double add(double n1,double n2);
}
divideInterface
/**
* Created by ${MIND-ZR} on 2017/12/19.
*/
public interface divideInterface {
double divide(double n1,double n2);
}

multiplyInterface
/**
* Created by ${MIND-ZR} on 2017/12/19.
*/
public interface multiplyInterface {
double multiply(double n1,double n2);
}

subtractInterface
/**
* Created by ${MIND-ZR} on 2017/12/19.
*/
public interface subtractInterface {
double subtract(double n1,double n2);
}
这里我们引入一个组件的概念。

.SOA(Service-Oriented Architecture)

      面向服务的体系结构(SOA)是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。

也就是说我们可以把计算器理解为一个组件。
它把所需要的加减乘除组装起来。
Tuscany的作用就很明显了,还是降低耦合。
看一下Calculator的实现类所做的事。

最后配置文件。


Calculator.composite

<composite
       xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
       targetNamespace="http://com.jnshu"
       name="Calculator">
   <!--xmlns="http://www.osoa.org/xmlns/sca/1.0"-->
   <component name="CalculatorServiceComponent">
       <implementation.java class="servieImpl.Calculator" />
       <reference name="add" target="AddComponent"/>
       <reference name="subtract" target="SubtractComponent"/>
       <reference name="multiply" target="MultiplyComponent"/>
       <reference name="divide" target="DivideComponent"/>
   </component>
   <component name="AddComponent">
       <implementation.java class="servieImpl.add"/>
   </component>
   <component name="SubtractComponent">
       <implementation.java class="servieImpl.subtract"/>
   </component>
   <component name="MultiplyComponent">
       <implementation.java class="servieImpl.multiply"/>
   </component>
   <component name="DivideComponent">
       <implementation.java class="servieImpl.divide"/>
   </component>
</composite>

注意!这里面爆红是正常的,代表标签名错误。(实际上是没关系的。类似idea的mapper报错)



最后加载测试类

package client;

import org.apache.tuscany.sca.node.Node;
import org.apache.tuscany.sca.node.NodeFactory;
import service.CalculatorInterface;
import servieImpl.Calculator;

/**
* Created by ${MIND-ZR} on 2017/12/19.
*/
public class CalculatorServerClient {
public static void main(String[] args) {
Node node= NodeFactory.newInstance().createNode("Calculator.composite");
       node.start();
       System.out.println("service启动");
      CalculatorInterface c = node.getService(Calculator.class,"CalculatorServiceComponent");
       System.out.println(c.add(2, 2));
       System.out.println("3 + 2 = " + c.add(3, 2));
       System.out.println("3 - 2 = " + c.subtract(3, 2));
       System.out.println("3 * 2 = " + c.multiply(3, 2));
       System.out.println("3 / 2 = " + c.divide(3, 2));
       node.stop();
   }

}

测试结果



配置RMI


引入新的依赖。

修改配置文件。



相当于暴露出我们的RMI接口。




服务端启动。

 */
public class CalculatorServerClient {
public static void main (String[] args) throws InterruptedException{

Node node= NodeFactory.newInstance().createNode("Calculator.composite");
       node.start();
       System.out.println("service启动");

   }

}


客户端调用。


/**
* Created by ${MIND-ZR} on 2017/12/20.
*/
public class TestDemo {


@Test
   public void test()throws MalformedURLException, RemoteException, NotBoundException {
CalculatorInterface Calculator = (CalculatorInterface) Naming.lookup("//127.0.0.1:8199/CalculatorRMIService");
       System. out.println("1+2结果: " + Calculator.add(1,2));
   }
}



控制台输出


遇到的问题


问题就出现在我的

指定的应该是一个实现类。

而我指定了一个接口,至于为什么这里要是一个实现类,我在上面的分析里面已经说了。




这个坑就帮你们后来的人拍了。

就是说你的RMI以来添加之后,因为这个配置文件我们idea是不兼容的,所以你要自己修改标签头。

<composite
       xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
       targetNamespace="http://com.jnshu"
       name="Calculator">


改为


<?xml version="1.0" encoding="UTF-8"?>
<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200912"
          xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
          targetNamespace="http://sample"
          xmlns:sample="http://sample"
          xmlns:scallop="http://scallop/xmlns/sca/1.1"
          name="Calculator">



辣鸡bug。。。

因为这个框架用的人太少了。

想了半天才想到可能是标签名不能匹配。哎。

脑壳疼。


收获

还是很大的。

学习了一点github.

将任务89的知识学习了一下。

明天的计划

回顾任务一

禅道链接

http://task.ptteng.com/zentao/project-task-390.html


返回列表 返回列表
评论

    分享到