又陷入知识盲区了,面试被问SpringBoot集成dubbo,我当时就懵了

前言

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

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

不勾选任何模板,直接使用默认项目模板
又陷入知识盲区了,面试被问SpringBoot集成dubbo,我当时就懵了_第1张图片

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

编辑pom文件

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

    pom

添加必要依赖


    
        
            org.springframework.boot
            spring-boot-starter
            ${spring-boot.version}
        

        
            org.springframework.boot
            spring-boot-starter-test
            ${spring-boot.version}
        

        
            org.springframework.boot
            spring-boot-starter-web
            ${spring-boot.version}
        

        
        
            org.apache.dubbo
            dubbo-spring-boot-starter
            2.7.7
        

        
        
            org.apache.curator
            curator-framework
            4.0.1
        

        
        
            org.apache.curator
            curator-recipes
            2.8.0
        

        
        
            com.101tec
            zkclient
            0.7
        
    

2. 创建生产者

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

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

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

    
        online.hupeng.dubbo
        base
        1.0
    
    provider
    pom

创建子工程provider-api,

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


    online.hupeng.dubbo
    provider
    1.0

provider-api
1.0

jar

编写代码

实体类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文件继承父工程


    online.hupeng.dubbo
    provider
    1.0

provider-service
1.0
provider-service

    1.8

添加必须依赖


    
    
        online.hupeng.dubbo
        provider-api
        1.0
    

    
        org.springframework.boot
        spring-boot-starter
    

    
        org.springframework.boot
        spring-boot-starter-test
        test
        
            
                org.junit.vintage
                junit-vintage-engine
            
        
    

    
        org.apache.dubbo
        dubbo-spring-boot-starter
    

    
        org.apache.curator
        curator-framework
    

    
        org.apache.curator
        curator-recipes
    

    
        com.101tec
        zkclient
    

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文件继承父项目


    base
    online.hupeng.dubbo
    1.0

consumer
1.0

添加必须依赖


    
    
        online.hupeng.dubbo
        provider-api
        1.0
        compile
    
    
    
        org.springframework.boot
        spring-boot-starter
    

    
        org.springframework.boot
        spring-boot-starter-web
    

    
        org.springframework.boot
        spring-boot-starter-test
        test
        
            
                org.junit.vintage
                junit-vintage-engine
            
        
    

    
        org.apache.dubbo
        dubbo-spring-boot-starter
    

    
        org.apache.curator
        curator-framework
    

    
        org.apache.curator
        curator-recipes
    

    
        com.101tec
        zkclient
    

编辑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
![](https://upload-images.jianshu.io/upload_images/23140115-86109ded3f85528b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

成功!!!
## 最后

你可能感兴趣的:(java,spring,springboot,程序员)