吐槽一下,搞这个花了4个多小时,心态有点崩。
开始了,怎么配
interface
- 目录结构如下:单纯的建了一个 接口
- 内容如下
package com.yichen.demo;
public interface IUserService {
public String sayHello(String name);
}
- 由于这个项目会被生产者(producer)和消费者(consumer)使用到,所以要把它打成jar包,放在本地仓库中。
- 如果失败,有可能是setting的问题,要确保是自己的本地仓库,而不是其他人的。
生产者 producer
目录结构
pom 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!---使用curator代替zkclient-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
// 这里是我前面打的 接口 jar包
<dependency>
<groupId>com.yichen</groupId>
<artifactId>springboot-dubbo-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
接口实现类
这里需要注意注解Service 是 import com.alibaba.dubbo.config.annotation.Service 而不是其他的!!
package com.yichen.demo;
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Component
@Service(version = "1.2.3")
public class UserServiceImpl implements IUserService{
@Override
public String sayHello(String name) {
return "hello:"+name;
}
}
springboot 启动类
这里添加 @EnableDubbo 注解就行了
package com.yichen.demo;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
properties
spring.application.name=dubbo-demo-provider
dubbo.application.name=dubbo-demo-provider
dubbo.application.id=dubbo-demo-provider
# 注册中心地址,好像只能是一个,我没怎么细研究
dubbo.registry.address=zookeeper://192.168.175.128:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
dubbo.scan.base-packages=com.yichen.demo.UserServiceImpl
# 这里 是连接时间,如果连不上zookeeper 可以把时间设置的长一点,我现在设置的是5s
dubbo.config-center.timeout=5000
消费者
目录结构
pom 依赖
相比生产者 它多了一个 spring-boot-starter-web,用于在页面上展示从生产者那里获得的消息
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.4.1</version>
</dependency>
<!---使用curator代替zkclient-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.yichen</groupId>
<artifactId>springboot-dubbo-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
properties
spring.application.name=dubbo-demo-consumer
dubbo.application.name=dubbo-demo-consumer
dubbo.application.id=dubbo-demo-consumer
dubbo.registry.address=zookeeper://192.168.175.128:2181
dubbo.config-center.timeout=10000
接收消息的controller
注意,这里的 @Reference 来自 import com.alibaba.dubbo.config.annotation.Reference 而不是其他的
package com.yichen.demo;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Reference(version = "1.2.3")
private IUserService userService;
@RequestMapping("/sayHello")
public String sayHello(String name){
return userService.sayHello(name);
// return "dfs";
}
@RequestMapping("/show")
public String show(){
return "show";
}
}
启动类
注意,producer类和consumer 类这两个类中启动类的注解是不一样的!!
package com.yichen.demo;
import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubboConfig
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
运行测试
查看zookeeper 目录树
可以看到生产者和消费者都注册到了zookeeper 上了。
网页测试
总结
- pom 依赖问题,一开始使用的是b站上教学视频中的依赖,一直出现连接不上zookeeper,尝试修改连接时长,依赖冲突和版本问题都不行。后面才发现是zkClient的问题。。
- 注解问题,接口类的实现类,以及调用接口的类引用的都是alibaba 那的。一开始有一个使用了apache的,导致找不到生产者。。
- 两个启动类 的注解也是不一致的,一开始都用了enableDubboConfig。。
- 最开始启动类我设置的是 enableAutoConfiguration 因为我看官方是这么写的,然后就是一路错,难受。还没搞定有啥区别,先记录一下。
- properties 中的 注册地址 好像只能写一个。之前一下子写了3个,然后给我报ipv6的错。
- 最后,抱怨一句,虚拟机中装unbutu是真的卡,昨天电脑差点卡死。还是center os香。