dubbo+spring+springboot入门案例搭建

浅浅的花香味﹌ 2022-02-22 02:24 396阅读 0赞
  1. 不同服务之间或者多服务之间调用接口的场景实际中会经常遇到,目前市面上解决该问题比较流行的两大框架为dubbospringcloud
  2. 今天简单的建一个dubbo入门的案例,分为两个小案例一个和spring和结合案例,另一个是和springboot结合的案例,这里需要知道一点,dubbo是依赖spring环境的,不可以单独使用。搭建dubbo案例,需要安装zookeeper,可以从网上下载一个,解压后运行zkServer.cmd即可,zookeeper默认端口2181

1、dubbo+spring 的方式搭建

**1) 首先如果一个服务对其他服务公开接口,那么我们需要将这些对外的公共接口单独拿出来。第一步就是新建一个单独的公共接口模块**

  1. ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nbGVpMDgyMzE5_size_16_color_FFFFFF_t_70][]
  2. 这里为了简单,只有一个用户接口
  3. public interface UserService {
  4. /**
  5. * 获取用户名称
  6. */
  7. String userName();
  8. /**
  9. * 获取用户ID
  10. */
  11. String userId();
  12. }

2)、新建一个dubbo集成spring的服务模块

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nbGVpMDgyMzE5_size_16_color_FFFFFF_t_70 1

  1. dubbo的服务模块,这里以最简易的方式搭建,一个公共接口实现类,一个服务启动类,一个dubbo配置文件。
  2. 我们先看看pom需要引入的依赖,这里是父pom.xml
  3. <?xml version="1.0" encoding="UTF-8"?>
  4. <project xmlns="http://maven.apache.org/POM/4.0.0"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  7. <modelVersion>4.0.0</modelVersion>
  8. <groupId>com.zl.dubbo</groupId>
  9. <artifactId>dubbo_demo</artifactId>
  10. <packaging>pom</packaging>
  11. <version>1.0-SNAPSHOT</version>
  12. <modules>
  13. <module>api</module>
  14. <module>client</module>
  15. <module>service</module>
  16. <module>bootServer</module>
  17. <module>bootClient</module>
  18. </modules>
  19. <properties>
  20. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  21. <maven.compiler.source>1.7</maven.compiler.source>
  22. <maven.compiler.target>1.7</maven.compiler.target>
  23. <springframework.version>4.0.2.RELEASE</springframework.version>
  24. <dubbo.version>2.5.7</dubbo.version>
  25. </properties>
  26. <dependencies>
  27. <dependency>
  28. <groupId>org.springframework</groupId>
  29. <artifactId>spring-core</artifactId>
  30. <version>${springframework.version}</version>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework</groupId>
  34. <artifactId>spring-context</artifactId>
  35. <version>${springframework.version}</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>org.springframework</groupId>
  39. <artifactId>spring-webmvc</artifactId>
  40. <version>${springframework.version}</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>com.101tec</groupId>
  44. <artifactId>zkclient</artifactId>
  45. <version>0.3</version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.apache.zookeeper</groupId>
  49. <artifactId>zookeeper</artifactId>
  50. <version>3.4.5</version>
  51. </dependency>
  52. <dependency>
  53. <groupId>com.alibaba</groupId>
  54. <artifactId>dubbo</artifactId>
  55. <version>${dubbo.version}</version>
  56. <scope>compile</scope>
  57. <exclusions>
  58. <exclusion>
  59. <artifactId>spring</artifactId>
  60. <groupId>org.springframework</groupId>
  61. </exclusion>
  62. </exclusions>
  63. </dependency>
  64. </dependencies>
  65. </project>
  66. 当前服务模块的pom.xml:只需要引下父模块即可
  67. <?xml version="1.0" encoding="UTF-8"?>
  68. <project xmlns="http://maven.apache.org/POM/4.0.0"
  69. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  70. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  71. <parent>
  72. <artifactId>dubbo_demo</artifactId>
  73. <groupId>com.zl.dubbo</groupId>
  74. <version>1.0-SNAPSHOT</version>
  75. </parent>
  76. <modelVersion>4.0.0</modelVersion>
  77. <artifactId>service</artifactId>
  78. <dependencies>
  79. <dependency>
  80. <groupId>com.zl.dubbo</groupId>
  81. <artifactId>api</artifactId>
  82. <version>1.0-SNAPSHOT</version>
  83. <scope>compile</scope>
  84. </dependency>
  85. </dependencies>
  86. </project>
  87. UserService公共接口实现类: **注意:这里的@Service注解时dubbo提供的注解,不是spring的注解!**
  88. @Service
  89. public class UserServiceImpl implements UserService {
  90. @Override
  91. public String userName() {
  92. return "张三";
  93. }
  94. @Override
  95. public String userId() {
  96. return "10001";
  97. }
  98. }
  99. dubbo集成spring配置文件: 这里的dubbo我们使用注解的方式 dubbo-annotation.xml
  100. <?xml version="1.0" encoding="UTF-8"?>
  101. <beans xmlns="http://www.springframework.org/schema/beans"
  102. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  103. xmlns:context="http://www.springframework.org/schema/context"
  104. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  105. xsi:schemaLocation="http://www.springframework.org/schema/beans
  106. http://www.springframework.org/schema/beans/spring-beans.xsd
  107. http://www.springframework.org/schema/context
  108. http://www.springframework.org/schema/context/spring-context-3.1.xsd
  109. http://code.alibabatech.com/schema/dubbo
  110. http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  111. <!--<context:component-scan base-package="com.zl"/>-->
  112. <!-- 提供方应用信息,用于计算依赖关系 -->
  113. <dubbo:application name="storeServer_annotation"/>
  114. <!-- 使用zookeeper注册中心暴露服务地址 -->
  115. <dubbo:registry address="zookeeper://192.168.0.101:2181"/>
  116. <!-- dubbo协议在20880端口暴露服务 -->
  117. <dubbo:protocol name="rmi" port="20880"/>
  118. <dubbo:annotation package="com.zl.service" />
  119. </beans>
  120. 以及最后一个启动类: Application.class
  121. public class Application {
  122. public static void main(String[] args) throws IOException {
  123. ClassPathXmlApplicationContext context =
  124. new ClassPathXmlApplicationContext("classpath:dubbo-annotation.xml");
  125. //开启
  126. context.start();
  127. System.out.println("启动成功……");
  128. System.in.read(); //避免程序结束,这里需要阻塞
  129. }
  130. }

