发表于: 2018-09-17 21:26:51
1 434
今天完成的事情:
1、小课堂讲解
2、任务九学习
什么是TUSCANY?
开源 Apache Tuscany 项目致力于实现 SCA 规范(和一些其他的 SCA 规范,如 Service Data Objects 和 Data Access Service)。依照 Open Service-Oriented Architecture (OSOA) 和针对全球信息社会 (OASIS SCA Java) 规范的一些标准,Apache Tuscany 为 SCA 运行时提供了一个全面的基础架构。这里需要说明的是Tuscany官方已经不维护了,但是了解其设计思想对我们理解现在很流行的微服务框架是有好处的.
随着SCA(服务组件架构)和SDO(服务数据对象)最终落户OASIS,国内对它们的关注也呈上升趋势。与以往SOA 开发部署方式相比,SCA 所提供的编程模型和装配模型大大减轻了这些工作的难度。加之有OASIS 标准组织和以IBM为代表的业界巨擘的保驾护航,SCA 和SDO 的前途不可限量。 Tuscany 是SCA 和SDO 的第一个参考实现,旨在提供基于SCA 和SDO 的SOA 基础设施。Tuscany 几乎是伴随规范成长起来的,这样做的目的是对规范进行验证并获得有益的反馈。
什么是SCA?
SCA是一个可执行的模型,用于将不同的 服务集成到一个业务解决方案。它简化了实现业务服务的组件编程模型,这些组件可以使用不同编程语言实现。SCA带来的一些益处主要为:
1,松耦合:组件件的集成不需要知道彼此是基于何种编程语言实现的。在同步、异步情况下,组件都可以被方便的调用。
2,可扩展性:组件可被简单的被替换。既有的服务可被用来创建新的解决方案(自下而上),也可业务建模和开发(自上而下)。
3,生产率:SCA可让你专心于分析业务逻辑,而不需要过多的去担心系统架构。SCA简化了所有开发者的使用体验(包括J2EE和集成开发者)。
实现一个TUSCANY项目具体的步骤
步骤1:定义所需要的功能块:考虑下你的应用如何被分解为一个个较小的功能/服务,每个块都是一个可以在总的应用里使用的逻辑操作单元,这样的话,Calculator应用可以被分为五个功能块:AddService(加)、SubstractService(减)、MultiplyService(乘)、DivideService(除)和一个主功能块,起接收请求并引导到正确操作的控制器的作用。我们可以叫这个控制器为CalculatorService。
步骤2:实现每个功能块:既然你已经识别了应用中的功能块,现在将准备创建它们。在SCA里,功能性的块称为组件。我们将把AddService组件作为我们的第一个例子。一个组件包括方法的接口及其实现
步骤3:编写CalculatorService组件,它会调用AddService组件,在完整应用中,它会调用SubtractService、MultiplyService以及DivideService组件,但我们目前会忽略其他的,因为它们和我们实现的AddService是一个模式。
编写CalculatorService组件同样从CalculatorService接口开始,这是自身提供给其他程序调用的接口,然后实现这个接口.
步骤4:组装应用.编写Tuscany重要的配置文件"Calculator.composite".该配置文件是告诉SCA 这些组件在我们计算器应用内如何集成工作的一个XML文件。我们在这里定义了两个组件并且指定了Tuscany SCA需要加载去实现业务计算的Java实现类。它们是我们刚刚实现的那些类. 需要注意的是,CalculatorServiceComponent拥有一个对addService的引用,在这个XML配置文件里,这个引用目标是AddServiceComponent。当我们实现CalculatorServiceImpl时,引用名字"addService",与我们建立的addService 领域的名字相配,这不是巧合。
Tuscany SCA运行时从Xml配置文件解析这些信息,并且用来创建描述我们calculator应用程序的对象和关系。它首先创建了AddServiceImpl 和CalcualtorSreviceImpl的实例,然后将AddServiceImpl引用注入到CalculatorServiceImpl对象的addService字段域。如果你回过头来看下我们如何实现的CalculatorService,你会发现@Reference注释,它告诉SCA哪些字段/域需要被自动设置。
步骤5:在服务端使用Tuscany的Node启动该服务,并在客户端接收该服务,并使用.
计算器小demo
工程目录:
service:
package task0901;
public class Add implements IAdd{
@Override
public double add(double a, double b) {
return a + b;
}
}
package task0901;
import org.oasisopen.sca.annotation.Reference;
public class Calculator implements ICalculator {
private IAdd add;
public IAdd getAdd() {
return add;
}
@Reference
public void setAdd(IAdd add) {
this.add = add;
}
@Override
public double add(double a, double b) {
return this.add.add(a, b);
}
}
package task0901;
public interface IAdd {
double add(double a,double b);
}
package task0901;
public interface ICalculator {
double add(double a, double b);
}
package task0901;
import org.apache.tuscany.sca.node.Node;
import org.apache.tuscany.sca.node.NodeFactory;
public class StartService {
public static void main(String[] args) {
Node node = NodeFactory.newInstance().createNode(
"Calculator.composite");
node.start();
System.out.println("TuscanyService is Start.....");
}
}
<?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://task0901" name="Calculator" >
<component name="CalculatorServiceComponent">
<!--对接services接口的实现类 -->
<implementation.java class="task0901.Calculator" />
<service name="Calculator">
<interface.java interface="task0901.ICalculator"/>
<tuscany:binding.rmi uri="rmi://127.0.0.1:8099/CalculatorRMIService"/>
</service>
<!--对接services调用的实现类 -->
<reference name="add" target="AddComponent"/>
</component>
<component name="AddComponent">
<!--指定特定的类 -->
<implementation.java class="task0901.Add" />
</component>
</composite>
client:
package task0901;
public interface ICalculator {
double add(double a, double b);
}
package task0901;
import java.rmi.Naming;
public class CalculatorClient {
public static void main(String[] args) throws Exception {
ICalculator c= (ICalculator) Naming.lookup("//127.0.0.1:8099/CalculatorRMIService");
System.out.println(c.add(4, 4));
}
}
服务器启动
客户端运行结果
3、将Tuscany与spring整合,这里真的是很多坑,各种报错,各种版本冲突,现在刚刚运行好服务端,在等客户端弄好。
基本只要在Service层改动就好。
贴一下pom文件和一些遇到比较多问题的地方
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>zwp</groupId>
<artifactId>task0803-client</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>task0803-client Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<!-- log4j日志文件管理包版本 -->
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<!-- spring版本号 -->
<spring.version>3.0.5.RELEASE</spring.version>
<!-- mybatis版本号 -->
<mybatis.version>3.4.1</mybatis.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!--<spring.version>5.0.3.RELEASE</spring.version>-->
<!--<mybatis.version>3.4.4</mybatis.version>-->
</properties>
<dependencies>
<!-- 第一部分:Spring 配置-->
<!-- Spring core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring DAO -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- Spring mvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 第二部分:Servlet web -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.4</version>
</dependency>
<!-- 第三部分:数据库和mybatis -->
<!-- 数据库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!-- mybatis-spring整合包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<!-- 日志文件管理包 -->
<!-- log start -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- 格式化对象,方便输出日志 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.1.41</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log end -->
<!-- 映入JSON -->
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- JSTL标签类 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--AOP-->
<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.googlecode.xmemcached/xmemcached -->
<dependency>
<groupId>com.googlecode.xmemcached</groupId>
<artifactId>xmemcached</artifactId>
<version>2.4.0</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<!-- tuscany -->
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-sca-api</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-base-runtime</artifactId>
<version>2.0.1</version>
<exclusions>
<exclusion>
<artifactId>cglib</artifactId>
<groupId>cglib</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca.aggregation</groupId>
<artifactId>tuscany-binding-rmi-runtime-aggregation</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca.aggregation</groupId>
<artifactId>tuscany-binding-ws-runtime-axis2-aggregation</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-implementation-spring-runtime</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.tuscany.sca</groupId>
<artifactId>tuscany-assembly-xml</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>
</dependencies>
<build>
<finalName>project-8090</finalName>
<!--<pluginManagement><!– lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) –>-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.client.TestRun</mainClass>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<!--</pluginManagement>-->
</build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--<import resource="spring-mvc.xml"/>-->
<context:component-scan base-package="rmi"/>
<!--default-autowire="byName"-->
<bean id="paperRMIServerA" lazy-init="true" class="org.springframework.remoting.rmi.RmiProxyFactoryBean" >
<property name="serviceUrl" value="rmi://127.0.0.1:8090/paperRMIServer"/>
<property name="serviceInterface" value="service.PaperService"/>
</bean>
<bean id="paperRMIServerB" lazy-init="true" class="org.springframework.remoting.rmi.RmiProxyFactoryBean">
<property name="serviceUrl" value="rmi://127.0.0.1:8091/paperRMIServer"/>
<property name="serviceInterface" value="service.PaperService"/>
</bean>
</beans>
package rmi;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.tuscany.sca.node.Node;
import org.apache.tuscany.sca.node.NodeFactory;
import org.springframework.beans.factory.annotation.Autowired;
import service.PaperService;
public class RmiServices {
private static final Log LOGGER = LogFactory.getLog(RmiServices.class);
@Autowired
PaperService paperService ;
public static void main(String[] args) {
// TODO Auto-generated method stub
Node node = NodeFactory.newInstance().createNode("Calculator.composite");
node.start();
System.out.println("tuscany service启动");
}
}
其他基本不改动。
客户端
客户端直接沿用RMI的客户端就可以了。
4、任务总结
任务名称:JAVA=task9
成果连接:https://github.com/IT-xzy/Task/tree/master/Java/zhuangweipeng/task9
任务耗时:2018.09.16--2018.09.18 共计2天。
一天放假,刮台风。
任务无延期
任务总结:
1、任务九的坑比较多,很多都是因为自己的一些不好的行为导致的,经常会忘记改一些东西,改的东西不全,导致浪费了很多时间放在排错上。
2、任务九出bug,找别人帮忙排的比较多,自己花的时间比较少,所以整体任务进度比较快。
3、在别人帮忙排bug的时候,发现自己很多知识点只是了解皮毛,很多都不会用,这个可能还是需要花更多时间补补在做任务的时候,漏掉的知识点。
官网脑图
个人脑图(跟官网一样)
因为基本打不了jar包,其他的知识,除了Tuscany和soa外,任务8都有了。
明天要完成的事情
准备复习、复盘前期工作。
遇到困难
Tuscany整合spring的时候,各种报版本冲突。
收获
如上
进度:任务九
任务开始时间:2018.09.16
预计demo时间:2018.09.18
禅道地址:http://task.ptteng.com/zentao/project-task-731-unclosed.html
评论