dubbo web工程示例_Dubbo整合SpringBoot

点击上方“Java知音”,选择“置顶公众号”

技术文章第一时间送达!

作者:雪山上的蒲公英

cnblogs.com/zjfjava/p/9696086.html

目前的dubbo已支持和springboot集成,还是之前的例子,这次我们通过springboot容器来实现。借此了解一下基于springboot容器启动的dubbo的配置及使用。

1. 准备工作

创建一个Maven空项目,作为项目的父工程,此工程的子项目基于Spring Boot 2.0.5 实现

ebaa58afa9f6fb0a7575db77c133af91.png

在父工程的pom.xml引入之后要创建的子工程

    <modules>
        <module>gmall-interfacemodule>
        <module>user-service-providermodule>
        <module>order-service-consumermodule>
    modules>

可以提前看一下工程结构

bce308afbfbaf871a51084e9c73a3f8b.png

下面分别来实现子工程:(子工程的实现方式都是在gmall工程下新建Module)

c3f5aa394bfba10ac339bfc89b2267b0.png

2. 公共API

项目中共用的接口和POJO类,代码和之前一样,这里不再展开

4431e1e5b53cda5452890b49b37190a8.png

3. 服务提供者

工程结构如下

4ba14d0ba522cea9823fd18cf4a56368.png

引入依赖


        <dependency>
            <groupId>com.zanggroupId>
            <artifactId>gmall-interfaceartifactId>
            <version>1.0-SNAPSHOTversion>
        dependency>
        
        <dependency>
            <groupId>com.alibaba.bootgroupId>
            <artifactId>dubbo-spring-boot-starterartifactId>
            <version>0.2.0version>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starterartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>

需要注意的是,根据jdk和Spring Boot版本的不同,dubbo-spring-boot-starter的版本需要有根据的选择

56127d7eb9c40318ddbddcebeec76293.png

dubbo提供了@Service注解,可将类声明为提供方,省去了大量配置的麻烦

import com.alibaba.dubbo.config.annotation.Service;
import com.zang.gmall.bean.UserAddress;
import com.zang.gmall.service.UserService;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@Service   //属于Dubbo的@Service注解,非Spring  作用:暴露服务
@Component
public class UserServiceImpl implements UserService {

    @Override
    public List getUserAddressList(String userId) {
    //省略
}}

通过属性配置的方式设置application.properties

#当前服务/应用的名字
dubbo.application.name=user-service-provider

#注册中心的协议和地址
dubbo.registry.protocol=zookeeper
dubbo.registry.address=127.0.0.1:2181

#通信规则(通信协议和接口)
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880

#连接监控中心
dubbo.monitor.protocol=registry
#开启包扫描,可替代 @EnableDubbo 注解
##dubbo.scan.base-packages=com.zang.gmall

springboot容器根据配置启动服务提供方,这里需要添加 @EnableDubbo 注解,springboot注解大全:注解大全

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// 开启基于注解的dubbo功能(主要是包扫描@DubboComponentScan)
// 也可以在配置文件中使用dubbo.scan.base-package来替代   @EnableDubbo
@EnableDubbo

@SpringBootApplication
public class UserServiceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(UserServiceProviderApplication.class, args);
    }
}

提供方顺利启动

6589f50892fca11178c2d04d9c1e7e19.png

4. 服务消费者

消费者工程在初始化时设置为web项目,结构如下

f4e5792240123ed24542aa27ab291a3b.png

引入和服务提供方同样的依赖,除此之外,添加springboot web模块的依赖。

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

dubbo提供了@Reference注解,可替换@Autowired注解,用于引入远程服务

import com.alibaba.dubbo.config.annotation.Reference;
import com.zang.gmall.bean.UserAddress;
import com.zang.gmall.service.OrderService;
import com.zang.gmall.service.UserService;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class OrderServiceImpl implements OrderService {

    @Reference
    UserService userService;

    @Override
    public List initOrder(String userId) {
  //代码省略
   }
}

配置文件application.properties

#避免和监控中心端口冲突,设为8081端口访问
server.port=8081  

dubbo.application.name=order-service-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.monitor.protocol=registry

启动类同样加上@EnableDubbo注解

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@EnableDubbo
@SpringBootApplication
public class OrderServiceConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderServiceConsumerApplication.class, args);
    }
}

为查看调用是否成功,新增控制层用于访问

import com.zang.gmall.bean.UserAddress;
import com.zang.gmall.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class OrderController {

    @Autowired
    OrderService orderService;

    @ResponseBody   //以json格式返回
    @RequestMapping("/initOrder")
    public List initOrder(@RequestParam("uid") String userId){

       return orderService.initOrder(userId);
    }

}

5. 测试调用

启动消费方,在浏览器访问

83f65ec7943c356250dc932608d1b3f8.png

调用成功

c1696a16e0f642730160a6af31cc5a2f.png

附:springboot也允许引用xml文件配置,方法是在启动类中加入如下注解

//@EnableDubbo
//引入配置信息
@ImportResource(locations="classpath:provider.xml")
@SpringBootApplication
public class UserServiceProviderApplication {
//略
}

END

Java面试题专栏

【40期】说一下线程池内部工作原理 【39期】Mybatis面试18问,你想知道的都在这里了! 【38期】一份tcp、http面试指南,常考点都给你了 【37期】请你详细说说类加载流程,类加载机制及自定义类加载器 【36期】说说 如何停止一个正在运行的线程? 【35期】谈谈你对Java线程之间通信方式的理解 【34期】谈谈为什么要拆分数据库? 有哪些方法? 【33期】分别谈谈联合索引生效和失效的条件 【32期】你知道Redis的字符串是怎么实现的吗? 【31期】了解什么是 redis 的雪崩、穿透和击穿? redis 崩溃之后会怎么样? 应对措施是什么

0670e369aa063e0ede17702ab83c289c.png

我知道你 “在看f893db2ff228c1c9bd6368225d415445.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值