文章目录
整合dubbo和zookeeper的时候遇到了各种乱七八糟的错误,分享一下
版本控制
- SpringBoot2.5.2
一、添加依赖和日志配置
1、依赖
<!--zookeeper客户端-->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
<exclusions>
<exclusion>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--dubbo自定义启动器-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!--curator提供zookeeper连接-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
依赖试了狂神那一套报错,然后自己找了很多博客,最后好了,一直报错
不是依赖报错,就是启动报错
注意:
- curator依赖一定要添加,现版本zookeeper需要通过curator进行连接
- zkclient一定要排除zookeeper,否则会报错
2、日志配置
dubbo和zookeeper默认使用log4j作为日志,在resources目录下创建log4j.properties进行配置
log4j.rootLogger=info,ServerDailyRollingFile,stdout
log4j.appender.ServerDailyRollingFile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.ServerDailyRollingFile.DatePattern='.'yyyy-MM-dd
log4j.appender.ServerDailyRollingFile.File=var/log/chinaamc/management-cockpit2.log
log4j.appender.ServerDailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.ServerDailyRollingFile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%t] %-5p [%c] - %m%n
log4j.appender.ServerDailyRollingFile.Append=true
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d yyyy-MM-dd HH:mm:ss %p [%c] %m%n
二、Dubbo架构
调用关系说明
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
Dubbo 架构具有以下几个特点,分别是连通性、健壮性、伸缩性、以及向未来架构的升级性。
其中注册中心有很多,但是我们这里使用zookeeper,一般也常用这个,因为服务都需要通过网络在注册中心里注册服务以及寻找所需服务,所以反应一般挺慢的
三、提供者服务
目录结构
1、编写服务接口
@DubboService//发布服务
@Component//放入容器
public class TicketServiceImpl implements TicketService {
@Override
public String getTicket() {
return "跟着狂神学Java";
}
}
2、提供者服务配置
服务者需要将提供的服务扫描,交给注册中心
dubbo:
application:
##1.当前服务名
name: provider-service
registry:
# TEST环境
##2.注册中心地址
address: zookeeper://127.0.0.1:2181
protocol: zookeeper
check: false
##3.扫描需要注册的服务
scan:
base-packages: com.chime.prodiver.service
server:
port: 8001
注意:address的ip //不要写成/
3、dubbo-admin监控查看服务
- 打开zookeeper服务:zkServer.cmd
- java -jar xxx.jar:运行dubbo-admin监控jar包
- 然后就可以访问 localhost:7001查看服务了(这个服务要部署,运行主程序)
服务成功注册
四、消费者服务
项目目录
1、编写消费者使用提供者的方法
@Service
public class BuyTicketService {
//远程引用指定服务,可通过全类名进行匹配,可以写模仿提供者服务的服务结构编写一个假接口给他
//真正生效的是提供者服务的接口
@DubboReference
TicketService ticketService;
public String buyTicket(){
return "在注册中心买到了"+ticketService.getTicket();
}
}
2、配置
server.port=8002
#服务名
dubbo.application.name=consumer-service
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
3、运行主程序查看服务
4、测试类测试远程调用
@SpringBootTest
class ConsumerServiceApplicationTests {
@Autowired
BuyTicketService buyTicketService;
@Test
void contextLoads() {
System.out.println(buyTicketService.buyTicket());
}
}
两个项目直接调用服务