springboot 集成 Dubbo + Zookeeper
此处废话不多说,直接上手实战,若需了解基础知识,点击主页查看其他知识文章!或滑倒最下,详看参考文献,直接跳转!!!
一、安装zookeeper,集成dubbo前置工作
由于之前已写过 zookeeper
安装部署手册文章,在此不再做重复工作,详细安装介绍请点击以下链接跳转!
windows安装 :https://blog.csdn.net/hbtstsxy/article/details/135484379
二、创建空项目并集成dubbo
2.1、创建一个空项目
idea 创建一个空项目,删除 src
目录,截图如下:
右键点击 dubbo-rabitmq
项目名字,选择 new
-> module
,新增三个 Module
模块,分别分 common
公共模块 ,consume
消费者模块, produce
提供者模块,效果如下:(创建步骤soay,此处不在截图一一展示…省略…)
2.2、common
模块
pom.xml
依赖如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>dubbo-rabbitmq</artifactId>
<groupId>com</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>common</artifactId>
<name>common</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.0.1-jre</version>
</dependency>
</dependencies>
</project>
创建一个实体类 VO,User
,如下:
package com.entity;
import lombok.Builder;
import lombok.Data;
import java.io.Serializable;
/**
* @author : gaogao
* @version 1.0
* @date : 2024-01-10 11:02
*/
@Data
@Builder
public class User implements Serializable {
private static final long serialVersionUID = 766703992823945950L;
private String id;
private String name;
private String phone;
private String address;
private String email;
private String birthday;
}
创建一个接口,UserService
,如下:
package com.service;
import com.entity.User;
import java.util.List;
/**
* @author : gaogao
* @version 1.0
* @date : 2024-01-10 11:01
*/
public interface UserService {
/**
* 根据出生日期查询用户信息
*
* @param birthday 出生日期
* @return List<User>
*/
List<User> queryUserByBirthday(String birthday);
}
common
模块整体效果如下:
2.3、produce 模块
pom.xml
依赖文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.7.14</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>produce</artifactId>
<name>produce</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.0.1-jre</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<version>3.2.8</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.2.8</version>
</dependency>
<!--这里引入common 公共模块的jar,主要完成service的实现类-->
<dependency>
<groupId>com</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
我使用的 zk
为 3.8.3
版本,dubbo
采用 3.0
,固使用了 3.2.8版本的 pom
由于
Dubbo
使用Curator
作为与Zookeeper Server
交互的编程客户端,因此,要特别注意Zookeeper Server
与Dubbo
版本依赖的兼容性
,版本对应关系如下:
application.yml
配置文件如下:
server:
port: 8082
dubbo:
protocol:
# 端口号
port: 21888
registry:
# 上边搭建的zk环境ip地址
address: zookeeper://XXX.XXX.X.XX:2181
# 超时时间
timeout: 50000
consumer:
#关闭服务消费方所有服务的自动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。
check: false
编写 UserServiceImpl.java
实现 UserService
接口
/**
* @author : gaogao
* @version 1.0
* @date : 2024-01-10
*/
@Service
public class UserServiceImpl implements UserService {
@Override
public List<User> queryUserByBirthday(String birthday) {
Map<String, List<User>> map = Produce.users.stream().collect(Collectors.groupingBy(User::getBirthday));
return map.get(birthday);
}
}
在 resources
目录下创建 spring
目录,用于存放 produce.xml
配置文件,暴露 Dubbo
接口。(此处仅列举暴漏一个 UserService
接口,若有其他接口,请自行添加 dubbo:service 标签添加)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:application.yml"/>
<dubbo:application name="produce"/>
<dubbo:registry address="${dubbo.registry.address}" timeout="${dubbo.registry.timeout}"/>
<dubbo:protocol name="dubbo" port="${dubbo.protocol.port}"/>
<!--关闭服务消费方所有服务的启动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。-->
<dubbo:consumer check="${dubbo.consumer.check}"/>
<dubbo:service interface="com.service.UserService" class="com.service.impl.UserServiceImpl"/>
</beans>
Produce.java
,启动类配置如下,由于此项目未连接DB数据库,在项目启动时默认加载一些假数据,用来当作DB数据库。
@ImportResource(locations = "classpath:spring/produce.xml")
@SpringBootApplication
public class Produce {
public static List<User> users = Lists.newArrayList();
public static void main(String[] args) {
SpringApplication.run(Produce.class, args);
}
@PostConstruct
public void importData() {
users.add(User.builder().id(getId()).name("gaogao1").phone("18888888888").address("北京市海淀区").email("AAAAAAAAA@qq.com").birthday("20230110").build());
users.add(User.builder().id(getId()).name("gaogao2").phone("15088888888").address("北京市昌平区").email("BBBBBBBBB@qq.com").birthday("20230111").build());
users.add(User.builder().id(getId()).name("gaogao3").phone("13888888888").address("北京市朝阳区").email("CCCCCCCCC@qq.com").birthday("20230110").build());
users.add(User.builder().id(getId()).name("gaogao4").phone("15188888888").address("北京市房山区").email("DDDDDDDDD@qq.com").birthday("20230110").build());
users.add(User.builder().id(getId()).name("gaogao5").phone("16888888888").address("北京市通州区").email("EEEEEEEEE@qq.com").birthday("20230112").build());
users.add(User.builder().id(getId()).name("gaogao6").phone("18188888888").address("北京市西城区").email("FFFFFFFFF@qq.com").birthday("20230113").build());
users.add(User.builder().id(getId()).name("gaogao7").phone("13488888888").address("北京市东城区").email("GGGGGGGGG@qq.com").birthday("20230114").build());
}
public String getId() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
}
整体目录结构如下:
运行 produce
启动类:成功运行!
2.4、consume模块
pom.xml
依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.7.14</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>consume</artifactId>
<name>consume</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.0.1-jre</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-zookeeper-curator5</artifactId>
<version>3.2.8</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>3.2.8</version>
</dependency>
<dependency>
<groupId>com</groupId>
<artifactId>common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!--导入配置文件处理器,配置文件进行绑定就会有提示-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
</project>
application.yml
配置文件如下:
server:
port: 8083
dubbo:
registry:
address: zookeeper://XXX.XXX.X.XX:2181
timeout: 50000
consumer:
#关闭服务消费方所有服务的自动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。
check: false
在 resources
目录下创建 spring
目录,用于存放 consume.xml
配置文件,消费 Dubbo
接口。(此处仅列举暴漏一个 UserService
接口,若有其他接口,请自行添加 dubbo:reference 标签添加)
配置文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:property-placeholder location="classpath:application.yml"/>
<dubbo:application name="consume"/>
<dubbo:registry address="${dubbo.registry.address}" timeout="${dubbo.registry.timeout}"/>
<!--关闭服务消费方所有服务的启动检查。dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成。-->
<dubbo:consumer check="${dubbo.consumer.check}"/>
<dubbo:reference id="userService" interface="com.service.UserService"/>
</beans>
Consume.java
启动类:
package com;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
@ImportResource(locations = "classpath:spring/consume.xml")
@SpringBootApplication
public class Consume {
public static void main(String[] args) {
SpringApplication.run(Consume.class, args);
}
}
此处为了方便测试,直接使用 web形式,调用接口测试,创建 UserControlle
如下:
package com.controller;
import com.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author : gaogao
* @version 1.0
* @date : 2024-01-10
*/
@Slf4j
@RestController
public class UserController {
@Autowired
private UserService userService;
@GetMapping(value = "/queryUserByBirthday")
public List queryUserByBirthday(String birthday) {
return userService.queryUserByBirthday(birthday);
}
}
启动 consume
启动类:
三、测试
由于上边已启动 produce
和 consumer
模块,现在就可以直接测试了。
浏览器输入以下地址,访问接口,进行测试:
http://localhost:8083/queryUserByBirthday?birthday=20230110
测试结果:
http://localhost:8083/queryUserByBirthday?birthday=20230111
接口验证完毕,集成成功。
四、总结
上述方式采用 xml 方式配置,后续发布 通过 dubbo
注解来实现功能,甚至 通过 api
方式集成,文档正在持续更新中。
高高只聊干货,不说废话…若觉得文章不错,请点个关注,在此谢谢。
主页中其他文章也不错呦,有兴趣可以点击查看呢~~~~,持续更新 java 相关文章…