又陷入知识盲区了,面试被问SpringBoot集成dubbo,我当时就懵了
前言
前两天在和粉丝聊天的时候,粉丝跟我说之前在面试的时候被问到SpringBoot这一块的知识被问的有点懵,和我问了不少这方面的东西。事后我想了想不如把这些东西分享出来吧,让更多的人看到,这样不管是对自己知识的一个提升还是对面试的准备都有好处。好了,满满的干货都在下面了!
1.创建maven项目父工程(不使用idea的spring Initializr)
不勾选任何模板,直接使用默认项目模板

删除src文件夹,创建这个项目的目的是为了作为父工程,无需src文件夹,只保留pom文件即可
编辑pom文件
设置父工程打包方式为pom,用于依赖管理
- <packaging>pom</packaging>
添加必要依赖
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- <version>${spring-boot.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <version>${spring-boot.version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- <version>${spring-boot.version}</version>
- </dependency>
- <!-- dubbo依赖 apache版 -->
- <dependency>
- <groupId>org.apache.dubbo</groupId>
- <artifactId>dubbo-spring-boot-starter</artifactId>
- <version>2.7.7</version>
- </dependency>
- <!-- dubbo所需其他依赖 使用alibaba的dubbo则不需要 -->
- <dependency>
- <groupId>org.apache.curator</groupId>
- <artifactId>curator-framework</artifactId>
- <version>4.0.1</version>
- </dependency>
- <!-- dubbo所需其他依赖 使用alibaba的dubbo则不需要 -->
- <dependency>
- <groupId>org.apache.curator</groupId>
- <artifactId>curator-recipes</artifactId>
- <version>2.8.0</version>
- </dependency>
- <!-- zookeeper依赖 -->
- <dependency>
- <groupId>com.101tec</groupId>
- <artifactId>zkclient</artifactId>
- <version>0.7</version>
- </dependency>
- </dependencies>
- </dependencyManagement>
2. 创建生产者
同第一步相同,创建子模块,名为provider
删除src文件夹,该模块仍作为父工程使用
修改pom文件,继承父工程,并设置打包方式为pom
- <parent>
- <groupId>online.hupeng.dubbo</groupId>
- <artifactId>base</artifactId>
- <version>1.0</version>
- </parent>
- <artifactId>provider</artifactId>
- <packaging>pom</packaging>
创建子工程provider-api,
修改pom文件,继承父工程provider
这个工程为生产者和约束者约束api规范,生产者和消费者都需依赖此模块联系彼此
此模块中只写api和实体类,不写实现方式
- <parent>
- <groupId>online.hupeng.dubbo</groupId>
- <artifactId>provider</artifactId>
- <version>1.0</version>
- </parent>
- <artifactId>provider-api</artifactId>
- <version>1.0</version>
- <!-- maven默认打包方式为jar包,此处可不用显示指定 -->
- <packaging>jar</packaging>
编写代码
实体类user
- package online.hupeng.dubbo.provider.domain;
- import java.io.Serializable;
- /*
- 当实体类作为RPC方法的返回值时,必须实现Serializable接口,dubbo的实现原理就是
- 消费者远程调用生产者方法,生产者返回序列化后的返回值,消费者通过网络获取到序
- 列化后的数据再反序列化
- */
- /*
- 此处不实现Serializable接口,远程调用方法时会报错,并提示实体类需继承此接口
- */
- public class User implements Serializable {
- private String account;
- private String password;
- public String getAccount() {
- return account;
- }
- public void setAccount(String account) {
- this.account = account;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
UserService接口
- package online.hupeng.dubbo.provider.service;
- import online.hupeng.dubbo.provider.domain.User;
- public interface UserService {
- User getUserInstance();
- }
执行mvn install命令将jar包打入本地仓库
完毕
在provider下创建子工程provider-service模块(此模块为真正的生产者)
编辑pom文件继承父工程
- <parent>
- <groupId>online.hupeng.dubbo</groupId>
- <artifactId>provider</artifactId>
- <version>1.0</version>
- </parent>
- <artifactId>provider-service</artifactId>
- <version>1.0</version>
- <name>provider-service</name>
- <properties>
- <java.version>1.8</java.version>
- </properties>
添加必须依赖
- <dependencies>
- <!-- 此处依赖api模块规范接口 -->
- <dependency>
- <groupId>online.hupeng.dubbo</groupId>
- <artifactId>provider-api</artifactId>
- <version>1.0</version>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <groupId>org.junit.vintage</groupId>
- <artifactId>junit-vintage-engine</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.dubbo</groupId>
- <artifactId>dubbo-spring-boot-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.curator</groupId>
- <artifactId>curator-framework</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.curator</groupId>
- <artifactId>curator-recipes</artifactId>
- </dependency>
- <dependency>
- <groupId>com.101tec</groupId>
- <artifactId>zkclient</artifactId>
- </dependency>
- </dependencies>
UserService的实现类UserServiceImpl
- package online.hupeng.dubbo.provider.service.impl;
- import online.hupeng.dubbo.provider.domain.User;
- import online.hupeng.dubbo.provider.service.UserService;
- import org.apache.dubbo.config.annotation.DubboService;
- /*
- dubbo注解,指定接口版本号和超时时间,调用方需正确填写版本信息
- */
- @DubboService(version = "1.0", timeout = 300)
- public class UserServiceImpl implements UserService {
- @Override
- public User getUserInstance() {
- User user = new User();
- user.setAccount("admin");
- user.setPassword("admin");
- return user;
- }
- }
application.yml配置
- dubbo:
- application:
- # 指定该服务名称
- name: provider
- registry:
- # 通信协议
- protocol: zookeeper
- # 注册中心地址
- address: 127.0.0.1
- # 注册中心端口号
- port: 2181
- # 也可以不配置protocol和port,直接配置为zookeeper://127.0.0.1:2181
- protocol:
- name: dubbo
- # 服务暴露端口
- port: 8081
- # 包扫描(此处为扫描dubbo的注解,和SpringBoot无关)
- scan:
- base-packages: online.hupeng.dubbo
为启动类添加dubbo注解@EnableDubbo
- package online.hupeng.dubbo.provider;
- import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- @EnableDubbo
- @SpringBootApplication
- public class ProviderServiceApplication {
- public static void main(String[] args) {
- SpringApplication.run(ProviderServiceApplication.class, args);
- }
- }
3. 创建消费者
在根项目下创建consumer模块
编辑pom文件继承父项目
- <parent>
- <artifactId>base</artifactId>
- <groupId>online.hupeng.dubbo</groupId>
- <version>1.0</version>
- </parent>
- <artifactId>consumer</artifactId>
- <version>1.0</version>
添加必须依赖
- <dependencies>
- <!-- 引入provider-api依赖用以远程调用 -->
- <dependency>
- <groupId>online.hupeng.dubbo</groupId>
- <artifactId>provider-api</artifactId>
- <version>1.0</version>
- <scope>compile</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- <exclusions>
- <exclusion>
- <groupId>org.junit.vintage</groupId>
- <artifactId>junit-vintage-engine</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>org.apache.dubbo</groupId>
- <artifactId>dubbo-spring-boot-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.curator</groupId>
- <artifactId>curator-framework</artifactId>
- </dependency>
- <dependency>
- <groupId>org.apache.curator</groupId>
- <artifactId>curator-recipes</artifactId>
- </dependency>
- <dependency>
- <groupId>com.101tec</groupId>
- <artifactId>zkclient</artifactId>
- </dependency>
- </dependencies>
编辑controller层代码远程调用
- package online.hupeng.dubbo.consumer.controller;
- import online.hupeng.dubbo.provider.domain.User;
- import online.hupeng.dubbo.provider.service.UserService;
- import org.apache.dubbo.config.annotation.DubboReference;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.ResponseBody;
- @Controller
- public class ConsumerController {
- /*
- 远程调用注解,需正确对应生产者的版本号,此处不需要@autowird注入对象
- */
- @DubboReference(version = "1.0")
- private UserService userService;
- @ResponseBody
- @GetMapping("/test")
- public User getUser() {
- return userService.getUserInstance();
- }
- }
配置application.yml文件
- dubbo:
- application:
- name: provider
- registry:
- protocol: zookeeper
- address: 127.0.0.1
- port: 2181
- protocol:
- name: dubbo
- # 服务暴露端口
- port: 8081
- # 包扫描
- scan:
- base-packages: online.hupeng.dubbo
- ```
添加SpringBoot启动类
- package online.hupeng.dubbo.consumer;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- @SpringBootApplication
- public class ConsumerApplication {
- public static void main(String[] args) {
- SpringApplication.run(ConsumerApplication.class, args);
- }
- }
4. 测试
按顺序启动zookeeper、provider-service、consumer
访问http://localhost/test

成功!!!
最后
感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!
又陷入知识盲区了,面试被问SpringBoot集成dubbo,我当时就懵了的更多相关文章
- 阿里面试:问springBoot自动装配我这样回答的,面试官对我竖起了大拇指
引言 最近有个读者在面试,面试中被问到了这样一个问题"看你项目中用到了springboot,你说下springboot的自动配置是怎么实现的?"这应该是一个springboot里面 ...
- Zookeeper的选举机制和同步机制超详细讲解,面试经常问到!
前言 zookeeper相信大家都不陌生,很多分布式中间件都利用zk来提供分布式一致性协调的特性.dubbo官方推荐使用zk作为注册中心,zk也是hadoop和Hbase的重要组件.其他知名的开源中间 ...
- 最近找java实习面试被问到的东西总结(Java方向)
时间,就是这么很悄悄的溜走了将近两个年华,不知不觉的,研二了,作为一个一般学校的研究生,不知道该说自己是不学无术,还是说有过努力,反正,这两年里,有过坚持,有过堕落,这不,突然间,有种开窍的急迫感,寻 ...
- 面试官问,说一个你在工作非常有价值的bug
如果你去参考面试,做足了准备,面对面试官员从容不迫,吐沫横飞的大谈自己的工作经历.突然,面试官横插一句:说一个你在工作非常有价值的bug.顿时,整个空气都仿佛都凝固了!“What?”... 我想没几个 ...
- linux驱动工程面试必问知识点
linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...
- 微软BI SSIS 2012 ETL 控件与案例精讲面试 200 问(SSIS 面试题,ETL 面试题)
开篇介绍 本自测与面试题出自 微软BI SSIS 2012 ETL 控件与案例精讲 (http://www.hellobi.com/course/21) 课程,对于学完本课程的每一课时和阅读完相关辅助 ...
- 面试官问:JS的this指向
前言 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实.读者可以先拉到底部看总结,再谷歌(或各技术平台)搜索几篇类似文章,看笔者写的文章和别人有什么不同(欢迎在评论 ...
- 面试总问的jvm调优到底是要干什么?
1. 压力测试的理解,xxx的性能10w/s,对你有意义么? 没有那家卖瓜的会说自己家的不甜,同样,没有哪个开源项目愿意告诉你在对它条件最苛刻的时候压力情况是多少,一般官网号称给你看的性能指标都是在最 ...
- 面试官问线程安全的List,看完再也不怕了!
最近在Java技术栈知识星球里面有球友问到了线程安全的 List: 扫码查看答案或加入知识星球 栈长在之前的文章<出场率比较高的一道多线程安全面试题>里面讲过 ArrayList 的不安全 ...
随机推荐
- 想买保时捷的运维李先生学Java性能之 JIT即时编译器
前言 本文记录日常学习<深入理解Java虚拟机>,不知道为啥感觉看一遍也就过了,喜欢动动手理解理解,这样才有点感觉,静不下心来的时候,看书抄书也可以用这个办法. 一.什么是JIT(Just ...
- C++学习---二叉树的输入及非递归遍历
二叉树的二叉链表存储表示如下 //二叉树的二叉链表存储表示 typedef struct BiTNode { char data;//结点数据域 struct BiTNode* lchild, * r ...
- JS初级运算符优先级
该图优先级由 高到低 显示
- find for /f 分割字符串 bat
@Echo off::总用例数For /f "tokens=2" %%i in ('Type bat.txt^|Find "Ran"') do (Echo %% ...
- 两个有序数列找第k小
给定一个数组,数组中的数据无序,在一个数组中找出其第k个最小的数,例如对于数组x,x = {3,2,1,4,5,6},则其第2个最小的数为2 两个有序数组 找第k小 * 方案一 合并遍历 * 二:游 ...
- Sec-Fetch-*请求头,了解下?
如果你使用76+版本的chrome浏览器,通过开发者面板查看每个网络请求,会发现都有几个Sec-Fetch开头的请求头,例如访问百度首页https://www.baidu.com/的请求: Sec-F ...
- Eureka实现注册中心
CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性),三者不可得兼.它是分布 ...
- 【总结】springcloud
一.spirngcloud概述 1.springcloud是什么? spring cloud是一个一站式的开发分布式系统的框架,为开发人员提供了快速构建分布式系统中一些常见模式的工具(如:配置管理,服 ...
- get方法和post方法的区别?
get是从服务器上获取数据,post是向服务器传送数据,会新增资源或者修改已有资源,因此get一般用于查询,psot多用新增和修改: get和post在本质上来说没有多大区别,都是tcp链接,要说最大 ...
- MapStruct 解了对象映射的毒
前言 MVC模式是目前主流项目的标准开发模式,这种模式下框架的分层结构清晰,主要分为Controller,Service,Dao.分层的结构下,各层之间的数据传输要求就会存在差异,我们不能用一个对象来 ...