查看原文
其他

Springboot+Dubbo+Nacos 注解方式实现微服务调用

点击关注 👉 Java面试那些事儿 2022-04-29

大家好,我是D哥

点击关注下方公众号,Java面试资料都在这里

作者:Sans

来源:https://urlify.cn/FveuI3


# 项目结构


|-- spring-boot-dubbo-demo (父级工程) |-- spring-boot-dubbo-base (基础工程) |-- spring-boot-dubbo-consumer (消费者) |-- spring-boot-dubbo-provider (生产者)

  • SpringBoot版本:2.2.0

  • Dubbo版本:2.7.0

  • Nacos版本:1.1.4


# 启动Nacos注册中心


Nacos官方文档:

https://nacos.io/zh-cn/docs/quick-start.html

默认账号密码是nacos




# 搭建项目


Consumer和Provider的Maven依赖如下:

<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Base依赖 --> <dependency> <groupId>com.sans</groupId> <artifactId>spring-boot-dubbo-base</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- Dubbo依赖 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.0</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.0</version> </dependency> <!-- Nacos依赖 --> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>2.7.1</version> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.0.0</version> </dependency></dependencies>

Consumer配置如下:

# 配置端口server: port: 8862dubbo: # 配置服务信息 application: name: dubbo-consumer # 禁用QOS同一台机器可能会有端口冲突现象 qos-enable: false qos-accept-foreign-ip: false # 配置注册中心 registry: address: nacos://127.0.0.1:8848 # 设置超时时间 consumer: timeout: 4000spring: main: # 解决Bean重复定义问题 allow-bean-definition-overriding: true

Provider配置如下:

# 配置端口server: port: 8861dubbo: # 配置服务信息 application: name: dubbo-provider # 禁用QOS同一台机器可能会有端口冲突现象 qos-enable: false qos-accept-foreign-ip: false # 配置注册中心 registry: address: nacos://127.0.0.1:8848 # 设置协议-协议由提供方指定消费方被动接受 protocol: name: dubbo port: 20880spring: main: # 解决Bean重复定义问题 allow-bean-definition-overriding: true

# Base工程编写


编写DTO

/** * RPC接口DTO * 注意这里要实现序列化接口 * @Author Sans * @CreateTime 2019/11/6 23:04 */@Datapublic class ProviderTestDTO implements Serializable { // ID private int id; // 名字 private String name; // 序号 private Integer number;}

编写Serivce

/** * RPC接口 * @Author Sans * @CreateTime 2019/11/6 23:03 */public interface IProviderService { List<ProviderTestDTO> queryList();}


编写返回结果类

/** * 返回结果类 * 这里采用构建者模式构建 * 优点:1.私有化构造器访问范围小 2.参数可灵活设置便于管理 * @Author Sans * @CreateTime 2019/11/7 18:59 */@Getterpublic class ResultVO<T> implements Serializable {
/** * 返回码 */ private int code; /** * 返回信息 */ private String message; /** * 返回数据 */ private T data;
/** 私有化构造器 **/ private ResultVO() {} private ResultVO(ResultVO<T> resultVO) { this.code = resultVO.code; this.message = resultVO.message; this.data = resultVO.data; }
/** * Build */ public static class Builder<T>{ private ResultVO<T> resultVO; public Builder() { resultVO = new ResultVO<>(); } public Builder code(int code){ resultVO.code = code; return this; } public Builder message(String message){ resultVO.message = message; return this; } public Builder data(T data){ resultVO.data = data; return this; } public ResultVO<T> build(){ return new ResultVO<>(resultVO); } }}

# Provider工程编写


在启动类上面不要忘记加上@EnableDubbo注解

@EnableDubbo //开启Dubbo的注解支持@SpringBootApplicationpublic class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); }}

实现IProviderService接口,注意这里的Serivce引用的是dubbo的包

/** * 生产者Dubbo接口实现 * @Author Sans * @CreateTime 2019/11/6 23:01 */@Servicepublic class ProviderServiceImpl implements IProviderService { @Override public List<ProviderTestDTO> queryList() { // 初始化数据 ProviderTestDTO testDTO1 = new ProviderTestDTO(); testDTO1.setId(1); testDTO1.setName("学生"); testDTO1.setNumber(100); ProviderTestDTO testDTO2 = new ProviderTestDTO(); testDTO2.setId(2); testDTO2.setName("教师"); testDTO2.setNumber(101); // 组装数据 List<ProviderTestDTO> list = new ArrayList<>(); list.add(testDTO1); list.add(testDTO2); return list; }}

# Consumer工程编写


和Provider工程的启动类一样,加上@EnableDubbo注解

@EnableDubbo //开启dubbo的注解支持@SpringBootApplicationpublic class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); }}

编写测试接口

/** * 消费测试接口 * @Author Sans * @CreateTime 2019/11/6 23:09 */@RestController@RequestMapping("/consumer")public class ConsumerController { // Dubbo远程调用注解 @Reference private IProviderService providerService; @RequestMapping(value = "/list",method = RequestMethod.GET) public ResultVO getList(){ // 远程调用 List<ProviderTestDTO> providerTestDTOList = providerService.queryList(); return new ResultVO.Builder<>().code(200).message("success").data(providerTestDTOList).build(); }}

# 测试


启动Provider工程和Consumer工程,这个时候Nacos会有对应的服务



使用Postman访问Consumer测试接口



# 项目源码


码云:

https://gitee.com/liselotte/spring-boot-dubbo-demo

GitHub:

https://github.com/xuyulong2017/my-java-demo



技术交流群


D哥也了一个技术群,主要针对一些新的技术和开源项目值不值得去研究和IDEA使用的“骚操作”,有兴趣入群的同学,可以长扫描区域二维码,一定要注意事项:城市+昵称+技术方向,根据格式备注,可快速通过。


▲长按扫描


热门推荐:

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存