前言

前两天在和粉丝聊天的时候,粉丝跟我说之前在面试的时候被问到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,我当时就懵了的更多相关文章

  1. 阿里面试:问springBoot自动装配我这样回答的,面试官对我竖起了大拇指

    引言 最近有个读者在面试,面试中被问到了这样一个问题"看你项目中用到了springboot,你说下springboot的自动配置是怎么实现的?"这应该是一个springboot里面 ...

  2. Zookeeper的选举机制和同步机制超详细讲解,面试经常问到!

    前言 zookeeper相信大家都不陌生,很多分布式中间件都利用zk来提供分布式一致性协调的特性.dubbo官方推荐使用zk作为注册中心,zk也是hadoop和Hbase的重要组件.其他知名的开源中间 ...

  3. 最近找java实习面试被问到的东西总结(Java方向)

    时间,就是这么很悄悄的溜走了将近两个年华,不知不觉的,研二了,作为一个一般学校的研究生,不知道该说自己是不学无术,还是说有过努力,反正,这两年里,有过坚持,有过堕落,这不,突然间,有种开窍的急迫感,寻 ...

  4. 面试官问,说一个你在工作非常有价值的bug

    如果你去参考面试,做足了准备,面对面试官员从容不迫,吐沫横飞的大谈自己的工作经历.突然,面试官横插一句:说一个你在工作非常有价值的bug.顿时,整个空气都仿佛都凝固了!“What?”... 我想没几个 ...

  5. linux驱动工程面试必问知识点

    linux内核原理面试必问(由易到难) 简单型 1:linux中内核空间及用户空间的区别?用户空间与内核通信方式有哪些? 2:linux中内存划分及如何使用?虚拟地址及物理地址的概念及彼此之间的转化, ...

  6. 微软BI SSIS 2012 ETL 控件与案例精讲面试 200 问(SSIS 面试题,ETL 面试题)

    开篇介绍 本自测与面试题出自 微软BI SSIS 2012 ETL 控件与案例精讲 (http://www.hellobi.com/course/21) 课程,对于学完本课程的每一课时和阅读完相关辅助 ...

  7. 面试官问:JS的this指向

    前言 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实.读者可以先拉到底部看总结,再谷歌(或各技术平台)搜索几篇类似文章,看笔者写的文章和别人有什么不同(欢迎在评论 ...

  8. 面试总问的jvm调优到底是要干什么?

    1. 压力测试的理解,xxx的性能10w/s,对你有意义么? 没有那家卖瓜的会说自己家的不甜,同样,没有哪个开源项目愿意告诉你在对它条件最苛刻的时候压力情况是多少,一般官网号称给你看的性能指标都是在最 ...

  9. 面试官问线程安全的List,看完再也不怕了!

    最近在Java技术栈知识星球里面有球友问到了线程安全的 List: 扫码查看答案或加入知识星球 栈长在之前的文章<出场率比较高的一道多线程安全面试题>里面讲过 ArrayList 的不安全 ...

随机推荐

  1. C#文件反序列化

    前言 最近,为了实现Unity游戏数据的加密,我都把注意力放到了C#的加密方式身上,最简单的莫过于C#的序列化了,废话不多说,直接开始 准备工作 在使用文件反序列化前我们得先引用命名空间 using ...

  2. 关于overflow的理解

    overflow会把超出父盒子的部分继续不同修改 在这我只执行一个常用属性值 原始代码如下(未设置overflow前): 执行结果: 设置后运行结果:

  3. log4j日志级别怎么搞

    日志的级别之间的大小关系如右所示:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF Log4j建 ...

  4. I-Isolated Pointset

    题意:给定T组数据,每组数据有一个数n,表示点集的个数,问是否存在一个点数为n的点集,使得任意两个点组成的边的垂直平分线过点集中的第三个点 本题非常巧妙,只需构造一个由(n-2)个相同共点(圆心)等边 ...

  5. 来自朋友最近阿里、腾讯、美团等P7岗位面试题

    来自年初和最近朋友的大厂面试题. 阿里巴巴 对象如何进行深拷贝,除了clone happen-before原则 jvm调优的实践 单例对象会被jvm的gc时回收吗 redis如果list较大,怎么优化 ...

  6. for循环使用体会

    最近在看源码的时候看到了以下代码: Class[] var2 = componentClasses; int var3 = componentClasses.length; for(int var4 ...

  7. vue+el-table在ajax分页时支持全选单页和全选所有

    需求:el-table中,ajax分页的情况下,要支持全选单页和全选所有页中的记录,效果如下图所示: 界面代码:           <el-table :data="tableDat ...

  8. 01_cifsd 高性能网络共享服务

    01_cifsd 高性能网络共享服务 1.简介 cifsd 是一款高性能I/O网络文件共享服务, 通过一种与kernel直接交互的方式实现, github简介:https://github.com/n ...

  9. php 之 excel导出导入合并

    <?php class Excel extends Controller { //直属高校 public function __construct() { parent::Controller( ...

  10. 10 XSRF和XSS

    10 XSRF和XSS CSRF(Cross-site request forgery)跨站请求伪造 XSS(Cross Site Scripting)跨站脚本攻击 CSRF重点在请求,XSS重点在脚 ...