到此位置 ,dubbo服务端编写完毕

3)、编写客户端模块

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nbGVpMDgyMzE5_size_16_color_FFFFFF_t_70 2

客户端模块,这里主要作用是调用服务端接口,返回接口测试。为了简单java代码只有一个controller

  1. 这里是使用spring,所以我们为了测试需要集成tomcat,使用web.xml进行启动客户端服务进行测试。
  2. 首先需要新建客户端controller @ReferenceDubbo提供的注解。这里的UserServiceDubbo通过zookeeper反射生成的一个代理对象,具体原理后面自行百度。
  3. @Controller
  4. public class UserController {
  5. @Reference
  6. private UserService userService;
  7. @GetMapping("/index")
  8. public String user(HttpServletRequest request){
  9. String userId = userService.userId();
  10. String userName = userService.userName();
  11. request.setAttribute("userId",userId);
  12. request.setAttribute("userName",userName);
  13. return "index";
  14. }
  15. }

新建dubbo配置文件以及springMvc配置文件。 dubbo-annotation.xml ; spring-mvc.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context-3.1.xsd
  10. http://code.alibabatech.com/schema/dubbo
  11. http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
  12. <!-- 提供方应用信息,用于计算依赖关系 -->
  13. <dubbo:application name="enjoyStore_annotation"/>
  14. <!-- 使用zookeeper注册中心暴露服务地址 -->
  15. <dubbo:registry address="zookeeper://192.168.0.101:2181" check="false"/>
  16. <dubbo:annotation package="com.zl.client.controller" />
  17. </beans>
  18. <?xml version="1.0" encoding="UTF-8"?>
  19. <beans xmlns="http://www.springframework.org/schema/beans"
  20. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
  21. xmlns:context="http://www.springframework.org/schema/context"
  22. xmlns:mvc="http://www.springframework.org/schema/mvc"
  23. xsi:schemaLocation="http://www.springframework.org/schema/beans
  24. http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
  25. http://www.springframework.org/schema/context
  26. http://www.springframework.org/schema/context/spring-context-3.1.xsd
  27. http://www.springframework.org/schema/mvc
  28. http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
  29. <context:component-scan base-package="com.zl.client.controller"></context:component-scan>
  30. <mvc:annotation-driven/>
  31. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  32. <property name="prefix" value="/"></property>
  33. <property name="suffix" value=".jsp"></property>
  34. </bean>
  35. <import resource="dubbo_annotation.xml"/>
  36. </beans>
  37. 后面是web.xml
  38. <?xml version="1.0" encoding="UTF-8"?>
  39. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  40. xmlns="http://java.sun.com/xml/ns/javaee"
  41. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  42. version="3.0">
  43. <display-name>Archetype Created Web Application</display-name>
  44. <!-- Spring MVC servlet -->
  45. <servlet>
  46. <servlet-name>SpringMVC</servlet-name>
  47. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  48. <init-param>
  49. <param-name>contextConfigLocation</param-name>
  50. <param-value>classpath:spring-mvc.xml</param-value>
  51. </init-param>
  52. <load-on-startup>1</load-on-startup>
  53. <async-supported>true</async-supported>
  54. </servlet>
  55. <servlet-mapping>
  56. <servlet-name>SpringMVC</servlet-name>
  57. <!-- 此处可以可以配置成*.do,对应struts的后缀习惯 -->
  58. <url-pattern>/</url-pattern>
  59. </servlet-mapping>
  60. <welcome-file-list>
  61. <welcome-file>/index.jsp</welcome-file>
  62. </welcome-file-list>
  63. </web-app>
  64. 以及一个简单的jsp页面,显示用户名和名称
  65. <%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="UTF-8"%>
  66. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  67. <html>
  68. <body>
  69. <h2>Hello World!666</h2>
  70. <h2>用户ID: ${userId}</h2>
  71. <h2>用户名: ${userName}</h2>
  72. </body>
  73. </html>

