• 分布式架构探索


    Apache CXF是一个开源的WebService RPC框架。

    例子:

    1. 新建一个maven web项目, 添加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>com.genesis.architect</groupId>
        <artifactId>cxf-demo</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <packaging>war</packaging>
    
        <properties>
            <java.version>1.8</java.version>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <cxf.version>3.1.7</cxf.version>
            <spring.version>4.0.9.RELEASE</spring.version>
            <junit.version>4.12</junit.version>
            <jstl.version>1.2</jstl.version>
            <servlet-api.version>2.5</servlet-api.version>
            <jsp-api.version>2.0</jsp-api.version>
        </properties>
    
        <!-- pom.xml增加多环境配置的配置 -->
        <profiles>
            <profile>
                <id>dev</id>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
                <properties>
                    <package.environment>development</package.environment>
                </properties>
            </profile>
            <profile>
                <id>pro</id>
                <properties>
                    <package.environment>production</package.environment>
                </properties>
            </profile>
            <profile>
                <id>test</id>
                <properties>
                    <package.environment>testing</package.environment>
                </properties>
            </profile>
        </profiles>
    
        <dependencies>
            <!-- spring -->
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-context</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-context-support</artifactId>
                <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-frontend-jaxws</artifactId>
                <version>${cxf.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-transports-http</artifactId>
                <version>${cxf.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-rt-transports-http-jetty</artifactId>
                <version>${cxf.version}</version>
            </dependency>
    
            <!-- servlet start -->
            <dependency>
                <groupId>jstl</groupId>
                <artifactId>jstl</artifactId>
                <version>${jstl.version}</version>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>servlet-api</artifactId>
                <version>${servlet-api.version}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jsp-api</artifactId>
                <version>${jsp-api.version}</version>
                <scope>provided</scope>
            </dependency>
            <!-- servlet end -->
    </dependencies>
    
        <build>
            <finalName>cxf-demo</finalName>
    
            <resources>
    
                <resource>
                    <directory>src/main/resources/${package.environment}</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                        <include>**/*.tld</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                        <include>**/*.tld</include>
                    </includes>
                    <filtering>false</filtering>
                </resource>
            </resources>
    
            <plugins>
                <!-- Jetty 服务器 -->
                <plugin>
                    <groupId>org.eclipse.jetty</groupId>
                    <artifactId>jetty-maven-plugin</artifactId>
                    <version>9.2.2.v20140723</version>
                    <configuration>
                        <httpConnector>
                            <port>8080</port>
                        </httpConnector>
                        <webAppConfig>
                            <contextPath>/${project.artifactId}</contextPath>
                        </webAppConfig>
                        <scanIntervalSeconds>2</scanIntervalSeconds>
                    </configuration>
                </plugin>
    
                <!-- tomcat 服务器 -->
                <!--<plugin>-->
                    <!--<groupId>org.apache.tomcat.maven</groupId>-->
                    <!--<artifactId>tomcat7-maven-plugin</artifactId>-->
                    <!--<configuration>-->
                        <!--<port>8080</port>-->
                        <!--<path>/${project.artifactId}</path>-->
                    <!--</configuration>-->
                <!--</plugin>-->
    
                <!--打war包到指定的目录下 -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <version>2.8</version>
                    <executions>
                        <execution>
                            <id>copy-war</id>
                            <phase>package</phase>
                            <goals>
                                <goal>copy</goal>
                            </goals>
                            <configuration>
                                <artifactItems>
                                    <artifactItem>
                                        <groupId>${project.groupId}</groupId>
                                        <artifactId>${project.artifactId}</artifactId>
                                        <version>${project.version}</version>
                                        <type>${project.packaging}</type>
                                    </artifactItem>
                                </artifactItems>
                                <!-- <outputDirectory>${dist.console.war.dir}</outputDirectory> -->
                                <!--指定war包保存地址 -->
                                <outputDirectory>${basedir}/WAR/${package.environment}</outputDirectory>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>

    2. 定义远程服务接口,并用@WebService标明是一个远程的WebService

    package com.genesis.architect.cxf.service;
    
    import javax.jws.WebService;
    
    /**
     * @author KG created on 16/12/4
     */
    @WebService
    public interface HelloService {
    
        public String sayHello(String content);
    
    }

    3. 远程服务的实现(通过endpointInterface指明对应的接口)

    package com.genesis.architect.cxf.service;
    
    import javax.jws.WebService;
    
    /**
     * @author KG created on 16/12/4
     */
    @WebService(endpointInterface = "com.genesis.architect.cxf.service.HelloService")
    public class HelloServiceImpl implements HelloService {
    
        @Override
        public String sayHello(String content) {
            return "hello," + content;
        }
    }

    4. 配置WebService的终结点实现,并配置地址映射

    cxf-server.xml

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:jaxws="http://cxf.apache.org/jaxws"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    
        <import resource="classpath:META-INF/cxf/cxf.xml"/>
        <import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>
        <jaxws:endpoint id="helloWorld" implementor="com.genesis.architect.cxf.service.HelloServiceImpl" address="/HelloWorld"/>
    
    </beans>

    5. web.xml配置WebService监听,添加ws路由映射

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://java.sun.com/xml/ns/javaee"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
             id="WebApp_ID" version="2.5">
    
        <display-name>cxf-spring</display-name>
    
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:cxf-server.xml</param-value>
        </context-param>
    
        <listener>
            <listener-class>
                org.springframework.web.context.ContextLoaderListener
            </listener-class>
        </listener>
    
        <servlet>
            <servlet-name>CXFServlet</servlet-name>
            <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>CXFServlet</servlet-name>
            <url-pattern>/ws/*</url-pattern>
        </servlet-mapping>
    
    </web-app>

    6. 编写客户端测试

    package com.genesis.architect.cxf.client;
    
    import com.genesis.architect.cxf.service.HelloService;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    /**
     * @author KG created on 16/12/4
     */
    public class CxfClient {
    
    
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("classpath:cxf-client.xml");
            HelloService client = (HelloService) context.getBean("helloClient");
            System.out.println(client.sayHello("Master HaKu"));
        }
    
    }

    7. 客户端调用远程服务的配置文件(cxf-client.xml)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:jaxws="http://cxf.apache.org/jaxws"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
    
    
        <jaxws:client id="helloClient"
                      serviceClass="com.genesis.architect.cxf.service.HelloService"
                      address="http://localhost:8080/cxf-demo/ws/HelloWorld" />
    </beans>

    8. 运行结果

    访问:

    http://localhost:8080/cxf-demo/ws/HelloWorld?wsdl

    可以看到soap的wsdl内容

    运行client:

    hello,Master HaKu

  • 相关阅读:
    突发!Gitee 图床,废了!
    基于Springboot工程使用手机连接电脑服务器
    vue方法挂载到window对象上
    数据库篇:mysql日志类型之 redo、undo、binlog
    技能篇:linux服务性能问题排查及jvm调优思路
    数据库篇:mysql事务原理之MVCC视图+锁
    数据库篇:mysql锁详解
    Linux日常
    从文件下载视角来理解Web API
    朴素贝叶斯算法
  • 原文地址:https://www.cnblogs.com/davidgu/p/8566088.html
Copyright © 2020-2023  润新知