Dubbo使用步骤
SpringBoot方式
第一步: 引入依赖
在服务提供者、消费者工程中的pom.xml文件中添加如下依赖
<!-- Dubbo Spring Boot Starter -->
<!-- 引入Dubbo核心库,并引入SpringBoot自动配置依赖 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- 引入SpringBoot依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 引入Zookeeper服务注册中心依赖(可选,取决于用什么注册中心,如果是Redis,就换成Jedis依赖) -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 通常还会将服务提供者所提供的服务接口抽成一个单独的maven模块, 通过依赖的形式加到服务提供方和消费方工程中,方便维护 -->
第二步:配置Dubbo相关参数
服务提供方
服务提供方需要配置:
- 应用名称
- 服务注册中心地址
- 服务暴露的协议、端口、Host(可选)
application.yml
dubbo:
application:
name: demo-provider
qos-enable: false #用于运维的监控服务, 默认是开启状态,并且端口是22222。开发环境为了避免端口冲突,建议直接关掉
registry:
address: zookeeper://10.10.14.120:2181?client=curator
protocol:
name: dubbo
port: 20883
host: 10.10.14.236
服务消费方
消费方需要配置:
- 应用名称
- 服务注册中心地址
application.yml
dubbo:
application:
name: demo-consumer
qos-enable: false
registry:
address: zookeeper://10.10.14.120:2181?client=curator
第三步:写代码
定义服务接口
public interface IHello {
String sayHello();
String sayHello(String name);
}
实现服务提供者
import com.lanou3g.dubbo.api.IHello;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Value;
@Service(version = "1.0.0") // 使用apache包下的@Service注解来对外暴露服务
public class HelloServiceImpl implements IHello {
@Value("${dubbo.protocol.host}")
private String host;
@Value("${dubbo.protocol.port}")
private int port;
public String sayHello() {
String msg = "当前服务端口: " + port;
msg += ", host: " + host;
msg += " ----> Hello Dubbo";
System.out.println(msg);
return msg;
}
public String sayHello(String name) {
String msg = "当前服务端口: " + port;
msg += ", host: " + host;
msg += " ----> "+ name;
System.out.println(msg);
return msg;
}
}
启动类:
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import java.io.IOException;
@EnableDubbo(scanBasePackages = "com.lanou3g.dubbo.service.impl")
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) throws IOException {
SpringApplication.run(ProviderApplication.class, args);
System.out.println("Provider启动完成");
}
}
实现服务消费者
import com.lanou3g.dubbo.api.IHello;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import javax.annotation.PostConstruct;
import java.io.IOException;
@SpringBootApplication
public class ConsumerApplication {
@Reference(version = "1.0.0") // 使用apache包下的@Reference注解来引用远程服务,然后就可以像调用本地代码一样来使用
private IHello helloService;
@PostConstruct
public void testInvokeService() {
String msg = helloService.sayHello();
System.out.println(msg);
}
public static void main(String[] args) throws IOException {
SpringApplication.run(ConsumerApplication.class, args);
}
}
Spring方式使用
第一步:引入依赖
服务提供者、服务消费者依赖:
<dependency>
<groupId>com.lanou3g</groupId>
<artifactId>demo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
<!-- Redis注册中心依赖 -->
<!--<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>-->
<!-- Zookeeper注册中心依赖 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
第二步:配置Dubbo相关的Bean
服务提供者
<?xml version="1.0" encoding="UTF-8"?>
<!-- 加入dubbo schema -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 配置dubbo应用相关参数 -->
<dubbo:application name="demo-provider">
<dubbo:parameter key="qos.enable" value="false" />
<!-- <dubbo:parameter key="qos.enable" value="true" />
<dubbo:parameter key="qos.accept.foreign.ip" value="false" />
<dubbo:parameter key="qos.port" value="22222" />-->
</dubbo:application>
<!-- 使用multicast广播注册中心暴露服务地址 -->
<!--<dubbo:registry address="multicast://224.5.6.7:1234" />-->
<!-- 使用redis注册中心暴露服务地址 -->
<!--<dubbo:registry address="redis://127.0.0.1:6379" />-->
<!-- 使用zookeeper注册中心暴露服务地址 -->
<!--<dubbo:registry address="zookeeper://10.10.14.120:2181" />-->
<!--<dubbo:registry protocol="zookeeper" address="10.10.14.120:2181,10.10.14.149:2182,10.10.14.163:2183" client="curator" />-->
<dubbo:registry protocol="zookeeper" address="10.10.14.120:2181,10.10.14.120:2182,10.10.14.120:2183" client="curator" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" host="10.10.14.236" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.lanou3g.dubbo.api.IHello" ref="helloService" version="1.0.0" />
<!-- 和本地bean一样实现服务 -->
<bean id="helloService" class="com.lanou3g.dubbo.service.impl.HelloServiceImpl" />
</beans>
服务消费者
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="demo-consumer">
<dubbo:parameter key="qos.enable" value="false" />
<!-- <dubbo:parameter key="qos.enable" value="true" />
<dubbo:parameter key="qos.accept.foreign.ip" value="false" />
<dubbo:parameter key="qos.port" value="33333" />-->
</dubbo:application>
<!-- 使用multicast广播注册中心暴露发现服务地址 -->
<!--<dubbo:registry address="multicast://224.5.6.7:1234?unicast=false" />-->
<!-- 使用redis注册中心发现服务地址 -->
<!--<dubbo:registry address="redis://127.0.0.1:6379" />-->
<!-- 使用zookeeper注册中心暴露服务地址 -->
<!--<dubbo:registry address="zookeeper://10.10.14.120:2181" />-->
<dubbo:registry protocol="zookeeper" address="10.10.14.120:2181,10.10.14.120:2182,10.10.14.120:2183" client="curator" />
<!--<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183" client="curator" />-->
<!-- 生成远程服务代理,可以和本地bean一样使用helloService -->
<!-- 通过服务注册中心引用远程服务 -->
<!-- id属性不能省略, 名称可以和提供方id不一样,但是不能省 -->
<dubbo:reference id="helloService" interface="com.lanou3g.dubbo.api.IHello" version="1.0.0"/>
<!-- 采用服务直连的方式,实现服务消费者直接调用远程指定地址的服务,这种情况下,可以不配置注册中心(一般用在开发测试环境) -->
<!--<dubbo:reference id="helloService" interface="com.lanou3g.dubbo.api.IHello" version="1.0.0" url="dubbo://10.10.14.236:20880" />-->
</beans>
第三步:写代码
定义服务接口
参考上面SpringBoot方式定义的接口IHello
实现服务提供者
对外暴露的服务接口实现类
public class HelloServiceImpl implements IHello {
public String sayHello() {
System.out.println("Hello Dubbo");
return "Hello Dubbo";
}
public String sayHello(String name) {
String msg = "Hello, " + name;
System.out.println(msg);
return msg;
}
}
服务提供方应用启动类
public class ProviderLauncher {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ctx.start();
System.out.println("Provider启动完成");
// 阻止程序退出, 直到输入一个任意字符后才退出
System.in.read();
}
}
实现服务消费者
import com.lanou3g.dubbo.api.IHello;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
public class ConsumerLauncher {
public static void main(String[] args) throws IOException {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ctx.start();
// 像使用本地bean一样引用远程的Service
IHello helloService = ctx.getBean(IHello.class);
String msg = helloService.sayHello();
System.out.println(msg);
String msg1 = helloService.sayHello("World!");
System.out.println(msg1);
System.in.read();
}
}