【转】SpringBoot学习笔记(7) SpringBoot整合Dubbo(使用yml配置)
http://blog.csdn.net/a67474506/article/details/61640548
Dubbo是什么东西我这里就不详细介绍了,自己可以去谷歌
SpringBoot整合Dubbo的话我们首先要先对Dubbo的启动这块了解一哈
dubbo源码分析:http://blog.csdn.net/flashflight/article/details/44318447
Dubbo会注册各种解析器,因为我们这边不会在使用XML配置了,所以主要关注的地方就是这块
通过BeanDefinitionParser解析,然后注册到Ioc容器中,而这里我们通过SpringBoot的自动配置,读取yml配置生成SpringBean
基本上我们只有用到 registry,provider, protocol ,application这些
然后暴漏服务和引用服务 通过annotationBean这个东东
因为使用了yml或者properties的方式来配置dubbo,所以我们还需要dubbo的AnnotionBean类,来扫描指定包下面的类.
这里集成dubbo的时候和前面集成其他东西的是差不多的,不过在使用了AnnotionBean类的时候,因为AnnotionBean类实现了BeanFactoryPostProcessor接口.
这里还有一篇资料:
http://blog.csdn.net/u011686226/article/details/53841227
刚开始不知道的时候日志里面提示是这样的
- @Bean method DubboAutoConfiguration.annotationBean is non-static and returns an object assignable to Spring's BeanFactoryPostProcessor interface.
- This will result in a failure to process annotations such as @Autowired, @Resource and @PostConstruct within the method's declaring @Configuration class.
- Add the 'static' modifier to this method to avoid these container lifecycle issues; see @Bean javadoc for complete details.
解决了这个问题之后,下面的就可以直接按照原先的步骤来搞
dubbo-spring-boot-starter
Pom.xml
- <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.ibigsea</groupId>
- <artifactId>dubbo-spring-boot-starter</artifactId>
- <version>1.0-SNAPSHOT</version>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <boot.version>1.3.5.RELEASE</boot.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot</artifactId>
- <version>${boot.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-autoconfigure</artifactId>
- <version>${boot.version}</version>
- </dependency>
- <!-- dubbo -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>dubbo</artifactId>
- <version>2.5.3</version>
- <exclusions>
- <exclusion>
- <groupId>org.springframework</groupId>
- <artifactId>spring</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.github.sgroschupf</groupId>
- <artifactId>zkclient</artifactId>
- <version>0.1</version>
- <exclusions>
- <exclusion>
- <artifactId>slf4j-api</artifactId>
- <groupId>org.slf4j</groupId>
- </exclusion>
- <exclusion>
- <artifactId>log4j</artifactId>
- <groupId>log4j</groupId>
- </exclusion>
- <exclusion>
- <artifactId>slf4j-log4j12</artifactId>
- <groupId>org.slf4j</groupId>
- </exclusion>
- </exclusions>
- </dependency>
- </dependencies>
- </project>
DubboProperties.Java
- package com.ibigsea.dubbo.autoconfigure;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import com.alibaba.dubbo.config.ApplicationConfig;
- import com.alibaba.dubbo.config.ProtocolConfig;
- import com.alibaba.dubbo.config.RegistryConfig;
- @ConfigurationProperties(prefix = DubboProperties.DUBBO_PREFIX)
- public class DubboProperties {
- public static final String DUBBO_PREFIX = "dubbo";
- private String scan;
- private ApplicationConfig application;
- private ProtocolConfig protocol;
- private RegistryConfig registry;
- public String getScan() {
- return scan;
- }
- public void setScan(String scan) {
- this.scan = scan;
- }
- public ApplicationConfig getApplication() {
- return application;
- }
- public void setApplication(ApplicationConfig application) {
- this.application = application;
- }
- public ProtocolConfig getProtocol() {
- return protocol;
- }
- public void setProtocol(ProtocolConfig protocol) {
- this.protocol = protocol;
- }
- public RegistryConfig getRegistry() {
- return registry;
- }
- public void setRegistry(RegistryConfig registry) {
- this.registry = registry;
- }
- }
DubboAutoConfiguration.java
- package com.ibigsea.dubbo.autoconfigure;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
- import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
- import org.springframework.boot.context.properties.EnableConfigurationProperties;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import com.alibaba.dubbo.config.ApplicationConfig;
- import com.alibaba.dubbo.config.ProtocolConfig;
- import com.alibaba.dubbo.config.RegistryConfig;
- import com.alibaba.dubbo.config.spring.AnnotationBean;
- @Configuration
- @EnableConfigurationProperties(DubboProperties.class)//开启属性注入,通过@autowired注入
- @ConditionalOnClass({AnnotationBean.class,ApplicationConfig.class,ProtocolConfig.class,RegistryConfig.class})
- public class DubboAutoConfiguration {
- @Autowired
- private DubboProperties prop;
- @Bean
- @ConditionalOnMissingBean(AnnotationBean.class)//容器中如果没有这个类,那么自动配置这个类
- public static AnnotationBean annotationBean(@Value("${dubbo.packageName}")String packageName) {
- AnnotationBean annotationBean = new AnnotationBean();
- annotationBean.setPackage(packageName);
- return annotationBean;
- }
- @Bean
- @ConditionalOnMissingBean(ApplicationConfig.class)//容器中如果没有这个类,那么自动配置这个类
- public ApplicationConfig applicationConfig() {
- ApplicationConfig applicationConfig = new ApplicationConfig();
- applicationConfig.setName(prop.getApplication().getName());
- return applicationConfig;
- }
- @Bean
- @ConditionalOnMissingBean(ProtocolConfig.class)//容器中如果没有这个类,那么自动配置这个类
- public ProtocolConfig protocolConfig() {
- ProtocolConfig protocolConfig = new ProtocolConfig();
- protocolConfig.setName(prop.getProtocol().getName());
- protocolConfig.setPort(prop.getProtocol().getPort());
- return protocolConfig;
- }
- @Bean
- @ConditionalOnMissingBean(RegistryConfig.class)//容器中如果没有这个类,那么自动配置这个类
- public RegistryConfig registryConfig() {
- RegistryConfig registryConfig = new RegistryConfig();
- registryConfig.setAddress(prop.getRegistry().getAddress());
- return registryConfig;
- }
- }
在resource目录下面的META-INF添加spring.factories文件
- # Auto Configure
- org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
- com.ibigsea.dubbo.autoconfigure.DubboAutoConfiguration
目录结构
服务提供者dubbo-provider
Pom.xml
- <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.ibigsea</groupId>
- <artifactId>dubbo-provider</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <boot.version>1.3.7.RELEASE</boot.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>com.ibigsea</groupId>
- <artifactId>dubbo-spring-boot-starter</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- <version>${boot.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <version>${boot.version}</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
- </project>
定义一个接口BaseService.java
为了贪图方便,我就不在重新弄一个jar包,然后服务提供者和服务消费都引用这个jar了
- package com.ibigsea.service;
- public interface BaseService {
- public String build(String str);
- }
HelloService.java
- package com.ibigsea.dubbo_provider.impl;
- import com.alibaba.dubbo.config.annotation.Service;
- import com.ibigsea.service.BaseService;
- @Service(group="helloService", version="1.0")
- public class HelloService implements BaseService {
- @Override
- public String build(String str) {
- return "hello "+str+" !";
- }
- }
启动类APP
- package com.ibigsea;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.web.bind.annotation.RestController;
- /**
- * 是Spring Boot项目的核心注解,主要是开启自动配置
- */
- @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
- @RestController
- public class App {
- public static void main(String[] args) {
- SpringApplication.run(App.class, args);
- }
- }
application.yml配置
- dubbo :
- protocol :
- prot : -1
- name : dubbo
- application :
- name : hello-world-app
- registry :
- address : zookeeper://127.0.0.1:2181
- packageName : com.ibigsea.dubbo_provider.impl
- server :
- port : 8083
目录结构
服务消费者dubbo-consume
Pom.xml
- <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.ibigsea</groupId>
- <artifactId>dubbo-consume</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <boot.version>1.3.5.RELEASE</boot.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- <version>${boot.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <version>${boot.version}</version>
- <scope>test</scope>
- </dependency>
- <!-- dubbo -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>dubbo</artifactId>
- <version>2.5.3</version>
- <scope>provided</scope>
- <exclusions>
- <exclusion>
- <groupId>org.springframework</groupId>
- <artifactId>spring</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.ibigsea</groupId>
- <artifactId>dubbo-spring-boot-starter</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- </dependencies>
- </project>
同样的一个接口BaseService
- package com.ibigsea.service;
- public interface BaseService {
- public String build(String str);
- }
RefService.java
- package com.ibigsea.dubbo_consume.reference;
- import org.springframework.stereotype.Service;
- import com.alibaba.dubbo.config.annotation.Reference;
- import com.ibigsea.service.BaseService;
- @Service("refService")
- public class RefService {
- @Reference(group="helloService", version="1.0")
- private BaseService baseService;
- public String sayHello(String name){
- return baseService.build(name);
- }
- }
启动类APP
- package com.ibigsea;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- import com.ibigsea.dubbo_consume.reference.RefService;
- /**
- * 是Spring Boot项目的核心注解,主要是开启自动配置
- */
- @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
- @RestController
- public class App {
- @Autowired
- private RefService refService;
- public static void main(String[] args) {
- SpringApplication.run(App.class, args);
- }
- @RequestMapping("/say")
- public String sayHello(String name) {
- return refService.sayHello(name);
- }
- }
Application.yml
- dubbo :
- protocol:
- prot : -1
- name : dubbo
- application:
- name : hello-world-app
- registry:
- address : zookeeper://127.0.0.1:2181
- packageName : com.ibigsea.dubbo_consume.reference
- server :
- port : 8085
项目结构
分别启动dubbo-provider 和 dubbo-consume
我们可以再zookeeper的client里面看到相关信息
这个是服务提供者的信息
这个是服务消费者的信息
这个是访问结果
【转】SpringBoot学习笔记(7) SpringBoot整合Dubbo(使用yml配置)的更多相关文章
- SpringBoot学习笔记(4)----SpringBoot中freemarker、thymeleaf的使用
1. freemarker引擎的使用 如果你使用的是idea或者eclipse中安装了sts插件,那么在新建项目时就可以直接指定试图模板 如图: 勾选freeMarker,此时springboot项目 ...
- SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]
https://blog.csdn.net/a67474506/article/details/52608855 Spring定义了org.springframework.cache.CacheMan ...
- springboot学习笔记-5 springboot整合shiro
shiro是一个权限框架,具体的使用可以查看其官网 http://shiro.apache.org/ 它提供了很方便的权限认证和登录的功能. 而springboot作为一个开源框架,必然提供了和sh ...
- springboot学习笔记-6 springboot整合RabbitMQ
一 RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...
- SpringBoot学习笔记(16)----SpringBoot整合Swagger2
Swagger 是一个规范和完整的框架,用于生成,描述,调用和可视化RESTful风格的web服务 http://swagger.io Springfox的前身是swagger-springmvc,是 ...
- SpringBoot学习笔记(9)----SpringBoot中使用关系型数据库以及事务处理
在实际的运用开发中,跟数据库之间的交互是必不可少的,SpringBoot也提供了两种跟数据库交互的方式. 1. 使用JdbcTemplate 在SpringBoot中提供了JdbcTemplate模板 ...
- SpringBoot学习笔记(15)----SpringBoot使用Druid
直接访问Druid官网wiki,有详细教程,地址如下: SpringBoot支持Druid地址:https://github.com/alibaba/druid/tree/master/druid-s ...
- SpringBoot学习笔记(11)-----SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用
1. activemq 首先引入依赖 pom.xml文件 <dependency> <groupId>org.springframework.boot</groupId& ...
- SpringBoot学习笔记(10)-----SpringBoot中使用Redis/Mongodb和缓存Ehcache缓存和redis缓存
1. 使用Redis 在使用redis之前,首先要保证安装或有redis的服务器,接下就是引入redis依赖. pom.xml文件如下 <dependency> <groupId&g ...
随机推荐
- ActiveMQ - 入门指南
首先需要下载ActiveMQ,下面的链接给我们列出了所有版本: http://activemq.apache.org/download-archives.html 每个版本为不同的OS提供了链接: 公 ...
- ecs CentOS 7 安装 mariadb
检查之前是否已经安装 rpm -qa | grep mariadb 如果已安装,卸载 yum remove mysql mysql-server mysql-libs compat-mysql51 开 ...
- 第9章 CSS3中的变形与动画(下)
Keyframes介绍 Keyframes被称为关键帧,其类似于Flash中的关键帧.在CSS3中其主要以"@keyframes"开头,后面紧跟着是动画名称加上一对花括号" ...
- JavaEE之HttpServletRequest
HttpServletRequest //要下载的这个文件的类型--客户端会通过文件的MIME类型去区分类型 response.setContentType( getServletContext(). ...
- mysql if函数使用例子
1.场景一 有时查询数量a 同时查询过滤后的数量b 2. 代码 SELECT count(id) as total_count, count( IF ( date(order_time) = DATE ...
- JavaScript的重载(通过argument.length)
偶然间在博客园看到的关于js的重载(重载就是一组具有相同名字.不同参数列表,实现不同操作的函数或方法)问题,作为初学者,在看红宝书的时候,记得书中有概念说明js是没有重载的 所以,觉得有必要把这一段 ...
- SSIS 和 SSRS自制Template
可以使用VS 制作一个SSIS 的Package. 路径:C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssembl ...
- mysql游标的用法及作用
1当前有三张表A.B.C其中A和B是一对多关系,B和C是一对多关系,现在需要将B中A表的主键存到C中:常规思路就是将B中查询出来然后通过一个update语句来更新C表就可以了,但是B表中有2000多条 ...
- 139.00.005 Git学习-分支管理
@(139 - Environment Settings | 环境配置) 一.Why? 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交, ...
- Android解析ActivityManagerService(二)ActivityTask和Activity栈管理
前言 关于AMS,原计划是只写一篇文章来介绍,但是AMS功能繁多,一篇文章的篇幅远远不够.这一篇我们接着来学习与AMS相关的ActivityTask和Activity栈管理. 1.ActivitySt ...