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
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都是写在配置文件中,便于理解,实际生产中可以使用注解的形式
阅读全文
0 0
- dubbo 在Spring、SpringMvc、Springboot中混合使用
- dubbo+zookeeper+spring+springMVC+mybatis的使用
- dubbo+zookeeper+spring+springMVC+mybatis的使用
- 在Spring项目中集成使用dubbo实现分布式服务
- 使用springboot构建dubbo
- springMVC中在过滤器中使用spring bean
- springMVC中在过滤器中使用spring bean
- Dubbo在Spring下的使用
- spring的InitializingBean在dubbo中的使用
- 【Spring】在springmvc中使用log4j日志功能
- 在eclipse中使用Maven创建spring+springMVC工程
- SpringMVC、Zookeeper、Dubbo使用
- SpringMVC、Zookeeper、Dubbo使用
- 使用springboot+springmvc+mybaits-spring+mybatis-generator开发
- Hibernate和ibatis在同一个webapp中混合使用在spring中的配置方法
- Spring Boot 中使用 Dubbo 详解
- dubbo+springMVC+Spring+Mybatis搭建
- SpringMVC + Spring + Mybatis+ Dubbo + Zookeeper
- 设计模式之建造者模式
- 论运维人员怎么才能能好好放个长假
- 旅行家
- maven安装环境变量问题及配置到eclipse中
- Solr 连接sql server 作为数据源
- dubbo 在Spring、SpringMvc、Springboot中混合使用
- 小知识笔记
- 算法资料汇总
- iOS判断是否是移动数据上网,主要为了获取手机号一键登录
- LNMP安装目录、配置文件位置、目录文件位置
- Object doesn't support property or method 'die'
- 机器学习算法之决策树
- Webservice学习总结
- myeclipse工程转为idea工程