dubbo 在Spring、SpringMvc、Springboot中混合使用

来源:互联网 发布:物理地址是mac地址吗 编辑:程序博客网 时间:2024/06/03 03:38

项目背景简介:

公司一个产品由多个项目组成,官网、微信公众号、小程序、运营后台、外部接口,刚开始为了快速开发和迭代,这些都是单独的项目,但是随着业务的不断扩展,这种开发方式出现了一些问题。
第一:业务相同模块重复开发,一旦需求变更维护成本很高;
        第二:数据库连接池资源有限,大规模部署集群难以实现;

    为了解决这些问题,我们使用服务的方式把通用的功能模块剥离出来单独开发,但是之前的项目有些用SpringMVC框架有些使用Springboot,经过研究我们用Spring容器来部署这些单独的服务,SpringMVC\Springboot作为服务消费者来调用服务提供者。

一、Spring+Dubbo作为服务提供方


1.dubbo-interface 在该项目中把服务要提供的接口放到里面,在本博客中我们模拟会员卡挂失逻辑,所以就把这个挂失抽象成接口,项目结构如下,项目访问地址:https://gitee.com/yanfaze/dubbo-demo



pom文件内容如下:
<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.yan</groupId>  <artifactId>dubbo-interface</artifactId>  <version>0.0.1-SNAPSHOT</version>  <build/>  <dependencies>  <dependency>          <groupId>javax.servlet</groupId>          <artifactId>servlet-api</artifactId>          <version>2.3</version>         <scope>provided</scope>       </dependency>  </dependencies></project>

这里定义了一个挂失的接口,具体的实现在服务提供者中实现


package com.yan.service;/** * 会员卡挂失 * @author yan * */public interface CardLoseService {public String lose(String cardNo);}



2.dubbo-provider 该项目做为服务提供方,实现具体的会员卡挂失逻辑。项目结构如下,项目访问地址:https://gitee.com/yanfaze/dubbo-demo




pom文件文件内容如下:
<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.yan</groupId>  <artifactId>dubbo-provide</artifactId>  <packaging>jar</packaging>  <version>0.0.1</version>        <properties>          <spring.version>4.0.4.RELEASE</spring.version>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>         <maven.compiler.encoding>UTF-8</maven.compiler.encoding>   </properties>  <dependencies>     <dependency>     <groupId>com.yan</groupId>     <artifactId>dubbo-interface</artifactId>     <version>0.0.1-SNAPSHOT</version>     </dependency>   <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>  <dependency>    <groupId>log4j</groupId>    <artifactId>log4j</artifactId>    <version>1.2.17</version></dependency><dependency>            <groupId>javax.servlet</groupId>            <artifactId>servlet-api</artifactId>            <version>2.3</version>      </dependency>    <!--  加入Spring 依赖--><dependency>           <groupId>org.springframework</groupId>           <artifactId>spring-core</artifactId>           <version>${spring.version}</version>      </dependency>      <dependency>           <groupId>org.springframework</groupId>           <artifactId>spring-web</artifactId>           <version>${spring.version}</version>       </dependency>       <dependency>           <groupId>org.springframework</groupId>           <artifactId>spring-oxm</artifactId>           <version>${spring.version}</version>       </dependency>       <dependency>           <groupId>org.springframework</groupId>           <artifactId>spring-tx</artifactId>           <version>${spring.version}</version>       </dependency>     <dependency>    <groupId>org.springframework</groupId>    <artifactId>spring-aspects</artifactId>    <version>${spring.version}</version></dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-jdbc</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-aop</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-context-support</artifactId>            <version>${spring.version}</version>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-test</artifactId>            <version>${spring.version}</version>        </dependency>              <dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.5.5</version></dependency> <dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.10</version></dependency>  </dependencies>    <build>  <plugins>    <plugin>        <groupId>org.apache.maven.plugins</groupId>        <artifactId>maven-shade-plugin</artifactId>        <version>1.2.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.yan.Main</mainClass>                            </transformer>                            <transformer                                      implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">                                      <resource>META-INF/cxf/bus-extensions.txt</resource>                                  </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.tooling</resource>                                  </transformer>                                  <transformer                                      implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">                                      <resource>META-INF/spring.schemas</resource>                                  </transformer>                                                                                                            </transformers>                    </configuration>            </execution>        </executions>     </plugin>  </plugins>    </build></project>



ApplicationContext.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><context:annotation-config /><context:component-scan base-package="com.yan"><context:exclude-filter type="annotation"expression="org.springframework.stereotype.Controller" /></context:component-scan><!-- 这里引入dubbo服务的配置 --><import resource="provider.xml"/>



