第一步:先搭建好一个普通的项目。然后再项目中添加3个spring boot项目。
### 一个api(暴露接口)。一个provider(提供者、实现)。一个consumer(一个消费者)。
复制代码
第二步 使用zookeeper作为注册中心。(自己去安装zookeeper并启动)
别人的博客:blog.csdn.net/qiunian1440…
zookeeper官网下载地址: www.apache.org/dyn/closer.…
第三步 写接口+实现
api项目:只需要定义一个测试接口
public interface TestService {
String testHello(String name);
}
复制代码
provider项目:
需要3个依赖包:
1: api的依赖包 2:dubbo的依赖包 3:curator的依赖包
<!-- 依赖api -->
<dependency>
<groupId>com.dd</groupId>
<artifactId>api</artifactId>
<version>${api.version}</version>
</dependency>
<!-- dubbo依赖 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!--zookeeper客户端-->
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>
复制代码
配置一些信息:
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DubboConfig {
@Bean
public ApplicationConfig applicationConfig() {
// 提供方应用信息,用于计算依赖关系
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("provider-test");
return applicationConfig;
}
@Bean
public RegistryConfig registryConfig() {
// 使用zookeeper注册中心暴露服务地址
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181");
// 使用curator客户端
registryConfig.setClient("curator");
return registryConfig;
}
}
复制代码
实现api的接口
import com.alibaba.dubbo.config.annotation.Service;
import com.dd.api.testinterface.TestService;
@Service
public class TestServiceImpl implements TestService {
@Override
public String testHello(String name) {
return "hello " + name;
}
}
复制代码
启动类扫描这个实现
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@DubboComponentScan(basePackages = "com.dd.provider.TestImpl") // 这里是实现包所在的位子
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
复制代码
别忘记设置启动端口
server:
port: 9871 #设置启动端口
复制代码
provider完整结构
consumer 项目:
和provider一样需要3个的依赖包:
1: api的依赖包 2:dubbo的依赖包 3:curator的依赖包
<!-- 依赖api -->
<dependency>
<groupId>com.dd</groupId>
<artifactId>api</artifactId>
<version>${api.version}</version>
</dependency>
<!-- dubbo依赖 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!--zookeeper客户端-->
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>
复制代码
和provider一样需要配置一些信息:
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ConsumerConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DubboConfig {
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("consumer-test");
return applicationConfig;
}
@Bean
public ConsumerConfig consumerConfig() {
// 设置
ConsumerConfig consumerConfig = new ConsumerConfig();
consumerConfig.setTimeout(3000);
return consumerConfig;
}
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181");
registryConfig.setClient("curator");
return registryConfig;
}
}
复制代码
需要定义一个controller来调用这个服务
import com.alibaba.dubbo.config.annotation.Reference;
import com.dd.api.testinterface.TestService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@Reference
TestService testService; // 这个接口是api里面定义的接口
@RequestMapping("/hello")
public String testHello(String name) {
return testService.testHello(name);
}
}
复制代码
启动类扫描这个带有@Reference接口所在的类
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@DubboComponentScan(basePackages = "com.dd.consumer.controller")
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
复制代码
同理别忘记了设置启动端口
server:
port: 9872 #设置启动端口
复制代码
consumer 整体结构
第四步 查看效果 项目完成。
首先启动provider项目
然后启动consumer项目
然后访问 http://localhost:9872/test/hello?name=diandi
遇到的问题。
1:java.lang.IllegalStateException: No such application config! Please add <dubbo:application name="..." /> to your spring config.
2: service 为 null
原因是:我把@Configuration写成了@Configurable
3:java.lang.NoClassDefFoundError: org/apache/curator/framework/CuratorFrameworkFactory
原因是: 没有添加curator的依赖
复制代码