项目代码地址:https://github.com/SunSmileAZY/dubbo-demo
项目目录结构
前言
dubbo主要有四种配置方式:XML方式、注解方式、API方式、属性配置方式。本文主要是用代码的方式看一下这四种方式如何配置的,以及各个调用的demo。
其中主要配置参见如下:
Service共通代码
此部分用于测试客户端调用服务端接口
package com.pine.service.provider;
public interface UserService {
String getUsername();
}
package com.pine.service.provider;
import com.alibaba.dubbo.config.annotation.Service;
@Service
public class UserServiceImpl implements UserService {
@Override
public String getUsername() {
System.out.println("调用getUsername=========");
return "pine";
}
}
package com.pine.service.consumer;
import com.alibaba.dubbo.config.annotation.Reference;
import com.pine.service.provider.UserService;
import org.springframework.stereotype.Component;
/**
* 提供给dubbo消费端
* @author pine
*/
@Component("annotatedConsumer")
public class ConsumerUserServiceImpl {
@Reference
private UserService userService;
public String getUsername(){
System.out.println("调用到ConsumerUserServiceImpl.getUsername()");
return userService.getUsername();
}
}
XML方式
客户端配置dubbo-client:
<?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:application name="xml-clint" />
<dubbo:registry address="zookeeper://47.93.206.149:20181" />
<dubbo:reference id="userService" interface="com.pine.service.provider.UserService" />
</beans>
服务端配置dubbo-server:
<?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:provider timeout="3000" />
<!-- 服务提供方应用名称, 方便用于依赖跟踪 -->
<dubbo:application name="xml-server" />
<!-- 使用zookeeper作为注册中心 -->
<dubbo:registry address="zookeeper://47.93.206.149:20181" />
<!--name指示使用什么协议监听端口:dubbo/rmi/rest-->
<dubbo:protocol name="dubbo" port="20882" />
<!-- 通过xml方式配置为bean, 让spring托管和实例化 -->
<bean id="userService" class="com.pine.service.provider.UserServiceImpl"/>
<!-- 声明服务暴露的接口,并暴露服务 -->
<dubbo:service interface="com.pine.service.provider.UserService" ref="userService" />
</beans>
服务端代码 ProviderXml:
package com.pine.config.xml;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
*
* @author pine
*/
public class ProviderXml {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring/dubbo-server.xml");
ctx.start();
System.out.println("---------dubbo启动成功--------");
// 保证服务一直开着
synchronized (ProviderXml.class) {
try {
ProviderXml.class.wait();
} catch (Throwable e) {
}
}
}
}
客户端代码 ConsumerXml:
package com.pine.config.xml;
import com.pine.service.provider.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ConsumerXml {
public static void main(String[] args) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:spring/dubbo-client.xml");
ctx.start();
System.out.println("---------dubbo启动成功--------");
// get remote service proxy
UserService orderService = (UserService) ctx.getBean("userService");
String username = orderService.getUsername();
System.out.println(" ConsumerXml result: " + username);
}
}
注解方式
服务提供端ProviderAnno:
package com.pine.config.anno;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.ProviderConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
*
* @author pine
*/
public class ProviderAnno {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
context.start();
System.out.println("---------dubbo启动成功--------");
System.in.read();
}
@Configuration
@EnableDubbo(scanBasePackages = "com.pine.service")
static class ProviderConfiguration {
@Bean
public ProviderConfig providerConfig() {
ProviderConfig providerConfig = new ProviderConfig();
providerConfig.setTimeout(1000);
return providerConfig;
}
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("dubbo-config");
return applicationConfig;
}
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress("47.93.206.149");
registryConfig.setPort(20181);
return registryConfig;
}
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
return protocolConfig;
}
}
}
消费端ConsumerAnno:
package com.pine.config.anno;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import com.pine.service.consumer.ConsumerUserServiceImpl;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
/**
*
* @author pine
* @date 20200119
*/
public class ConsumerAnno {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
context.start();
System.out.println("---------dubbo启动成功--------");
ConsumerUserServiceImpl consumerUserService = context.getBean(ConsumerUserServiceImpl.class);
String username = consumerUserService.getUsername();
System.out.println("username: " + username);
}
@Configuration
@EnableDubbo(scanBasePackages = "com.pine.service.consumer")
@ComponentScan(value = {"com.pine.service.consumer"})
static class ConsumerConfiguration {
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
// 设置服务名
applicationConfig.setName("dubbo-config");
return applicationConfig;
}
@Bean
public ConsumerConfig consumerConfig() {
ConsumerConfig consumerConfig = new ConsumerConfig();
consumerConfig.setTimeout(3000);
return consumerConfig;
}
@Bean
public RegistryConfig registryConfig() {
// 注册信息
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setProtocol("zookeeper");
registryConfig.setAddress("47.93.206.149");
registryConfig.setPort(20181);
return registryConfig;
}
}
}
API方式
API方式主要是用于架构改造方面。
服务提供端ProviderApi:
package com.pine.config.api;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import com.pine.service.provider.UserService;
import com.pine.service.provider.UserServiceImpl;
import java.io.IOException;
/**
*
* @author pine
*/
public class ProviderApi {
public static void main(String[] args) throws IOException {
ServiceConfig<UserService> config = new ServiceConfig<>();
config.setApplication(new ApplicationConfig("api-provider"));
config.setRegistry(new RegistryConfig("zookeeper://47.93.206.149:20181"));
config.setInterface(UserService.class);
config.setRef(new UserServiceImpl());
config.export();
System.out.println("first-dubbo-provider is running.");
System.in.read();
}
}
服务消费端ConsumerApi:
package com.pine.config.api;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.pine.service.provider.UserService;
/**
* api 方式
* api方式主要是用于架构方面的修改
* @author pine
*/
public class {
public static void main(String[] args) {
ReferenceConfig<UserService> reference = new ReferenceConfig<>();
reference.setApplication(new ApplicationConfig("api-consumer"));
reference.setRegistry(new RegistryConfig("zookeeper://47.93.206.149:20181"));
reference.setInterface(UserService.class);
UserService orderService = reference.get();
String username = orderService.getUsername();
System.out.println("result: " + username);
}
}
配置方式
dubbo-consumer.properties
dubbo.application.name=pro-consumer
dubbo.registry.address=zookeeper://47.93.206.149:20181
dubbo.consumer.timeout=3000
dubbo-provider.properties
dubbo.application.name=pro-provider
dubbo.registry.address=zookeeper://47.93.206.149:20181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20883
服务提供端ProviderPro:
package com.pine.config.pro;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
public class ProviderPro {
public static void main(String[] args) throws Exception {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ProviderConfiguration.class);
context.start();
System.out.println("dubbo 启动成功");
System.in.read();
}
@Configuration
@EnableDubbo(scanBasePackages = "com.pine.service.provider")
@PropertySource("classpath:/dubbo-provider.properties")
static class ProviderConfiguration {
}
}
服务消费端ConsumerPro:
package com.pine.config.pro;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import com.pine.service.consumer.ConsumerUserServiceImpl;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
public class ConsumerPro {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConsumerConfiguration.class);
context.start();
ConsumerUserServiceImpl serviceConsumer = context.getBean(ConsumerUserServiceImpl.class);
String username = serviceConsumer.getUsername();
System.out.println("result: " + username);
}
@Configuration
@EnableDubbo(scanBasePackages = "com.pine.service.consumer")
@PropertySource("classpath:/dubbo-consumer.properties")
@ComponentScan(value = {"com.pine.service.consumer"})
static class ConsumerConfiguration {
}
}
最后
以上就是dubbo的四种配置方式,配置还是比较简单的。
zookeeper我之前有一篇文章是搭建zk环境的,大家可以去参考一下。