provider.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"    xsi:schemaLocation="http://www.springframework.org/schema/beans            http://www.springframework.org/schema/beans/spring-beans.xsd            http://code.alibabatech.com/schema/dubbo            http://code.alibabatech.com/schema/dubbo/dubbo.xsd">           <dubbo:application name="demo-provider"  />          <!-- 注册中心服务地址 -->    <dubbo:registry  protocol="zookeeper" address="zookeeper://127.0.0.1:2181"/>     <dubbo:protocol name="dubbo" port="20880" />            <dubbo:service  interface="com.yan.service.CardLoseService" ref="cardLoseService" />       </beans>
CardLoseServiceImpl 实现了具体的会员卡挂失逻辑,请注意这里的注解,为了后续扩展这里使用了dubbo的注解
package com.yan.service.impl;import org.springframework.stereotype.Component;import com.alibaba.dubbo.config.annotation.Service;import com.yan.service.CardLoseService;@Component("cardLoseService")@Service()public class CardLoseServiceImpl implements CardLoseService{@Overridepublic String lose(String cardNo) {System.out.println("会员卡挂失,卡号:"+cardNo);return "会员卡挂失,卡号:"+cardNo;}}

这样服务提供方就好了,在实际环境中可以把该项目打包成jar文件,在服务器中启动

二、SpringMvc、Springboot+Dubbo作为服务消费方


1.dubbo-consumer 该项目作为服务消费者,使用了Springboot ,项目结构如下,项目访问地址:https://gitee.com/yanfaze/dubbo-demo




pom文件中内容如下:
<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/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.itstyle.dubbo</groupId>  <artifactId>itstyle_springboot_dubbo_consumer</artifactId>  <packaging>jar</packaging>  <version>0.0.1-SNAPSHOT</version>    <name>springboot_dubbo_consumer</name>  <url>http://maven.apache.org</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <java.version>1.7</java.version>  </properties>    <!-- spring-boot-starter-parent包含了大量配置好的依赖管理,在自己项目添加这些依赖的时候不需要写<version>版本号 -->  <parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>1.5.1.RELEASE</version>    <relativePath/>  </parent>  <!-- 配置依赖 -->  <dependencies>        <!-- springboot相关 -->        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-web</artifactId>    </dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Dubbo相关 --><dependency>     <groupId>com.yan</groupId>     <artifactId>dubbo-interface</artifactId>     <version>0.0.1-SNAPSHOT</version>     </dependency><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.5.5</version><exclusions><exclusion><artifactId>spring</artifactId><groupId>org.springframework</groupId></exclusion></exclusions></dependency>        <!-- zookeeper 注册中心 --><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.6</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId></exclusion><exclusion><groupId>log4j</groupId><artifactId>log4j</artifactId></exclusion></exclusions></dependency>        <!-- zookeeper 第三方操作工具类 --><dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.6</version></dependency><!-- javassist 字节码类库 --><dependency>    <groupId>org.javassist</groupId>    <artifactId>javassist</artifactId></dependency>  </dependencies>  <build><plugins>    <!-- 打包项目 mvn clean package --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><dependencies>    <!-- mvn spring-boot:run 热部署启动 -->                    <dependency>                        <groupId>org.springframework</groupId>                        <artifactId>springloaded</artifactId>                        <version>1.4.0.RELEASE</version>                    </dependency>                 </dependencies></plugin></plugins></build></project>


consumer.xml文件中内容如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd       http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">    <!-- 消费者 应用信息 -->    <dubbo:application name="dubbo-consumer"/>    <!-- 注册中心服务地址 -->    <dubbo:registry  protocol="zookeeper" address="${dubbo.registry.address}" />    <!--            消费者配置 10秒重试默认retries="2" 3次调用 -同步返回-启动不检查提供者 --><dubbo:consumer   check="false"/>    <dubbo:reference id="cardLossService" interface="com.yan.service.CardLoseService" check="false" protocol="dubbo"/>    </beans>
application.properties文件内容如下:
server.context-path=/consumerserver.error.path=/errorserver.port=8081server.session-timeout=60server.tomcat.max-threads=800server.tomcat.uri-encoding=UTF-8dubbo.registry.address=127.0.0.1:2181logging.level.root=INFO

Main 项目启动类

package com.yan;import org.apache.log4j.Logger;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.annotation.ImportResource;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.yan.service.CardLoseService;/** * @author yfz */@SpringBootApplication@EnableAutoConfiguration@ImportResource({"classpath:consumer.xml"})@Controllerpublic class Main  {private static final Logger logger = Logger.getLogger(Main.class);@Autowiredprivate CardLoseService cardLoseService;@RequestMapping("/")@ResponseBody    public String   greeting() {        return cardLoseService.lose("8888888");    }public static void main(String[] args) throws InterruptedException {SpringApplication.run(Main.class, args);logger.info("项目启动 ");}}



到此项目基本完成,还有一个SpringMVC作为服务消费放的项目下次有时间在贴进来。

项目运行效果如下:



上图中是服务提供方




上图是服务消费方


程序执行结果如上图

特别说明以上项目中设计的bean都是写在配置文件中,便于理解,实际生产中可以使用注解的形式

原创粉丝点击