新建两个web工程,一个用来提供service,另一个用来使用service。
dubbo是和spring整合的,依赖需要先有spring,再有dubbo
1. 服务提供者
1.1 pom.xml依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.2.9.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.6</version>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.7</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
</dependencies>
1.2 web.xml配置
<!-- Spring监听器加载dubbo-provider.xml -->
<!-- 加载路径 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:dubbo-provider.xml</param-value>
</context-param>
<!-- listener负责监听当程序部署到服务器的时候,进行启动,读取类路径底下的配置文件(类似于main,充当main的角色) -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
1.3 dubbo-provider.xml提供者配置
<?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的提供方配置: 4个 -->
<!-- 1. 根节点,定义提供方服务名称(唯一的) 访问的时候先找根节点 -->
<dubbo:application name="dubbodemo_provider"></dubbo:application>
<!-- 2. 配置Zookeeper连接
address的地址就是 zookeeper://ip地址 (ip地址:是zookeeper部署的电脑ip)
2181为zookeeper的默认端口(可以修改,修改zookeeper核心配置文件)
-->
<dubbo:registry address="zookeeper://localhost" port="2181"></dubbo:registry>
<!--<dubbo:registry address="zookeeper://192.168.21.45" port="2181"></dubbo:registry>-->
<!-- 3.定义dubbo协议
约定消费方和提供方之间传输格式,dubbo推荐的协议:dubbo协议
dubbo协议的访问方法 【dubbo://ip:port/类/方法】(二进制传输协议)
-->
<dubbo:protocol name="dubbo" port="20880"></dubbo:protocol>
<!-- 4.扫描dubbo提供方注解:也就是@Service注解(dubbo的)
导入@Service注解的时候要注意,有两个service,一个是spring的,另一个是dubbo的
我们需要导入dubbo的@Service注解(注入,让其可以被RBC调用)
-->
<dubbo:annotation package="com.xgf.service"></dubbo:annotation>
</beans>
1.4 编写服务接口及其实现类
IHelloWordService
public interface IHelloWordService {
public String sayHello(String name);
}
HelloServiceImpl
import com.alibaba.dubbo.config.annotation.Service;
import com.xgf.service.IHelloWordService;
//当前的服务类对象由spring管理
//但是此处不使用spring的@Service注解 ,应该使用具有RPC功能的dubbo的@Service注解(导包)
@Service(interfaceClass = IHelloWordService.class,loadbalance = "random")
public class HelloServiceImpl implements IHelloWordService {
@Override
public String sayHello(String name) {
return "Hello,"+name;
}
}
【注意】这里的@Service引入的包
import com.alibaba.dubbo.config.annotation.Service;
1.5 配置provider的tomcat服务器并启动
2. Dubbo服务消费者(调用服务)
要去调用provider中的Service,要求先注入Service,客户端服务接口类名称要与服务端接口名称一致;路径也要一致。
1)复制provider工程的service接口(路径名称要一致)
2)使用注入,但是不使用spring的autowire,而使用是dubbo的@Service配对的 @Reference注解
2.1 pom.xml依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.2.9.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- dubbo相关 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.6</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.32.Final</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.7</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
2.2 web.xml配置
如果是web工程可以使用listener来加载,如果是springmvc要使用前端控制器来加载
<!-- springmvc有一个前端控制器,可以读核心配置文件 (main方法 ) -->
<!-- springmvc核心控制加载dubbo消费方配置 -->
<!--配置springmvc-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 读取consumer消费者核心配置文件 -->
<param-value>classpath:dubbo-consumer.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 前端控制器 -->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- 拦截所有.do -->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
2.3 dubbo-consumer.xml消费者配置
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 一、springmvc配置 -->
<context:component-scan base-package="com.xgf.controller"></context:component-scan>
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 二、dubbo的消费方配置:3个 -->
<!-- 1.根节点,定义dubbo消费方服务名称 -->
<dubbo:application name="dubbodemo_consumer"></dubbo:application>
<!-- 2.配置Zookeeper连接(当前zookeeper部署地址是本机ip的localhost) -->
<dubbo:registry address="zookeeper://localhost" port="2181"></dubbo:registry>
<!-- 3.扫描dubbo消费注解:@Reference -->
<dubbo:annotation package="com.xgf.controller"></dubbo:annotation>
<!-- 让当前去获取provider的实现类对象 必须保护相同的id-->
<!-- <dubbo:reference interface="com.wzx.service.IHelloWordService"-->
<!-- id="helloWordService"/>-->
</beans>
2.4 复制provider的service接口到consumer的相同路径
//需要拷贝provider的service接口到consumer里面,而且要求文件路径一致【***】
//不然的话不能知道要调用的类有些什么方法
public interface IHelloWordService {
public String sayHello(String name);
}
2.5 配置controller调用service
@Controller
@RequestMapping("/test")
public class MyController {
//要去调用provider中的Service,要求先注入Service
//1 复制provider工程的service接口
//2 使用注入,但是不使用spring的autowire,而使用是dubbo的@Service配对的 @Reference注解
//@Autowired
// @Qualifier("helloWordService")
@Reference(check = true,loadbalance = "random")
IHelloWordService iHelloWordService; //去provider取对象,用@Reference注解
@RequestMapping(path = "/test01",method = {RequestMethod.GET,RequestMethod.POST})
@ResponseBody
public String test01(String name){
String result = iHelloWordService.sayHello(name);
return result; //ResponseBody将r返回结果转成json
}
}
2.6 配置tomcat服务器并启动
【注意】这里tomcat服务器的端口需要修改,不能和前面配置的provider提供者的tomcat端口相同(不然无法启动)
启动成功: