分布式应用开发 | SpringBoot+dubbo+zookeeper实现服务注册发现 | 远程服务调用
前言
通过新建两个独立服务——提供者、消费者,模拟两个独立分布的应用,通过使用dubbo+zookeeper来实现远程服务调用。
目录
项目搭建
- provider-server
- consumer-server
实现并测试
- provider-server注册
- consumer-server远程调用
项目搭建
为了方便,新建一个空的项目:
在空项目上new一个module,使用SpringBoot,作为服务提供者
删除不需要的文件:
在来 new一个module,使用SpringBoot,作为服务消费者
两个服务分别导入dobbo和zookeeper依赖
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.3</version> </dependency> <!-- 引入zookeeper客户端 --> <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient --> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <!-- 日志回冲突--> <!-- 引入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> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.14</version> <!--排除这个slf4j-log4j12--> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions> </dependency>
坑:日志冲突
编写服务提供者-实际服务:
package com.hwl.service; import org.apache.dubbo.config.annotation.Service; import org.springframework.stereotype.Component; /** * @author:hwl * @date:2021/10/8 13:13 * @Function: * @Description: */ @Service //这是dubbo的,不是service的,作用是服务启动 自动注册到服务中心 @Component //这是Spring的,这里平时是用service但是现在为了区别dubbo用Component public class TicketServiceImpl implements TicketService { @Override public String getTicket(){ return "拿到票子啦!"; } }
配置启动端口和dubbo信息
server.port=8001 #当前应用名字 dubbo.application.name=provider-server #注册中心地址 dubbo.registry.address=zookeeper://127.0.0.1:2181 #扫描指定包下服务 dubbo.scan.base-packages=com.hwl.service
启动zookper
启动dubbo-admin
启动提供者服务
注:需要注意启动顺序,而且涉及通讯会有一些延迟。
访问dubbo-admin查看我们的服务是否注册到服务中心:http://localhost:7001
可以看到我们的服务已经注册进来了。
消费者:
package com.hwl.service; import org.apache.dubbo.config.annotation.Reference; import org.springframework.stereotype.Service; /** * @author:hwl * @date:2021/10/8 13:22 * @Function: * @Description: */ @Service //这里是放到spring容器不是dubbo public class UserService{ //去拿提供者提供的票,需要去注册中心拿服务 @Reference //引用,pom坐标,可以定义路径相同的接口名 TicketService ticketService; public void buyTicket(){ String ticket = ticketService.getTicket(); System.out.println( ticket ); } }
需要注意的是这里的 TicketService 路径需要和注册中心中是实际TicketService 一样,实际调用的是服务中心中注册的远程服务。
配置:
server.port=8002 #当前应用名字 dubbo.application.name=consumer-server #注册中心地址 dubbo.registry.address=zookeeper://127.0.0.1:2181
消费者调用注册中心服务测试类:
package com.hwl; import com.hwl.service.UserService; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class ConsumerServerApplicationTests { @Autowired UserService userService; @Test void contextLoads() { userService.buyTicket(); } }
运行测试:
消费者服务成功调用到了提供者注册在服务中心的服务了!
这就是SpingBoot + dubbo + zookeeper实现分布式开发的应用,其实就是一个服务拆分的思想。