SpringBoot项目整合Dubbo
添加依赖
在springboot 项目中使用 dubbo ,除了必要的 spring 依赖意外,还需要两个依赖。
Dubbo依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>2.7.3</version>
</dependency>
和spring整合的依赖
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
配置
Dubbo的通用配置
不论是服务提供者,还是服务消费者,都需要进行这个配置
dubbo:
application:
name: dubbo-provider
protocol:
name: dubbo
port: 20883
registry:
address: zookeeper://127.0.0.1:2181
这个配置表示使用 dubbo协议进行通信,使用 zookeeper 注册中心进行服务注册与发现
服务提供者配置
首先,需要在启动类上加上注解,开启 dubbo
@EnableDubbo
@EnableDubbo(scanBasePackages = "site.nihaoa.dubbo.services")
上面两种都行
在需要暴露的服务上,使用 @service 注解进行服务暴露与注册,interfaceClass可以写也可以不写
@Service(interfaceClass = IUserService.class)`在这里插入代码片`
@Component
public class UserServiceImpl implements IUserService {
@Override
public String getUserName(User user) throws Exception {
return "This is UserService";
}
}
注意: @service 注解不是spring 的注解,而是 dubbo 的注解
服务消费者配置
同样的,需要在启动类上加上注解,开启 dubbo
@EnableDubbo
在需要使用外部服务的地方使用注解进行注入
@Reference
private IUserService userService;
下面是完整代码
@RestController
public class IndexController {
@Reference
private IUserService userService;
@RequestMapping("/index")
public String index() throws Exception{
User user = new User();
user.setAge(18);
user.setName("abc");
user.setNickName("def");
user.setPasswd("123");
System.out.println(userService.getUserName(user));
return "Hello World";
}
}
启动使用
报错
这个时候如果启动,可能会报错
java.lang.NoClassDefFoundError: org/apache/curator/framework/CuratorFrameworkFactory
at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperClient.<init>(CuratorZookeeperClient.java:65) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.remoting.zookeeper.curator.CuratorZookeeperTransporter.createZookeeperClient(CuratorZookeeperTransporter.java:26) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.remoting.zookeeper.support.AbstractZookeeperTransporter.connect(AbstractZookeeperTransporter.java:68) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.remoting.zookeeper.ZookeeperTransporter$Adaptive.connect(ZookeeperTransporter$Adaptive.java) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfiguration.<init>(ZookeeperDynamicConfiguration.java:61) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.configcenter.support.zookeeper.ZookeeperDynamicConfigurationFactory.createDynamicConfiguration(ZookeeperDynamicConfigurationFactory.java:38) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.configcenter.AbstractDynamicConfigurationFactory.getDynamicConfiguration(AbstractDynamicConfigurationFactory.java:33) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.config.AbstractInterfaceConfig.getDynamicConfiguration(AbstractInterfaceConfig.java:314) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.config.AbstractInterfaceConfig.prepareEnvironment(AbstractInterfaceConfig.java:289) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.config.AbstractInterfaceConfig.startConfigCenter(AbstractInterfaceConfig.java:279) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.config.AbstractInterfaceConfig.lambda$null$7(AbstractInterfaceConfig.java:626) ~[dubbo-2.7.3.jar:2.7.3]
at java.util.Optional.orElseGet(Optional.java:267) ~[na:1.8.0_192]
at org.apache.dubbo.config.AbstractInterfaceConfig.lambda$useRegistryForConfigIfNecessary$8(AbstractInterfaceConfig.java:619) ~[dubbo-2.7.3.jar:2.7.3]
at java.util.Optional.ifPresent(Optional.java:159) ~[na:1.8.0_192]
at org.apache.dubbo.config.AbstractInterfaceConfig.useRegistryForConfigIfNecessary(AbstractInterfaceConfig.java:617) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.config.AbstractInterfaceConfig.checkRegistry(AbstractInterfaceConfig.java:207) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.config.ServiceConfig.checkAndUpdateSubConfigs(ServiceConfig.java:302) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.config.ServiceConfig.export(ServiceConfig.java:369) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.config.spring.ServiceBean.export(ServiceBean.java:336) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:114) ~[dubbo-2.7.3.jar:2.7.3]
at org.apache.dubbo.config.spring.ServiceBean.onApplicationEvent(ServiceBean.java:60) ~[dubbo-2.7.3.jar:2.7.3]
at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:402) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:359) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:896) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:552) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743) [spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390) [spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) [spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214) [spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203) [spring-boot-2.1.7.RELEASE.jar:2.1.7.RELEASE]
at site.nihaoa.dubbo.Dubbo3Application.main(Dubbo3Application.java:12) [classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_192]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_192]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_192]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_192]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.1.7.RELEASE.jar:2.1.7.RELEASE]
Caused by: java.lang.ClassNotFoundException: org.apache.curator.framework.CuratorFrameworkFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_192]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_192]
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) ~[na:1.8.0_192]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_192]
... 39 common frames omitted
所以还需要加入两个依赖
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
加上依赖之后,浏览器访问 http://127.0.0.1:8080/index
可以看到
下面是完整的项目结构
首先创建了一个项目,然后在里面创建了三个Moudle.
base:里面放了服务的相关接口以及pojo类
api: 是对外接口,里面是controller,并且调用了服务提供者的服务
dubbo3: 服务提供者,实现了 base 里面的接口
服务消费者
//启动类
package site.nihaoa.dubbo.api;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class ApiApplication {
public static void main(String[] args) {
SpringApplication.run(ApiApplication.class, args);
}
}
//controller 类
package site.nihaoa.dubbo.api.controller;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import site.nihaoa.dubbo.pojo.User;
import site.nihaoa.dubbo.service.IUserService;
@RestController
public class IndexController {
@Reference
private IUserService userService;
@RequestMapping("/index")
public String index() throws Exception{
User user = new User();
user.setAge(18);
user.setName("abc");
user.setNickName("def");
user.setPasswd("123");
System.out.println(userService.getUserName(user));
return "Hello World";
}
}
服务提供者
// 启动类
package site.nihaoa.dubbo;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo(scanBasePackages = "site.nihaoa.dubbo.services")
public class Dubbo3Application {
public static void main(String[] args) {
SpringApplication.run(Dubbo3Application.class, args);
}
}
//暴露的服务
package site.nihaoa.dubbo.services;
import org.apache.dubbo.config.annotation.Service;
import site.nihaoa.dubbo.pojo.User;
import site.nihaoa.dubbo.service.IUserService;
@Service
public class UserServiceImpl implements IUserService {
@Override
public String getUserName(User user) throws Exception {
System.out.println(user);
return "This is UserService";
}
}
结果
服务调用成功