項目代碼地址: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環境的,大家可以去參考一下。