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

项目背景简介:

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

    为了解决这些问题,我们使用服务的方式把通用的功能模块剥离出来单独开发,但是之前的项目有些用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.xsd
						http://www.springframework.org/schema/aop 
						http://www.springframework.org/schema/aop/spring-aop.xsd
						http://www.springframework.org/schema/context 
						http://www.springframework.org/schema/context/spring-context.xsd
						http://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{

	@Override
	public 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=/consumer
server.error.path=/error
server.port=8081
server.session-timeout=60
server.tomcat.max-threads=800
server.tomcat.uri-encoding=UTF-8
dubbo.registry.address=127.0.0.1:2181
logging.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"})
@Controller
public class Main  {
	private static final Logger logger = Logger.getLogger(Main.class);
	@Autowired
	private 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都是写在配置文件中,便于理解,实际生产中可以使用注解的形式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值