Dubbo官方文档(旧版): https://dubbo.gitbooks.io/dubbo-user-book/content/preface/background.html
Dubbo注册中心集群Zookeeper https://blog.csdn.net/u011225629/article/details/70277615 如果是集群方式,先安装好集群,然后每个zookeeper节点都启动dubbo提供者或消费者,注意,彼此之间的配置是一模一样的。
Spring Boot-2.0.1 整合 Dubbo-2.6.0 总结 http://xurui.pro/2018/04/11/Spring%20Boot-2.0.1%20%E6%95%B4%E5%90%88%20Dubbo-2.6.0%20%E6%80%BB%E7%BB%93/
springboot2.0整合dubbo https://www.jianshu.com/p/226df7409641
SpringBoot+zk+dubbo架构实践(一):本地部署zookeeper https://blog.csdn.net/zhenghhgz/article/details/80569144
SpringBoot+zk+dubbo架构实践(二):SpringBoot 集成 zookeeper https://zhuanlan.zhihu.com/p/37714781
SpringBoot+zk+dubbo架构实践(三):实际参考:dubbo-admin 2.6.0 安装和使用 https://www.cnblogs.com/shengulong/p/8303454.html 备用参考: 部署Dubbo2.6.0-admin管理平台 https://zhuanlan.zhihu.com/p/37762040
SpringBoot+zk+dubbo架构实践(四):实际参考:dubbo 2.6.2 + zookeeper 3.4.13 + SpringBoot 2.0.5 搭建 https://blog.csdn.net/xingxing_tx/article/details/83894092 备用参考: sb+zk+dubbo2.6.0框架搭建 https://blog.csdn.net/zhenghhgz/article/details/80608938
SpringBoot+zk+dubbo架构实践(五):搭建微服务电商架构 https://blog.csdn.net/zhenghhgz/article/details/80623703
dubbo-admin 2.6.2 https://github.com/apache/incubator-dubbo-ops/blob/develop/README_ZH.md
dubbo2.6.2版本dubbo-admin项目源码编译、启动 https://blog.csdn.net/ruyulin/article/details/80820013
dubbo-spring-boot-starter https://github.com/alibaba/dubbo-spring-boot-starter/blob/master/README_zh.md 这里有注解的用法
使用yml配置SpringBoot整合Dubbo 注解方式: https://www.jianshu.com/p/1fa6797a21b7
在 Dubbo 中使用注解 http://dubbo.apache.org/zh-cn/blog/dubbo-annotation.html
安装zookeeper 3.4.13
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz tar -zxvf zookeeper-3.4.13.tar.gz mv zookeeper-3.4.13 zookeeper cd zookeeper/conf cp zoo_sample.cfg zoo.cfg mkdir -p /home/pandy/temp/zookeeper vim zoo.cfg #修改: dataDir=/home/pandy/temp/zookeeper cd /home/pandy/dubbo/zookeeper/bin/ ./zkServer.sh status #查看状态 ./zkServer.sh start #启动 ./zkServer.sh stop #停止 ./zkServer.sh restart #重启 ./zkCli.sh #客户端命令来链接服务端 ----------------------------------------在客户端打开的控制台下执行: create /node_1 "test" 创建一个新的 znode节点“ node_1 ”以及与它关联的字符串 get /node_1 #这个用来测试zookeeper是否启动成功 set /node_1 "zkbak" 对 zk 所关联的字符串进行设置 delete /node_1 将刚才创建的 zone 删除 |
安装Dubbo Admin 2.6.0 (旧版本)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
#安装Tomcat: tar -zvxf apache-tomcat-7.0.62.tar.gz mv apache-tomcat-7.0.62 tomcat7 #打包和安装: dubbo-admin 2.6.0 : https://codeload.github.com/apache/incubator-dubbo/tar.gz/dubbo-2.6.0 rm -rf incubator-dubbo-dubbo-2.6.0 tar -zvxf incubator-dubbo-dubbo-2.6.0.tar.gz cd /home/pandy/下载/incubator-dubbo-dubbo-2.6.0 rm -rf /home/pandy/DevTools/tomcat7/webapps/ROOT rm -rf /home/pandy/DevTools/tomcat7/webapps/dubboAdmin rm -rf /home/pandy/DevTools/tomcat7/work/Catalina/localhost mvn clean package -Dmaven.test.skip=true #为了方便修改配置,所以使用源码方式部署,不使用war方式 cd dubbo-admin/target/ rm -rf ROOT mkdir ROOT unzip -oq dubbo-admin-2.6.0.war -d ROOT mv /home/pandy/下载/incubator-dubbo-dubbo-2.6.0/dubbo-admin/target/ROOT /home/pandy/DevTools/tomcat7/webapps vim /home/pandy/DevTools/tomcat7/webapps/ROOT/WEB-INF/dubbo.properties ------------------------ dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest sh /home/pandy/DevTools/tomcat7/bin/startup.sh sh /home/pandy/DevTools/tomcat7/bin/shutdown.sh tail -f -n10000 /home/pandy/DevTools/tomcat7/logs/catalina.out http://localhost:8080 # 登录 #以下方式还存在许多问题,不推荐 #如果想修改默认的上下文路径,修改: dubbo-admin/pom.xml的<wtpContextName>/dubboAdmin</wtpContextName>,然后编译打包: mvn clean package -Dmaven.test.skip=true #为了方便修改配置,所以使用源码方式部署,不使用war方式 cd dubbo-admin/target/ rm -rf dubboAdmin mkdir dubboAdmin unzip -oq dubbo-admin-2.6.0.war -d dubboAdmin mv /home/pandy/下载/incubator-dubbo-dubbo-2.6.0/dubbo-admin/target/dubboAdmin /home/pandy/DevTools/tomcat7/webapps vim /home/pandy/DevTools/tomcat7/webapps/dubboAdmin/WEB-INF/dubbo.properties ------------------------ dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest sh /home/pandy/DevTools/tomcat7/bin/startup.sh tail -f -n10000 /home/pandy/DevTools/tomcat7/logs/catalina.out http://localhost:8080/dubboAdmin # 登录 |
安装Dubbo Admin 2.6.2 (新版本),太多问题,不推荐,只是学习安装
1 2 3 4 5 6 7 8 9 10 |
cd /home/pandy/dubbo/ git clone https://github.com/apache/incubator-dubbo-ops.git vim /home/pandy/dubbo/incubator-dubbo-ops/dubbo-admin-backend/src/main/resources/application.properties ---------------- dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.registry.group=dubbo cd /home/pandy/dubbo/incubator-dubbo-ops/ 构建 mvn clean package 启动 mvn --projects dubbo-admin-backend spring-boot:run 访问 http://localhost:8080 |
注意:整合Dubbo的时候可以使用xml配置,或者注解方式,因为涉及到权重等是整数不一定相同,在注解的时候,对代码的侵入太深,不方便,所以最好使用xml配置方式。也注意到,别人推荐说,提供者使用xml配置,消费者使用注解。这真的合适么?
开始整合
提供者和消费者的 pom.xml 基本上一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 |
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>com.battcn</groupId> <artifactId>swagger-spring-boot-starter</artifactId> <version>1.4.5-RELEASE</version> </dependency> <!-- dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring</artifactId> </exclusion> </exclusions> <version>2.6.2</version> </dependency> <dependency> <groupId>com.alibaba.spring.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.0.0</version> </dependency> <!-- zookeeper --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.13</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.8.0</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.8.0</version> </dependency> <!--<dependency> <groupId>Springboot-Dubbo-Api</groupId> <artifactId>springboot-dubbo-api</artifactId> <version>0.0.1-SNAPSHOT</version> <exclusions> <exclusion> <groupId>*</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> </dependencies> |
公共接口: UserService.java
1 2 3 4 5 |
package com.example.demo.comm.service; import com.example.demo.comm.model.user.UserModel; public interface UserService { public UserModel insertUser(UserModel model); } |
配置方式:
=========================================================================
提供者: dubbo-provider.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
<?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="example-provider"/> <!-- 注册中心配置,用于配置连接注册中心相关信息 --> <dubbo:registry id="zookeeper" protocol="zookeeper" address="localhost:2181"/> <!-- 协议配置,用于配置提供服务的协议信息,协议由提供方指定,消费方被动接受。 暴露服务 --> <dubbo:protocol name="dubbo" port="20881"/> <!-- 服务配置,用于暴露一个服务,定义服务的元信息,一个服务可以用多个协议暴露,一个服务也可以注册到多个注册中心。 --> <dubbo:service interface="com.example.demo.comm.service.UserService" ref="userService" version="1.0"/> <!-- 具体服务接口的实现 --> <bean id="userService" class="com.example.demo.server.UserServiceImpl"/> </beans> |
ProvideConfig.java
1 2 3 4 5 6 7 8 9 |
package com.example.demo.server; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; @Configuration @ImportResource({ "classpath:dubbo/*.xml" }) public class ProvideConfig { } |
UserServiceImpl.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com.example.demo.server; import com.example.demo.comm.model.user.UserModel; import com.example.demo.comm.service.UserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class UserServiceImpl implements UserService { Logger logger= LoggerFactory.getLogger(UserServiceImpl.class); @Override public UserModel insertUser(UserModel model) { //相关处理 model.setAddress("广东省珠海市香洲区"); model.setSex("男"); model.setPhone("130000000001"); System.out.println("服务提供者处理业务:"+model.toString()); return model; } } |
消费者: dubbo-consume.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?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="example-consume" /> <!-- 注册中心暴露服务地址 --> <dubbo:registry id="zookeeper" protocol="zookeeper" address="localhost:2181" /> <!-- 使用注解方式--> <dubbo:annotation package="com.example.demo"/> <!--引用服务配置,用于创建一个远程服务代理,一个引用可以指向多个注册中心。 引用com.example.demo.comm.service.UserService服务--> <dubbo:reference id="userService" interface="com.example.demo.comm.service.UserService" check="false" version="1.0" timeout="15000"/> </beans> |
ConsumeConfig.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package com.example.demo.client.config; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.ImportResource; @Configuration @ImportResource({"classpath:dubbo/*.xml"}) public class ConsumeConfig { /* *//** * 消费方应用信息,用于计算依赖关系 *//* @Bean public ApplicationConfig getApplicationConfig(){ ApplicationConfig config = new ApplicationConfig(); config.setName("consume"); config.setId("consumeId"); return config; } *//** * 注册中心暴露服务地址 *//* @Bean public RegistryConfig getRegistryConfig(){ RegistryConfig config = new RegistryConfig(); config.setAddress("zookeeper://localhost:2181"); return config; }*/ } |
BeanGetConfig.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.example.demo.client.config; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Configuration; @Configuration public class BeanGetConfig implements ApplicationContextAware { private static ApplicationContext context = null; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { BeanGetConfig.context = applicationContext; } public static Object getBean(String name) { return context.getBean(name); } public static Object getBean(Class<?> c) { return context.getBean(c); } } |
UserController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package com.example.demo.client.controller.user; import com.example.demo.comm.model.user.UserModel; import com.example.demo.comm.service.UserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @Api("用户模块") public class UserController { Logger logger= LoggerFactory.getLogger(UserController.class); @Autowired UserService userService; @RequestMapping(value = "/api/user",method = RequestMethod.GET) @ApiOperation(value = "用户模块新增", httpMethod = "GET", response = String.class, notes = "用户模块新增,提供用户管理-用户模块新增操作") public String insertUser(){ UserModel model = null; try { model = new UserModel(); model.setUserName("张飞"); System.out.println("参数:"+model.toString()); model=userService.insertUser(model); System.out.println("=======> 返回:"+model.toString()); } catch (Exception e) { e.printStackTrace(); } return model.toString(); } } |
注解方式:
=========================================================================
提供者:不是用 dubbo-provider.xml, ProvideConfig。 在application.properties增加配置
1 2 3 4 5 6 |
spring.dubbo.application.name=provide spring.dubbo.registry.address=zookeeper://127.0.0.1:2181 spring.dubbo.protocol.name=dubbo spring.dubbo.protocol.port=20881 spring.dubbo.scan=com.example.demo spring.dubbo.server=true |
在Application入口加入: @EnableDubboConfiguration,打开Dubbo的配置信息
UserServiceImpl.java, 注意@Service(interfaceName = “userService”, interfaceClass = UserService.class,version = “1.0”)里面的名字和版本,应为实现类多了Impl字符串
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
package com.example.demo.server; import com.alibaba.dubbo.config.annotation.Service; import com.example.demo.comm.model.user.UserModel; import com.example.demo.comm.service.UserService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Service(version = "1.0") //@Service(interfaceName = "userService", interfaceClass = UserService.class,version = "1.0") @Component public class UserServiceImpl implements UserService { Logger logger= LoggerFactory.getLogger(UserServiceImpl.class); @Override public UserModel insertUser(UserModel model) { //相关处理 model.setAddress("广东省珠海市香洲区"); model.setSex("男"); model.setPhone("130000000001"); System.out.println("服务提供者处理业务:"+model.toString()); return model; } } |
消费者:删除dubbo-consume.xml,ConsumeConfig.java,在application.properties增加配置
1 2 3 4 5 6 |
spring.dubbo.application.name=consume spring.dubbo.registry.address=zookeeper://127.0.0.1:2181 spring.dubbo.protocol.name=dubbo spring.dubbo.protocol.port=20881 spring.dubbo.scan=com.example.demo #spring.dubbo.server=true |
在Application入口加入: @EnableDubboConfiguration,打开Dubbo的配置信息
UserController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
package com.example.demo.client.controller.user; import com.alibaba.dubbo.config.annotation.Reference; import com.example.demo.comm.model.user.UserModel; import com.example.demo.comm.service.UserService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @Api("用户模块") public class UserController { Logger logger= LoggerFactory.getLogger(UserController.class); //@Reference(interfaceName = "userService",interfaceClass = UserService.class, version = "1.0") @Reference(version = "1.0") UserService userService; @RequestMapping(value = "/api/user",method = RequestMethod.GET) @ApiOperation(value = "用户模块新增", httpMethod = "GET", response = String.class, notes = "用户模块新增,提供用户管理-用户模块新增操作") public String insertUser(){ UserModel model = null; try { model = new UserModel(); model.setUserName("张飞"); System.out.println("参数:"+model.toString()); model=userService.insertUser(model); System.out.println("=======> 返回:"+model.toString()); } catch (Exception e) { e.printStackTrace(); } return model.toString(); } } |