到此位置,客户端服务搭建完毕。好了,我们启动开始测试吧。

先启动服务端:即运行Application类的main方法。

  1. 然后为客户端client添加一个tomcat容器,启动。
  2. 访问: http://localhost:8080/index

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nbGVpMDgyMzE5_size_16_color_FFFFFF_t_70 3

发现数据获取完毕,我们在打个断点看看。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nbGVpMDgyMzE5_size_16_color_FFFFFF_t_70 4

发现这个userService对象的确是一个代理对象。 结束!

2、使用dubbo+springboot搭建案例

搭建完spring的案例,springboot就更简单了。

1)、首先一样的道理,公共接口模块已经定义好了,这里不需要定义了。我们从服务端模块开始

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nbGVpMDgyMzE5_size_16_color_FFFFFF_t_70 5

application.yml配置 : 端口、dubbo.name随便设置

  1. server:
  2. port: 8090
  3. dubbo:
  4. name: serverBoot
  5. zookeeper: zookeeper://192.168.0.101:2181

UserService实现类: UserServiceImpl.class

  1. @Service
  2. public class UserServiceImpl implements UserService{
  3. @Override
  4. public String userName() {
  5. return "李四";
  6. }
  7. @Override
  8. public String userId() {
  9. return "10003";
  10. }
  11. }
  12. springboot这里就用@Bean注解来进行配置了:DubboBean.class
  13. @Configuration
  14. public class DubboBean {
  15. @Value("${dubbo.zookeeper}")
  16. private String zkAddr;
  17. @Value("${dubbo.name}")
  18. private String appName;
  19. @Bean
  20. public ApplicationConfig applicationConfig() {
  21. ApplicationConfig applicationConfig = new ApplicationConfig();
  22. applicationConfig.setName(appName);
  23. return applicationConfig;
  24. }
  25. @Bean
  26. public RegistryConfig registryConfig() {
  27. RegistryConfig registryConfig = new RegistryConfig();
  28. registryConfig.setAddress(zkAddr);
  29. return registryConfig;
  30. }
  31. @Bean
  32. public ProtocolConfig protocolConfig() {
  33. ProtocolConfig protocolConfig = new ProtocolConfig();
  34. protocolConfig.setName("dubbo");
  35. protocolConfig.setPort(20881);
  36. return protocolConfig;
  37. }
  38. }
  39. 最后一个启动类
  40. @SpringBootApplication
  41. @DubboComponentScan(basePackages = "com.zl.service")
  42. public class Application {
  43. public static void main(String[] args) {
  44. SpringApplication.run(Application.class,args);
  45. }
  46. }

2)、客户端

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nbGVpMDgyMzE5_size_16_color_FFFFFF_t_70 6

  1. application.yml配置:
  2. server:
  3. port: 8082
  4. dubbo:
  5. name: serverBoot
  6. zookeeper: zookeeper://192.168.0.101:2181
  7. UserController.class
  8. @RestController
  9. public class UserController {
  10. @Reference
  11. private UserService userService;
  12. @GetMapping("/user")
  13. public String user(){
  14. String userId = userService.userId();
  15. String userName = userService.userName();
  16. return "用户ID: "+userId+", 用户名称:"+userName;
  17. }
  18. }
  19. DubboInit.class 配置类
  20. @Configuration
  21. public class DubboInit {
  22. @Value("${dubbo.zookeeper}")
  23. private String zkAddr;
  24. @Value("${dubbo.name}")
  25. private String appName;
  26. @Bean
  27. public ApplicationConfig applicationConfig() {
  28. ApplicationConfig applicationConfig = new ApplicationConfig();
  29. applicationConfig.setName(appName);
  30. return applicationConfig;
  31. }
  32. @Bean
  33. public RegistryConfig registryConfig() {
  34. RegistryConfig registryConfig = new RegistryConfig();
  35. registryConfig.setAddress(zkAddr);
  36. return registryConfig;
  37. }
  38. }

最后一个启动类:

  1. @SpringBootApplication
  2. @DubboComponentScan("com.zl.client")
  3. public class Application {
  4. public static void main(String[] args) {
  5. SpringApplication.run(Application.class,args);
  6. }
  7. }

大功告成,老套路,先启动服务模块,然后启动客户端模块

访问:http://localhost:8082/user

20190408211623435.png

  1. 我们在打个断点卡看看:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nbGVpMDgyMzE5_size_16_color_FFFFFF_t_70 7

到此位置,dubbo案例搭建+测试完毕,我们再来看看整个案例的总体模块划分

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW5nbGVpMDgyMzE5_size_16_color_FFFFFF_t_70 8

以上,有帮助的点个赞啊!

发表评论

表情:
评论列表 (有 0 条评论,396人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Dubbo 入门

    一、背景与架构(摘自官网) 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不