目录
- 一、公共pom
- 二、service-api
- 三、service-provider
- 1、pom中引用service-api
- 2、接口实现类
- 3、配置文件
- 4、启动类
- 四、service-consumer
- 1、pom中引用service-api
- 2、定义类调用接口中的方法
- 3、配置
- 4、启动类
- 五、测试
- (一)服务端
- (二)客户端
- 六、注意
- 1、provider
- 2、consumer
创建一个maven项目,并创建3个module
通过maven的父工程来统一依赖的版本。
程序实现分为以下几步骤:
- 建立maven工程 并且 创建API模块:用于规范双方接口协定
- 提供provider模块,引入API模块,并且对其中的服务进行实现。将其注册到注册中心上,对外来统一提供服务。
- 提供consumer模块,引入API模块,并且引入与提供者相同的注册中心。再进行服务调用。
一、公共pom
<properties>
<dubbo.version>2.7.5 </dubbo.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-rpc-dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-netty4</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-serialization-hessian2</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-common</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- 日志配置 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<!-- json数据化转换 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.70</version>
</dependency>
</dependencies>
二、service-api
定义一个接口
package com.lagou.service;
public interface HelloService {
String sayHello(String name, int timeMills);
}
三、service-provider
1、pom中引用service-api
<dependencies>
<!-- 引入service-api -->
<dependency>
<groupId>com.lagou</groupId>
<artifactId>service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 引入Dubbo相关依赖,这里为了方便,使用注解方式。 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-rpc-dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-netty4</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-serialization-hessian2</artifactId>
</dependency>
</dependencies>
2、接口实现类
package com.lagou.service.impl;
import com.lagou.service.HelloService;
import org.apache.dubbo.config.annotation.Service;
@Service
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name, int timeMills) {
try {
Thread.sleep(timeMills);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "【这里是服务端】hello:" + name;
}
}
注意:@Service是dubbo中的。用来声明这个类是一个服务的提供者。
3、配置文件
dubbo-provider.properties
放入到resources 目录下。
dubbo.application.name=service-provider
dubbo.protocol.name=dubbo
dubbo.protocol.port=20889
- dubbo.application.name:当前提供者的名称
- dubbo.protocol.name:对外提供的时候使用的协议
- dubbo.protocol.port: 该服务对外暴露的端口是什么,在消费者使用时,则会使用这个端口并且使用指定的协议与提供者建立连接。
4、启动类
ProviderMain
package com.lagou;
import org.apache.dubbo.config.RegistryConfig;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
public class ProviderMain {
public static void main(String[] args) throws Exception{
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
context.start();
System.in.read();
}
@Configuration
@EnableDubbo(scanBasePackages = "com.lagou.service.impl")
@PropertySource("classpath:/dubbo-provider.properties")
static class ProviderConfiguration{
@Bean
public RegistryConfig registryConfig(){
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181?timeout=10000");
//registryConfig.setTimeout(10000);
return registryConfig;
}
}
}
四、service-consumer
1、pom中引用service-api
<dependencies>
<!-- 引入service-api -->
<dependency>
<groupId>com.lagou</groupId>
<artifactId>service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 引入Dubbo相关依赖,这里为了方便,使用注解方式。 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-zookeeper</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-rpc-dubbo</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-remoting-netty4</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-serialization-hessian2</artifactId>
</dependency>
</dependencies>
2、定义类调用接口中的方法
ConsumerComponent
编写服务,用于真实的引用dubbo接口并使用。
@Reference :指向真实的第三方服务接口。
package com.lagou.bean;
import com.lagou.service.HelloService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Component;
@Component
public class ConsumerComponent {
@Reference
private HelloService helloService;
public String sayHello(String name, int timeMills) {
return helloService.sayHello(name, timeMills);
}
}
3、配置
dubbo-consumer.properties
dubbo.application.name=service-comsumer
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.consumer.timeout=10000
4、启动类
package com.lagou;
import com.lagou.bean.ConsumerComponent;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import java.io.IOException;
public class AnnotationConsumerMain {
public static void main(String[] args) throws IOException {
System.out.println("-------------");
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
context.start();
System.out.println("Consumer启动成功!");
// 获取消费者组件
ConsumerComponent service = context.getBean(ConsumerComponent.class);
System.out.println("获取service对象成功!");
while (true) {
System.in.read();
String hello = service.sayHello("world",3000);
System.out.println("result:" + hello);
}
}
@Configuration
@PropertySource("classpath:/dubbo-consumer.properties")
@ComponentScan(basePackages = "com.lagou.bean")
@EnableDubbo(scanBasePackages = "com.lagou.service")
static class ConsumerConfiguration {
}
}
五、测试
(一)服务端
(二)客户端
此时,控制台随便输入内容之后回车,报错
org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer.
解决方法:加上timeout
加上之后,允许成功,可以接受到服务端发送过来的消息
六、注意
provider和consumer配置zookeeper的注册中心配置的两种不同方式
1、provider
注册中心地址在代码中配置
@Configuration
@EnableDubbo(scanBasePackages = "com.lagou.service.impl")
@PropertySource("classpath:/dubbo-provider.properties")
static class ProviderConfiguration {
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181?timeout=10000000");
return registryConfig;
}
}
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
context.start();
2、consumer
注册中心地址在dubbo-consumer.properties中配置
dubbo.registry.address=zookeeper://127.0.0.1:2181
@Configuration
@PropertySource("classpath:/dubbo-consumer.properties")
@ComponentScan(basePackages = "com.lagou.bean")
@EnableDubbo(scanBasePackages = "com.lagou.service")
static class ConsumerConfiguration {
}
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
context.start();