spring boot整合dubbox进行服务拆分
时间:2022-05-06
本文章向大家介绍spring boot整合dubbox进行服务拆分,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
Dubbo是一个来自阿里巴巴的开源分布式服务框架,当当根据自身的需求,为Dubbo实现了一些新的功能,包括REST风格远程调用、Kryo/FST序列化等等。并将其命名为Dubbox(即Dubbo eXtensions)。
Dubbox地址:https://github.com/dangdangdotcom/dubbox
由于dubbox没有发布到maven中央仓库,需要自己安装到本地maven库或者私库。
- git clone https://github.com/dangdangdotcom/dubbox
- 在checkout出来的dubbox目录执行mvn install -Dmaven.test.skip=true来尝试编译一下dubbo(并将dubbo的jar安装到本地maven库)
- 下载解压一个zookeeper,编辑其conf/zoo.cfg后启动zookeeper用作dubbo注册中心:bin/zkServer.sh start
这些准备好后就开始创建一个多模块的maven项目,具体怎么分得看自己的业务需求。
下图是我这边测试用的,仅供参考。
- cxytiandi 父(pom)工程
- cxytiandi-api-inteface 所有接口定义
- cxytiandi-common 通用的工具类
- cxytiandi-datastore 数据库操作
- cxytiandi-manager 后台项目
- cxytiandi-model 所有实体类定义
- cxytiandi-rs-api 所有rest api
- cxytiandi-web 主web项目
父工程的pom.xml
<?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.cxytiandi</groupId>
<artifactId>cxytiandi</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<properties>
<cxytiandi.version>1.0.0</cxytiandi.version>
<java.version>1.8</java.version>
<dubbo.version>2.8.4</dubbo.version>
<zookeeper.version>3.4.6</zookeeper.version>
<sgroschupf.version>0.1</sgroschupf.version>
<resteasy.version>3.0.7.Final</resteasy.version>
<validation.version>1.0.0.GA</validation.version>
<hibernate.version>4.3.1.Final</hibernate.version>
<jetty.version>6.1.26</jetty.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.cxytiandi</groupId>
<artifactId>cxytiandi-common</artifactId>
<version>${cxytiandi.version}</version>
</dependency>
<dependency>
<groupId>com.cxytiandi</groupId>
<artifactId>cxytiandi-api-interface</artifactId>
<version>${cxytiandi.version}</version>
</dependency>
<dependency>
<groupId>com.cxytiandi</groupId>
<artifactId>cxytiandi-model</artifactId>
<version>${cxytiandi.version}</version>
</dependency>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>${sgroschupf.version}</version>
</dependency>
<!-- resteasy -->
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jackson-provider</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>${validation.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.mortbay.jetty</groupId>
<artifactId>jetty</artifactId>
<version>${jetty.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>cxytiandi-common</module>
<module>cxytiandi-web</module>
<module>cxytiandi-manager</module>
<module>cxytiandi-rs-api</module>
<module>cxytiandi-datastore</module>
<module>cxytiandi-model</module>
<module>cxytiandi-api-interface</module>
</modules>
</project>
目前dubbo的配置有2种方式。
一种是和之前一样,基于xml的配置,然后用@ImportResource导入。
@SpringBootApplication
@ImportResource(locations={"classpath:applicationContext-rpc-provider.xml"})
public class DatastoreApplication {
private static final Logger logger = LoggerFactory.getLogger(DatastoreApplication.class);
@Bean
public CountDownLatch closeLatch() {
return new CountDownLatch(1);
}
public static void main(String[] args) {
ApplicationContext ctx = new SpringApplicationBuilder()
.sources(DatastoreApplication.class)
.web(false)
.run(args);
logger.info("项目启动!");
CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
try {
closeLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
<!-- 应用名称 -->
<dubbo:application name="soa-users" />
<!-- 注册中心 -->
<dubbo:registry address="zookeeper://localhost:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20881" accepts="500" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.cxytiandi.api.inteface.rpc.ArticleRpcService" ref="ArticleRpcService" protocol="dubbo" timeout="2000" version="1.0"/>
第二种了就是基于注解的方式,本来spring boot就是提倡简化配置,如果我们还用xml就显得有点不协调了。
@Configuration
public class DubboBaseConfig {
@Bean
public AnnotationBean annotation() {
AnnotationBean bean = new AnnotationBean();
bean.setPackage("com.cxytiandi.datastore.api.rpc");
return bean;
}
@Bean
public RegistryConfig registry() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("127.0.0.1:2181");
registryConfig.setProtocol("zookeeper");
return registryConfig;
}
@Bean
public ApplicationConfig application() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("soa-users");
return applicationConfig;
}
@Bean
public ProtocolConfig protocol() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setPort(20881);
return protocolConfig;
}
}
发布服务的话我们就用dubbo中提供的Service注解来发布服务。
@Component("ArticleRpcService")
@Service(interfaceClass = ArticleRpcService.class, version = "1.0")
public class ArticleRpcServiceImpl implements ArticleRpcService {
}
调用也是一样用dubbo的Reference注解
@Reference(interfaceClass = ArticleRpcService.class, version = "1.0")
private ArticleRpcService articleRpcServiceRef;
整个项目调用的流程图如下:
源码下载:http://cxytiandi.com/code/detail/12
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Angular HTML template的解析位置
- Angular FormBuilder的工作原理
- Angular HTTPClient的使用方法
- nodejs错误:PayloadTooLargeError: request entity too large
- 富文本编辑器 tinymce 的使用
- dotnet core 在 MAC 系统下删除应用程序自己后调 Process Start 方法将会抛出 Win32 异常
- 如何从高德获取地铁数据
- Yaconf - windows 环境下的高性能配置操作
- [ 物联网篇 ] 26 -ALSA Plug 中 multi 的应用
- LeetCode 1546. Maximum Number of Non-Overlapping Subarrays With Sum Equals Target(动态规划)
- HTML加载顺序
- 基于飞桨PaddleClas实现轧钢带表面缺陷分类,top1准确率可达100%
- 01Python的基本的数据结构之List
- 02Python数据结构之再谈List的常用操作
- 03Python List不得不知的操作之改、查