Spring4 javaConfig注解方式配置dubbo
项目结构
三个工程都是普通的mavenweb工程
user-api 暴露给消费段的api
user-server 服务提供者
user-client 服务消费者
父pom
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
user-api
这里很简单,只有一个暴露的接口
user-server
pom
<dependencies>
<dependency>
<groupId>com.jiu</groupId>
<artifactId>user-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
AppConfig
@Configuration
@ComponentScan(basePackages = {"com.jiu"})
public class AppConfig {
}
DubboConfig
@Configuration
@DubboComponentScan(basePackages = {"com.jiu.service.impl"})//扫描dubbo注解
public class DubboConfig {
/**
* 应用名
*
* @return
*/
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("jiu-user-provider");
return applicationConfig;
}
/**
* <dubbo:provider timeout="10000" />
*
* @return
*/
@Bean
public ProviderConfig providerConfig() {
ProviderConfig providerConfig = new ProviderConfig();
providerConfig.setTimeout(10000);
return providerConfig;
}
/**
* 地址配置 <dubbo:registry address="zookeeper://127.0.0.1:2181" client="zkclient"/>
*
* @return
*/
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181");
registryConfig.setClient("zkclient");
return registryConfig;
}
/**
* 协议配置,等同于 <dubbo:protocol name="dubbo" port="20880" />
*
* @return ProtocolConfig
*/
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
return protocolConfig;
}
MyApplicationContextInitializer
public class MyApplicationContextInitializer implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
//加载配置文件
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
rootContext.register(AppConfig.class, DubboConfig.class);
servletContext.addListener(new ContextLoaderListener(rootContext));
}
}
实现WebApplicationInitializer,重写onStartup方法,即在tomcat启动的时候加载AppConfig.class, DubboConfig.class
UserServiceImpl
@Component
@Service(version = "1.0", timeout = 3000)//dubbo注解
public class UserServiceImpl implements UserService {
@Override
public String say() {
return "hello";
}
}
这里的@service是com.alibaba.dubbo.config.annotation包下的
user-client
pom
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.jiu</groupId>
<artifactId>user-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
MvcConfig
@Configuration
@EnableWebMvc//开启springmvc
@ComponentScan(basePackages = {"com.jiu.controller"})//扫描controller
public class MvcConfig implements WebMvcConfigurer{
}
DubboConfig
/**
* dubbo配置
*/
@Configuration
@DubboComponentScan(basePackages = {"com.jiu.controller"})//扫描dubbo注解
public class DubboConfig {
/**
* 应用名配置
*
* @return
*/
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("jiu-user-client");
return applicationConfig;
}
/**
* 地址配置
*
* @return
*/
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181");
registryConfig.setClient("zkclient");
return registryConfig;
}
/**
* 协议配置
*
* @return ProtocolConfig
*/
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(20880);
return protocolConfig;
}
}
MyApplicationContextInitializer
/**
* 服务启动加载
*/
public class MyApplicationContextInitializer implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
//加载配置文件
rootContext.register(MvcConfig.class, DubboConfig.class);
//配置dispatcherServlet
ServletRegistration.Dynamic servlet =
servletContext.addServlet("dispatcher", new DispatcherServlet(rootContext));
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
servletContext.addListener(new ContextLoaderListener(rootContext));
}
}
IndexController
@RestController
public class IndexController {
@Reference(version = “1.0”)
UserService userService;
@RequestMapping(value = "/index")
public String index() {
return userService.say();
}
}
测试
配置tomcat,一次启动user-server,user-client。(注,项目需启动zookeeper,可以下载zookeeper包在本地启动,具体方法自行百度。)
访问localhost:8080/index
调用成功