springboot整合dubbo(最新踩坑版)

springboot整合dubbo(最新踩坑版),第1张

springboot整合dubbo(最新踩坑版)

dubbo和springboot的更新都太快了, 连dubbo的官网都更不上脚步,所以只能自己含泪忍痛总结出一套当前(2021年12月)能用的整合方案,以及更新之后出现的新坑

目录

dubbo简介

dubbo使用

注册中心 Zookeeper

父工程

公用api模块

提供者模块(provider)

消费者模块(consumer)

注意事项


dubbo简介

dubbo就是阿里开发的一项用基于RPC思想的软件,用来实现分布式架构,dubbo的默认端口是20880

主要理解下面几点:

  • 提供者要向注册中心注册自己

  • 使用者要向注册中心订阅自己需要的服务(来自提供者)

  • 使用者可以调用提供者的方法(使用其服务)

dubbo使用 注册中心 Zookeeper

需要的注册中心软件, dubbo官网推荐使用zookeeper

zookeeper安装之后一定需要若干配置之后才能使用

有关zk的安装和配置可以参考网上其他博客

点击zkServer.cmd运行服务器端, zkCli.cmd运行客户端

父工程

只有公用的maven依赖

pom


    
        8
        8
    

    
        org.springframework.boot
        spring-boot-starter-parent
        2.6.1
    

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

        
            org.springframework.boot
            spring-boot-starter-actuator
        

        
            org.springframework.boot
            spring-boot-starter-aop
        

        
            org.springframework.boot
            spring-boot-devtools
        

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

        
            org.apache.curator
            curator-framework
            5.1.0
        

        
        
            org.apache.curator
            curator-x-discovery
            5.1.0
        

        
            org.apache.curator
            curator-recipes
            5.1.0
        

        
            org.projectlombok
            lombok
        

        
            groupId
            dubbo-common
            1.0-SNAPSHOT
        

    

curator三个依赖都要注入!

也可以注入zookeeper和zkclient代替这三个, 但是可能会出错

公用api模块

公用api模块只放公用接口和实体类, 每个模块中都要导入api模块的依赖

它无需继承父工程, 也不需要springboot启动类

pom


    
        org.projectlombok
        lombok
        1.18.22
    

entity

实体类(注意一定要实现序列化接口!)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable{

    private int id;
    private String name;
}

service

公用接口

public interface UserService{

    User get();

    User post();
}
提供者模块(provider)

pom

只需要继承父工程


        groupId
        07_Dubbo
        1.0-SNAPSHOT
    

yaml

我们需要确定提供者的端口号, 提供哪些方法, 注册中心是什么

server:
  port: 8081
​
spring:
  application:
    name: provider 
​
dubbo:
  application:
    name: dubbo-provider
  protocol:
    port: 20880 # 暴露的端口号
​
  registry:
    address: zookeeper://127.0.0.1:2181?init.timeout=60000 # 注册中心
  scan:
    base-packages: provider.service.impl # 扫描的包名
  provider:
    token: true # 是否提供服务

Application

@SpringBootApplication
@EnableDubbo(scanbasePackages = "provider/service/impl")
public class ProviderApplication{
    public static void main(String[] args){
        SpringApplication.run(ProviderApplication.class, args);
    }
}

service.impl

@DubboService // dubbo暴露服务
@Service // spring注入容器
public class UserServiceImpl implements UserService{
​
    public User get(){
        return new User(1, "hello");
    }
​
    public User post(){
        return new User(2, "post");
    }
}

注意Dubbo的 @Service(可能是为了不与spring的混淆)注解已经更新为@DubboService

@Reference更新为@DubboReference

controller

@RestController
public class UserController{

    @Resource
    UserServiceImpl userService;

    @GetMapping("user/get")
    public User get(){
        return userService.get();
    }

    @PostMapping("user/post")
    public User post(){
        return userService.post();
    }
}
消费者模块(consumer)

pom

同提供者, 也只需要继承父工程

yaml

server:
  port: 7001 # tomcat端口号
​
spring:
  application:
    name: consumer # 模块应用名
​
dubbo:
  application:
    name: dubbo-provider # dubbo应用名
​
  registry:
    address: zookeeper://127.0.0.1:2181?init.timeout=60000 # 注册中心url
    protocol: zookeeper # 协议是zookeeper, 可以不写
​
  scan:
    base-packages: consumer # 要扫描的包

Application

@EnableDubbo
@SpringBootApplication
public class ConsumerApplication{
    public static void main(String[] args){
        SpringApplication.run(ConsumerApplication.class, args);
    }
}

controller

@RestController
public class UserController{
​
    // 一定要用dubbo的@DubboReference注解注入属性
    @DubboReference
    UserService userService;
​
    @GetMapping("user/get")
    public User get(){
        return userService.get();
    }
​
    @PostMapping("user/post")
    public User post(){
        return userService.post();
    }
​
}

一定要用dubbo的@DubboReference注解注入属性

整个项目目录结构(公共api, 提供者, 消费者)

使用idea的httpclient测试成功了!(心酸)

注意事项
  • 一定要先运行提供者, 再运行消费者, 有更新时两者都要重启

  • 提供者和消费者两者主程序同级及以下的包名一定要相同

  • 一定要先启动zk的服务器端

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5659315.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存