项目集成dubbo
dubbo 用户指南: http://dubbo.io/User+Guide-zh.htm 开发指南:http://dubbo.io/Developer+Guide-zh.htm#DeveloperGuide-zh-%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86
一、引入dubbo相关包
在game子模块pom.xml加入相关maven包
因为dubbo和zkclient的日志默认使用的是log4j,与我们系统使用的logback不一致, dubbo使用的spring2.5.6与我们系统使用的sping4也不一致,所以需要去掉他们默认的,改成我们自己系统一致的。
<dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.5.3</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions></dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.9</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions></dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.25</version></dependency> |
二、将原来的game-service模块拆分成game-service和game-provider两个子模块
原game-service子模块中service所有接口类放入新game-service子模块中,原game-service子模块中service.impl和component等包放入game-provider子模块中
修改后的game-service作为接口的定义,game-provider作为提供者实现接口。
项目拆分之后消费者模块需要修改成只引入game-service子模块
三、服务提供者实现
1、在game-provider子模块pom.xml引入game-service子模块和原game-service项目maven包
2、在game-provider子模块src/main/resource下创建 dubbo_provider.properties 文件
# 提供方应用信息,用于计算依赖关系dubbo.application.name=game-providerdubbo.application.logger=slf4j# 声明需要暴露的服务接口所在的包dubbo.annotation.package=com.xunleijr.game# 用dubbo协议在20880端口暴露服务dubbo.protocol.name=dubbodubbo.protocol.port=20880dubbo.protocol.accessLog=truedubbo.provider.timeout=3000dubbo.provider.retries=1dubbo.provider.delay=-1# 使用zookeeper注册中心暴露服务地址dubbo.registr.protocol=zookeeperdubbo.registry.address.production=dubbo.registry.address.quasi_production=10.26.91.214:2181dubbo.registry.address.test=192.168.20.36:2181dubbo.registry.register=truedubbo.registry.subscribe=true |
3、创建Dubbo提供者配置类
package com.xunleijr.game.config;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;import com.alibaba.dubbo.config.ApplicationConfig;import com.alibaba.dubbo.config.ProtocolConfig;import com.alibaba.dubbo.config.ProviderConfig;import com.alibaba.dubbo.config.RegistryConfig;import com.xunleijr.game.annotation.AnnotationBean;import com.xunleijr.game.common.AppConstant;@Configuration@PropertySource(value = "classpath:dubbo_provider.properties")public class DubboProviderConfig { @Value("${dubbo.application.name}") private String applicationName; @Value("${dubbo.registr.protocol}") private String protocol; @Value("${dubbo.registry.address.production}") private String registryAddress_production; @Value("${dubbo.registry.address.quasi_production}") private String registryAddress_quasiProduction; @Value("${dubbo.registry.address.test}") private String registryAddress_test; @Value("${dubbo.protocol.name}") private String protocolName; @Value("${dubbo.protocol.port:20880}") private int protocolPort; @Value("${dubbo.provider.timeout:3000}") private int timeout; @Value("${dubbo.provider.retries:1}") private int retries; @Value("${dubbo.provider.delay:1}") private int delay; @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } /** * 设置dubbo扫描包 * * @param packageName * @return */ @Bean public static AnnotationBean annotationBean(@Value("${dubbo.annotation.package}") String packageName) { AnnotationBean annotationBean = new AnnotationBean(); annotationBean.setPackage(packageName); return annotationBean; } /** * 注入dubbo上下文 * * @return */ @Bean public ApplicationConfig applicationConfig() { // 当前应用配置 ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName(this.applicationName); return applicationConfig; } /** * 注入dubbo注册中心配置,基于zookeeper * * @return */ @Bean public RegistryConfig registryConfig() { // 连接注册中心配置 RegistryConfig registry = new RegistryConfig(); registry.setProtocol(protocol); String registryAddress = null; switch (AppConstant.CURR_SYSTEM_ENVIRONMENT) { case PRODUCTION_ENVIRONMENT: registryAddress = registryAddress_production; break; case QUASI_PRODUCTION_ENVIRONMENT: registryAddress = registryAddress_quasiProduction; break; case TEST_ENVIRONMENT: registryAddress = registryAddress_test; break; } registry.setAddress(registryAddress); System.out.println("########### registry Config 【" + protocol + ":" + registryAddress + "】"); return registry; } /** * 默认基于dubbo协议提供服务 * * @return */ @Bean public ProtocolConfig protocolConfig() { // 服务提供者协议配置 ProtocolConfig protocolConfig = new ProtocolConfig(); protocolConfig.setName(protocolName); protocolConfig.setPort(protocolPort); protocolConfig.setThreads(200); System.out.println("########### protocol config【" + protocolName + ":" + protocolPort + "】"); return protocolConfig; } /** * dubbo服务提供 * * @param applicationConfig * @param registryConfig * @param protocolConfig * @return */ @Bean(name = "defaultProvider") public ProviderConfig providerConfig(ApplicationConfig applicationConfig, RegistryConfig registryConfig, ProtocolConfig protocolConfig) { ProviderConfig providerConfig = new ProviderConfig(); providerConfig.setTimeout(timeout); providerConfig.setRetries(retries); providerConfig.setDelay(delay); providerConfig.setApplication(applicationConfig); providerConfig.setRegistry(registryConfig); providerConfig.setProtocol(protocolConfig); System.out.println("########### provider init..."); return providerConfig; }} |
4、修改接口实现类的@Service注解为@com.alibaba.dubbo.config.annotation.Service(version = "1.0.0")
5、将game-model子模块中除protocol buffer相关类之外的类实现java.io.Serializable接口
6、创建服务提供者启动类
package com.xunleijr.game;import java.io.IOException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import com.xunleijr.game.config.DubboProviderConfig;import com.xunleijr.game.config.MainConfig;/** * 服务提供者启动类 * @author Yixi * */public class ProviderMain { private static Logger logger = LoggerFactory.getLogger(ProviderMain.class); @SuppressWarnings("resource") public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); ctx.register(MainConfig.class); ctx.register(DubboProviderConfig.class); ctx.refresh(); ctx.registerShutdownHook();// 在JVM注册一个关闭钩子,确保IOC容器最终会被正确关闭 ctx.start(); logger.info("dubbo provider start..."); try { // 输入任意字符退出 System.in.read(); } catch (IOException e) {} }} |
四、服务消费者实现
1、消费者src/main/resources下创建dubbo_consumer.properties文件
dubbo.application.name=game-***-consumerdubbo.application.logger=slf4jdubbo.annotation.package=com.xunleijr.gamedubbo.registr.protocol=zookeeperdubbo.registry.address.production=dubbo.registry.address.quasi_production=10.26.91.214:2181dubbo.registry.address.test=192.168.20.36:2181dubbo.registry.register=truedubbo.registry.subscribe=true |
2、创建Dubbo消费者配置类
package com.xunleijr.game.config;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;import com.alibaba.dubbo.config.ApplicationConfig;import com.alibaba.dubbo.config.RegistryConfig;import com.alibaba.dubbo.config.spring.AnnotationBean;import com.xunleijr.game.common.AppConstant;@Configuration@PropertySource(value = "classpath:dubbo_consumer.properties")public class DubboConsumerConfig { @Value("${dubbo.application.name}") private String applicationName; @Value("${dubbo.registr.protocol}") private String protocol; @Value("${dubbo.registry.address.production}") private String registryAddress_production; @Value("${dubbo.registry.address.quasi_production}") private String registryAddress_quasiProduction; @Value("${dubbo.registry.address.test}") private String registryAddress_test; @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { return new PropertySourcesPlaceholderConfigurer(); } /** * 设置dubbo扫描包 * * @param packageName * @return */ @Bean public static AnnotationBean annotationBean(@Value("${dubbo.annotation.package}") String packageName) { AnnotationBean annotationBean = new AnnotationBean(); annotationBean.setPackage(packageName); return annotationBean; } /** * 注入dubbo上下文 * * @return */ @Bean public ApplicationConfig applicationConfig() { // 当前应用配置 ApplicationConfig applicationConfig = new ApplicationConfig(); applicationConfig.setName(this.applicationName); return applicationConfig; } /** * 注入dubbo注册中心配置,基于zookeeper * * @return */ @Bean public RegistryConfig registryConfig() { // 连接注册中心配置 RegistryConfig registry = new RegistryConfig(); registry.setProtocol(protocol); String registryAddress = null; switch (AppConstant.CURR_SYSTEM_ENVIRONMENT) { case PRODUCTION_ENVIRONMENT: registryAddress = registryAddress_production; break; case QUASI_PRODUCTION_ENVIRONMENT: registryAddress = registryAddress_quasiProduction; break; case TEST_ENVIRONMENT: registryAddress = registryAddress_test; break; } registry.setAddress(registryAddress); return registry; }} |
3、在springmvc初始化时加载dubbo配置
修改WebInitializer.java
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {**** @Override protected Class<?>[] getRootConfigClasses() { // 加载配置文件类 return new Class[] { DubboConsumerConfig.class }; }****} |
4、修改消费者类中需要远程调用接口类上面的@Autowired注解修改为@com.alibaba.dubbo.config.annotation.Reference(version = "1.0.0")
项目集成dubbo的更多相关文章
- Spring Boot 项目实战(五)集成 Dubbo
一.前言 上篇介绍了 Redis 的集成过程,可用于解决热点数据访问的性能问题.随着业务复杂度的提高,单体应用越来越庞大,就好比一个类的代码行数越来越多,分而治之,切成多个类应该是更好的解决方法,所以 ...
- 玩转Spring Boot 集成Dubbo
玩转Spring Boot 集成Dubbo 使用Spring Boot 与Dubbo集成,这里我之前尝试了使用注解的方式,简单的使用注解注册服务其实是没有问题的,但是当你涉及到使用注解的时候在服务里面 ...
- Spring boot 集成 Dubbo 快速搭建
架构: 1.ZooKeeper:服务注册中心 2.api工程:提供对外暴露的服务API 3.provider:服务提供者 4.consumer:服务消费者 示例如下: (一)新建 Maven 项目 a ...
- JEECMS9.3集成dubbo操作记录
需求描述: 门户及其他应用系统需要查询JEECMS9.3中发布的栏目及数据,而其他系统都是基于dubbo开发的,因此想要将JEECMS9.3中集成dubbo并对外提供内容管理服务. 需求实现: 1.添 ...
- SpringCloud系列之集成Dubbo应用篇
目录 前言 项目版本 项目说明 集成Dubbo 2.6.x 新项目模块 老项目模块 集成Dubbo 2.7.x 新项目模块 老项目模块 参考资料 系列文章 前言 SpringCloud系列开篇文章就说 ...
- 现有iOS项目集成React Native过程记录
在<Mac系统下React Native环境搭建>配置了RN的开发环境,然后,本文记录在现有iOS项目集成React Native的过程,官方推荐使用Cocoapods,项目一开始也是使用 ...
- 集成Dubbo服务(Spring)
Dubbo是什么? Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,000,000+次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点. Dubbo[]是 ...
- Vuejs实例-02Vue.js项目集成ElementUI
Vuejs实例-02Vue.js项目集成ElementUI 0:前言 vue.js的UI组件库,在git上有多个项目,我见的使用者比较多的是iView和Element.两个组件库,组件都很丰富. 官网 ...
- 项目集成自动分词系统ansj,实现自定义词库
一,分词系统地址:https://github.com/NLPchina/ansj_seg 二,为什么选择ansj? 1.项目需求: 我们平台要做手机售后的舆情分析,即对购买手机的用户的评论进行分析. ...
随机推荐
- 机房重构所遇问题"未能载入文件或程序集“DAL”或它的某一个依赖项。系统找不到指定的文件"的解决的方法集锦
敲七层登录的时候.忽然间认为敲三层搞清的思路瞬间又凌乱了.花了一天的时间边敲边梳理,最终整完了,执行的时候弹出了这种错误:未能载入文件或程序集"DAL"或它的某一个依赖项. 系统找 ...
- 使用Opencv中均值漂移meanShift跟踪移动目标
Mean Shift均值漂移算法是无参密度估计理论的一种,无参密度估计不需要事先知道对象的任何先验知识,完全依靠训练数据进行估计,并且可以用于任意形状的密度估计,在某一连续点处的密度函数值可由该点邻域 ...
- Smart internet of things services
A method and apparatus enable Internet of Things (IoT) services based on a SMART IoT architecture by ...
- range 的实现细节(start、end、step)(左闭右开区间)
range(int start, int end, int step); 返回的区间是 [start, end) 要求步长为 step,三个参数均为整数, 在底层实现时,最终返回的区间元素的数目应当为 ...
- 【25.23%】【codeforces 731C】Socks
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- FileReader采用的默认编码
很久以前听教学视频,里面讲到Java采用的默认编码是ISO-8859-1,一直记着. 但是最近重新看IO流的时候,惊讶地发现,在不指定字符编码的情况下,FileReader居然可以读取内容为中文的文本 ...
- Hibernate——(5)持久化对象和一级缓存机制
一.对象的三种状态 1.暂时态:当对象刚创建,和Session没有发生任何关系时,当程序运行完就即刻消失,被称为暂时态. 2.持久态:当执行如下代码时,对象变为持久态 Emp e = new Emp( ...
- JavaScript window.location物
演示样例 注意 方法 常常使用window.location.它的结构总是记不住.简单梳理下.方便以后查询. 演示样例 URL:http://b.a.com:88/index.php? name=ka ...
- C#List实现行转列
List实现行转列的通用方案 最近在做报表统计方面的需求,涉及到行转列报表.根据以往经验使用SQL可以比较容易完成,这次决定挑战一下直接通过代码方式完成行转列.期间遇到几个问题和用到的新知识这里整理记 ...
- 《深入浅出WPF》笔记——资源篇
原文:<深入浅出WPF>笔记--资源篇 前面的记录有的地方已经用到了资源,本文就来详细的记录一下WPF中的资源.我们平时的“资源”一词是指“资财之源”,是创造人类社会财富的源泉.在计算机程 ...