一. 准备注册中心

dubbo的注册中心在生产环境中,一般都会选择 ZooKeeper 下载 ZooKeeper ZooKeeper_3.4.14下载地址启动ZK

# 解压安装包

tar -zxvf zookeeper-3.4.14.tar.gz

# 进入安装目录,

cp conf/zoo_sample.cfg conf/zoo.cfg

# 启动ZK

./bin/zkServer.sh start

二. 根据 xml 配置

1. Provider 准备

一. 引入依赖

org.apache.dubbo

dubbo-demo-interface

${project.parent.version}

org.apache.dubbo

dubbo-registry-multicast

org.apache.dubbo

dubbo-registry-nacos

com.alibaba.nacos

nacos-client

org.apache.dubbo

dubbo-registry-zookeeper

org.apache.dubbo

dubbo-configcenter-zookeeper

org.apache.dubbo

dubbo-configcenter-nacos

org.apache.dubbo

dubbo-metadata-report-nacos

org.apache.dubbo

dubbo-metadata-report-zookeeper

org.apache.dubbo

dubbo-rpc-dubbo

org.apache.dubbo

dubbo-config-spring

org.apache.dubbo

dubbo-remoting-netty4

org.apache.dubbo

dubbo-serialization-hessian2

org.apache.dubbo

dubbo-qos

二. 服务接口

这个接口需要被 Provider 中的服务具体实现,同时也能被 Consumer 引用,所有可以考虑将所有 dubbo中的接口封装在一个二方包中,这样 Provider, Consumer 引入同一个包即可。

package org.apache.dubbo.demo;

import java.util.concurrent.CompletableFuture;

public interface DemoService {

String sayHello(String name);

default CompletableFuture sayHelloAsync(String name) {

return CompletableFuture.completedFuture(sayHello(name));

}

}

三. 编写service

package org.apache.dubbo.demo.provider;

import org.apache.dubbo.demo.DemoService;

import org.apache.dubbo.rpc.RpcContext;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.util.concurrent.CompletableFuture;

public class DemoServiceImpl implements DemoService {

private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);

@Override

public String sayHello(String name) {

logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();

}

@Override

public CompletableFuture sayHelloAsync(String name) {

return CompletableFuture.supplyAsync(() -> "async result");

}

}

四. 在xml中配置 service

xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"

xmlns="http://www.springframework.org/schema/beans"

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">

五. 启动 Provider

package org.apache.dubbo.demo.provider;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Application {

public static void main(String[] args) throws Exception {

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml");

context.start();

System.in.read();

}

}

2. Consumer 准备

一. 引入依赖

org.apache.dubbo

dubbo-metadata-report-zookeeper

org.apache.dubbo

dubbo-demo-interface

${project.parent.version}

org.apache.dubbo

dubbo-registry-multicast

org.apache.dubbo

dubbo-registry-nacos

com.alibaba.nacos

nacos-client

org.apache.dubbo

dubbo-registry-zookeeper

org.apache.dubbo

dubbo-configcenter-zookeeper

org.apache.dubbo

dubbo-configcenter-nacos

org.apache.dubbo

dubbo-metadata-report-nacos

org.apache.dubbo

dubbo-config-spring

org.apache.dubbo

dubbo-rpc-dubbo

org.apache.dubbo

dubbo-remoting-netty4

org.apache.dubbo

dubbo-serialization-hessian2

二. 在xml中配置 service

因为已经引入了 interface 包 可以直接配置:

xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"

xmlns="http://www.springframework.org/schema/beans"

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">

三. 启动 Consumer

package org.apache.dubbo.demo.consumer;

import org.apache.dubbo.demo.DemoService;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.util.concurrent.CompletableFuture;

public class Application {

/**

* In order to make sure multicast registry works, need to specify '-Djava.net.preferIPv4Stack=true' before

* launch the application

*/

public static void main(String[] args) throws Exception {

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-consumer.xml");

context.start();

DemoService demoService = context.getBean("demoService", DemoService.class);

String world = demoService.sayHello("world");

System.out.println(">>>>>>>>>>>>>>result: " + world);

}

}

结果:

三. 基于注解配置

依赖引入同上,或者参考官方文档

1. Provider 准备

一. 实现接口

package org.apache.dubbo.demo.provider;

import org.apache.dubbo.config.annotation.Service;

import org.apache.dubbo.demo.DemoService;

import org.apache.dubbo.rpc.RpcContext;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.util.concurrent.CompletableFuture;

@Service

public class DemoServiceImpl implements DemoService {

private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class);

@Override

public String sayHello(String name) {

logger.info("Hello " + name + ", request from consumer: " + RpcContext.getContext().getRemoteAddress());

return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();

}

@Override

public CompletableFuture sayHelloAsync(String name) {

return null;

}

}

二. 通过注解实现配置

@Configuration

@EnableDubbo(scanBasePackages = "org.apache.dubbo.demo.provider")

@PropertySource("classpath:/spring/dubbo-provider.properties")

static class ProviderConfiguration {

@Bean

public RegistryConfig registryConfig() {

RegistryConfig registryConfig = new RegistryConfig();

registryConfig.setAddress("zookeeper://127.0.0.1:2181");

return registryConfig;

}

}

classpath:/spring/dubbo-provider.properties文件

dubbo.application.name=dubbo-demo-annotation-provider

dubbo.protocol.name=dubbo

dubbo.protocol.port=20880

2. Consumer 准备

一. 创建接口

package org.apache.dubbo.demo.consumer.comp;

import org.apache.dubbo.config.annotation.Reference;

import org.apache.dubbo.demo.DemoService;

import org.springframework.stereotype.Component;

import java.util.concurrent.CompletableFuture;

@Component("demoServiceComponent")

public class DemoServiceComponent implements DemoService {

@Reference

private DemoService demoService;

@Override

public String sayHello(String name) {

return demoService.sayHello(name);

}

@Override

public CompletableFuture sayHelloAsync(String name) {

return null;

}

}

二. 通过注解添加配置

@Configuration

@EnableDubbo(scanBasePackages = "org.apache.dubbo.demo.consumer.comp")

@PropertySource("classpath:/spring/dubbo-consumer.properties")

@ComponentScan(value = {"org.apache.dubbo.demo.consumer.comp"})

static class ConsumerConfiguration {

}

spring/dubbo-consumer.properties

dubbo.application.name=dubbo-demo-annotation-consumer

dubbo.registry.address=zookeeper://127.0.0.1:2181

消费结果

四. 基于API的配置

不依赖于 spring框架。详情见dubbo-demo-api

相关链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: