spring集成dubbo:spring+dubbo+zookeeper

Dubbo介绍

  Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是阿里巴巴 SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

  Dubbo 采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spring的Schema扩展进行加载。

执行流程

avatar
|节点|角色说明|
|–|–|
|Container|服务运行的容器|
|Provider|服务提供者|
|Registry|注册中心|
|Consumer|服务消费者|
|Monitor|统计服务的调用次数和调用时间的监控中心|

  1. 将服务提供者运行在容器中(如tomcat)
  2. 服务提供者在容器中注册服务
  3. 消费者找到注册中心消费具体服务
  4. 注册中心返回给消费者需要的服务
  5. 消费者调用服务
  6. 记录本次调用

使用

Dubbo需要三个模块

  1. Provider(服务提供者)
  2. Comsumer(消费者)
  3. API接口

结构预览

avatar

1. 注册中心

  注册中心使用zookeeper,如未安装请百度。

  启动zookeeper,作者2181端口

2. 创建父项目

  • 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
    <?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>dubbo_test</groupId>
    <artifactId>cn.zhangxing.dubbo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
    <module>api</module>
    <module>comsumer</module>
    <module>provider</module>
    </modules>

    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.1.5.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.5.9</version>
    <exclusions>
    <exclusion>
    <groupId>org.springframework</groupId>
    <artifactId>spring</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
    <dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
    </dependency>
    </dependencies>

    </project>

3. API模块

  • 创建服务接口

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package com.zhangxing.dubbo.service;

    /**
    * @author zhangxing
    * @date 2019/2/24
    */
    public interface DubboService {

    String say(String msg);

    }
  • 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
    <?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">
    <parent>
    <artifactId>cn.zhangxing.dubbo</artifactId>
    <groupId>dubbo_test</groupId>
    <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>api</artifactId>

    <dependencies>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    </dependency>
    </dependencies>

    </project>

4. Provider模块

  • 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
<?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">
<parent>
<artifactId>cn.zhangxing.dubbo</artifactId>
<groupId>dubbo_test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<artifactId>provider</artifactId>

<packaging>war</packaging>

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>dubbo_test</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

</project>
  • DubboServiceImpl.java

实现了API模块中的接口,用于暴露给消费者使用

==PS : @Service中需要指明id,后面有用==

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.zhangxing.dubbo.service.impl;

import com.zhangxing.dubbo.service.DubboService;
import org.springframework.stereotype.Service;

/**
* @author zhangxing
* @date 2019/2/24
*/
@Service("dubboServiceImpl")
public class DubboServiceImpl implements DubboService {

@Override
public String say(String msg) {
return "hello " + msg;
}

}
  • applicationContext.xml

此处与spring集成

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
<?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"
xmlns:context="http://www.springframework.org/schema/context"
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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">


<!-- 扫描包加载Service实现类 -->
<context:component-scan base-package="com.zhangxing.dubbo.service.impl"/>

<!-- 应用名 -->
<dubbo:application name="dubbo-provider"/>
<!-- 连接到注册中心zookeeper,地址为127.0.0.1:2181 -->
<!-- 也可以写成<dubbo:registry address="zookeeper://localhost:2181"/> -->
<dubbo:registry address="127.0.0.1:2181" protocol="zookeeper"/>
<!-- 用dubbo协议在12345端口暴露服务 -->
<dubbo:protocol name="dubbo" port="12345"/>
<!-- 声明需要暴露的服务接口 -->
<!-- dubboServiceImpl是DubboService接口的实现类 -->
<!-- 所以在service包中的@Service应该指明id,如@Service("dubboServiceImpl") -->
<dubbo:service interface="com.zhangxing.dubbo.service.DubboService" ref="dubboServiceImpl" timeout="60000"/>

</beans>

==最后一行的dubboServiceImpl来自@Service中指明的id==

  • web.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
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">

<!-- 解决post乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

</web-app>

5. Comsumer模块

  • 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
<?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">
<parent>
<artifactId>cn.zhangxing.dubbo</artifactId>
<groupId>dubbo_test</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>

<packaging>war</packaging>

<artifactId>comsumer</artifactId>

<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>dubbo_test</groupId>
<artifactId>api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>

</project>
  • DubboController.java

注入从提供者获取到的服务dubboService

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
package com.zhangxing.dubbo;

import com.zhangxing.dubbo.service.DubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
* @author zhangxing
* @date 2019/2/24
*/

@Controller
public class DubboController {

@Autowired
private DubboService dubboService;

@RequestMapping(value = "/say")
@ResponseBody
public String say(String msg) {
String result = dubboService.say(msg);
return result;

}

}
  • spring-mvc.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
<?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"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">

<!-- 扫描包 -->
<context:component-scan base-package="com.zhangxing.dubbo"/>
<context:annotation-config></context:annotation-config>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>

<!-- 应用名 -->
<dubbo:application name="dubbo-comsumer"/>
<!-- 连接到哪个注册中心-->
<dubbo:registry address="127.0.0.1:2181" protocol="zookeeper"/>
<!-- 消费者使用什么协议+端口获取服务 -->
<dubbo:protocol name="dubbo" port="12345"/>
<!-- 提供哪些接口给消费者调用 -->
<dubbo:reference id="dubboService" interface="com.zhangxing.dubbo.service.DubboService"/>
</beans>
  • web.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
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">

<!-- 解决post乱码 -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>

测试

1. 运行zookeeper

  此处跳过

2. 启动Provider模块

  HTTP端口8080
  JMX端口1099

3. 启动comsumer模块

  ==请避开HTTP端口和JMX端口冲突==
  HTTP端口8081
  JMX端口1098

4. 输入地址

http://localhost:8081/say?msg=world

网页输出:hello world

测试成功

坚持学习发博,请支持我的原创!