spring-boot 使用JavaConfig方式配置Dubbo
Spring Boot提倡以JavaConfig的方式进行配置,就是使用注释来描述Bean配置的组件,从而取代让许多开发者诟病已久的xml配置方式。Spring Boot官方也提供了很多相关的JavaConfig例子,例如数据库配置,消息队列配置等。本文将提供一个JavaConfig配置Dubbo的例子。
1import org.springframework.beans.factory.annotation.Value;
2import org.springframework.context.annotation.Bean;
3import org.springframework.context.annotation.Configuration;
4import com.alibaba.dubbo.config.ApplicationConfig;
5import com.alibaba.dubbo.config.MonitorConfig;
6import com.alibaba.dubbo.config.ProtocolConfig;
7import com.alibaba.dubbo.config.ProviderConfig;
8import com.alibaba.dubbo.config.RegistryConfig;
9import com.alibaba.dubbo.config.spring.AnnotationBean;
10
11@Configuration
12public class DubboConfig {
13
14 // 应用名称
15 public static final String APPLICATION_NAME = "spring-boot-demo";
16 // 扫描service包路径
17 public static final String ANNOTATION_PACKAGE = "com.cipher.springboot.service";
18
19 // 以下信息将从配置文件application.properties中读取
20 @Value("${dubbo_registry_address}")
21 private String registryAddress;
22 @Value("${dubbo_port}")
23 private int dubboPort;
24 @Value("${dubbo_register}")
25 private boolean dubboRegister;
26
27 /**
28 * 提供方应用信息,用于计算依赖关系
29 *
30 * @return
31 */
32 @Bean
33 public ApplicationConfig applicationConfig() {
34 ApplicationConfig applicationConfig = new ApplicationConfig();
35 applicationConfig.setName(APPLICATION_NAME);
36 return applicationConfig;
37 }
38
39 /**
40 * 与<dubbo:annotation/>相当.
41 * 提供方扫描带有@com.alibaba.dubbo.config.annotation.
42 * Service的注解类
43 *
44 * @return
45 */
46 @Bean
47 public static AnnotationBean annotationBean() {
48 AnnotationBean annotationBean = new AnnotationBean();
49 annotationBean.setPackage(ANNOTATION_PACKAGE);
50 return annotationBean;
51 }
52
53 /**
54 * 使用zookeeper注册中心暴露服务地址
55 *
56 * @return
57 */
58 @Bean
59 public RegistryConfig registryConfig() {
60 RegistryConfig registryConfig = new RegistryConfig();
61 registryConfig.setAddress(registryAddress);
62 registryConfig.setRegister(dubboRegister);
63 return registryConfig;
64 }
65
66 /**
67 * 用dubbo协议在指定端口暴露服务
68 *
69 * @return
70 */
71 @Bean
72 public ProtocolConfig protocolConfig() {
73 ProtocolConfig protocolConfig = new ProtocolConfig("dubbo", dubboPort);
74 // 默认为hessian2,但不支持无参构造函数类,而这种方式的效率很低
75 protocolConfig.setSerialization("java");
76 return protocolConfig;
77 }
78
79 /**
80 * 监控中心配置,protocol="registry",表示从注册中心发现监控中心地址
81 *
82 * @return
83 */
84 @Bean
85 public MonitorConfig monitorConfig() {
86 MonitorConfig monitorConfig = new MonitorConfig();
87 monitorConfig.setProtocol("registry");
88 return monitorConfig;
89 }
90
91 /**
92 * 当ProtocolConfig和ServiceConfig某属性没有配置时,采用此缺省值
93 *
94 * @return
95 */
96 @Bean
97 public ProviderConfig providerConfig() {
98 ProviderConfig providerConfig = new ProviderConfig();
99 providerConfig.setTimeout(10000);
100 providerConfig.setThreadpool("fixed");
101 providerConfig.setThreads(100);
102 providerConfig.setAccepts(1000);
103 return providerConfig;
104 }
105}
