spring boot + dubbo 2.7.x 优雅关闭_又陷入知识盲区了,面试被问SpringBoot集成dubbo,我当时就懵了...

前言

前两天在和粉丝聊天的时候,粉丝跟我说之前在面试的时候被问到SpringBoot这一块的知识被问的有点懵,和我问了不少这方面的东西。事后我想了想不如把这些东西分享出来吧,让更多的人看到,这样不管是对自己知识的一个提升还是对面试的准备都有好处。好了,满满的干货都在下面了!

1.创建maven项目父工程(不使用idea的spring Initializr)

不勾选任何模板,直接使用默认项目模板

ecb262cac9ad1c96cc5e475e3f186399.png

删除src文件夹,创建这个项目的目的是为了作为父工程,无需src文件夹,只保留pom文件即可

编辑pom文件

设置父工程打包方式为pom,用于依赖管理

    <packaging>pompackaging>

添加必要依赖

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
<version>${spring-boot.version}version>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<version>${spring-boot.version}version>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>${spring-boot.version}version>
dependency>


<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
<version>2.7.7version>
dependency>


<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-frameworkartifactId>
<version>4.0.1version>
dependency>


<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-recipesartifactId>
<version>2.8.0version>
dependency>


<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
<version>0.7version>
dependency>
dependencies>
dependencyManagement>

2. 创建生产者

同第一步相同,创建子模块,名为provider

删除src文件夹,该模块仍作为父工程使用

修改pom文件,继承父工程,并设置打包方式为pom

    <parent>
<groupId>online.hupeng.dubbogroupId>
<artifactId>baseartifactId>
<version>1.0version>
parent>
<artifactId>providerartifactId>
<packaging>pompackaging>
创建子工程provider-api,

修改pom文件,继承父工程provider
这个工程为生产者和约束者约束api规范,生产者和消费者都需依赖此模块联系彼此
此模块中只写api和实体类,不写实现方式

<parent>
<groupId>online.hupeng.dubbogroupId>
<artifactId>providerartifactId>
<version>1.0version>
parent>
<artifactId>provider-apiartifactId>
<version>1.0version>

<packaging>jarpackaging>
编写代码

实体类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.dubbogroupId>
<artifactId>providerartifactId>
<version>1.0version>
parent>
<artifactId>provider-serviceartifactId>
<version>1.0version>
<name>provider-servicename>
<properties>
<java.version>1.8java.version>
properties>
添加必须依赖
<dependencies>

<dependency>
<groupId>online.hupeng.dubbogroupId>
<artifactId>provider-apiartifactId>
<version>1.0version>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.junit.vintagegroupId>
<artifactId>junit-vintage-engineartifactId>
exclusion>
exclusions>
dependency>

<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
dependency>

<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-frameworkartifactId>
dependency>

<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-recipesartifactId>
dependency>

<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
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>baseartifactId>
<groupId>online.hupeng.dubbogroupId>
<version>1.0version>
parent>
<artifactId>consumerartifactId>
<version>1.0version>
添加必须依赖
<dependencies>

<dependency>
<groupId>online.hupeng.dubbogroupId>
<artifactId>provider-apiartifactId>
<version>1.0version>
<scope>compilescope>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starterartifactId>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>

<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<scope>testscope>
<exclusions>
<exclusion>
<groupId>org.junit.vintagegroupId>
<artifactId>junit-vintage-engineartifactId>
exclusion>
exclusions>
dependency>

<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-spring-boot-starterartifactId>
dependency>

<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-frameworkartifactId>
dependency>

<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-recipesartifactId>
dependency>

<dependency>
<groupId>com.101tecgroupId>
<artifactId>zkclientartifactId>
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

76b60772812486a1b818e205ac27cc1f.png

成功!!!

最后

感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值