Spring Boot-整合Dubbo

Dubbo官方网站: dubbo.apache.org/zh-cn/php


前言

我将会用一个小demo来介绍如何与Spring Boot整合;html

若是看我文章的朋友没有用过Spring Boot,Dubbo,那么我推荐你仍是先去熟悉一下,由于本篇文章没有介绍如何安装。java

此次的demo是获取用户订单信息的小demogit

目前这个demo正在个人github上: github.com/aaaTao66/du…github

开发环境

  • win10
  • idea 2019
  • zookeeper
  • dubbo
  • jdk1.8

建立项目

  • 首先咱们建立一个maven项目非Spring Boot项目,这个项目的名字叫作 xxx-interface。

我这里叫作:gmall-interfaceweb

根据 Dubbo的官方文档的 服务最佳化实践 里面说的:spring

建议将服务接口、服务模型、服务异常等均放在 API 包中,由于服务模型和异常也是 API 的一部分,这样作也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。apache

这就是咱们创建 gmall-interface 的缘由,也就是咱们要把Java Bean 和 接口放在这个项目里面,让每个微服务的项目依赖于它。json

  • 而后咱们再建立两个 Spring Boot的项目,一个提供者,一个消费者。

提供者项目名:boot-user-service-provider;(用户,能够什么都不勾选)服务器

消费者项目名:boot-order-service-consumer;(订单,记得初始化的时候要勾选web)

编写程序

项目:gmall-interface

  • 首先创建一个 JavaBean:
package com.carson.gmall.bean;


import java.io.Serializable;

public class UserAddress implements Serializable {

    private Integer id;
    private String userAddress; // 用户地址
    private String userId; // 用户id
    private String consignee; // 收货人
    private String phoneNum; // 电话号码
    private String isDefault; // 是否为默认地址 yes / no
   
    // 省略get set toString 等方法
复制代码

记得要实现序列化

打个比方,若是咱们的 A 客户端 想要调用 B客户端的一个方法,这个时候 A 服务器要与B服务器创建起链接,并且A服务器调用方法的时候要还要传入参数,而这个参数要在网络间传递,咱们须要序列化。

而后B服务器发现有外界的服务器想要调用个人方法,同时还给我传了参数,因为是序列化传过来的,因此B服务器要把参数反序列化。

而后方法调用完以后,还有一个返回值,这个时候基本与刚才同样,先是序列化,而后A再把它反序列化,这样就能够获得返回结果了。

  • 创建接口

OrderService:

import com.carson.gmall.bean.UserAddress;

import java.util.List;

/** * 用户服务接口 * */
public interface UserService {

    /* 按照用户id返回全部收获地址 * */
    List<UserAddress> getUserAddressList(String userId);
}
复制代码

UserService:

import com.carson.gmall.bean.UserAddress;

import java.util.List;

/** * 用户服务接口 * */
public interface UserService {

    /* 按照用户id返回全部收获地址 * */
    List<UserAddress> getUserAddressList(String userId);
}
复制代码
  • pom.xml 文件
<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.carson.gmall</groupId>
  <artifactId>gmall-interface</artifactId>
  <version>1.0-SNAPSHOT</version>

<dependencies>
    
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.8</version>
  </dependency>
    
  <dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.8.0</version>
  </dependency>
    
  <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.2</version>
  </dependency>
    
</dependencies>
</project>

复制代码

提供者项目:boot-user-service-provider

  • pom.xml

除了Spring Boot自带的,还须要添加这两个,dubbo的 0.2.0 版本是给Spring Boot 2.x用的。

若是Spring Boot是 1.x版本,那么dubbo应该用 0.1.0.

与 gmall-interface 进行关联。       
		<dependency>
            <groupId>com.carson.gmall</groupId>
            <artifactId>gmall-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency> 
		dubbo依赖
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version> 
        </dependency>
复制代码

而后就是Spring Boot的配置文件:

  • application.yml
dubbo:
 application:
 name: boot-order-service-consumer
 registry:
 address: zookeeper://127.0.0.1:2181
 monitor:
 protocol: registry
server:
 port: 8081
复制代码

没有用过可能看不懂这一段配置,其实对应的就是dubbo官方文档的那一段 provider.xml :

具体网址 :dubbo.apache.org/zh-cn/docs/…

可是个人配置里面没有 声明须要暴露的服务接口 ,这个等一下会说为何。

  • UserService的实现类
import com.alibaba.dubbo.config.annotation.Service;
import com.carson.gmall.bean.UserAddress;
import com.carson.gmall.bootuserserviceprovider.service.UserService;
import org.springframework.stereotype.Component;

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

@Service // 暴露服务
@Component
public class UserServiceImpl implements UserService {

    public List<UserAddress> getUserAddressList(String userId) {

        UserAddress address1 = new UserAddress(1, "河北省衡水市", "1", "carson","12345678911","Y");
        UserAddress address2 = new UserAddress(1, "山东省德州市", "2", "eason", "4562144", "Y");

        return Arrays.asList(address1,address2);
    }
}

复制代码

注意个人注解 @Service,这个注解不是Spring的,而是dubbo的:

import com.alibaba.dubbo.config.annotation.Service;

这个注解的意思就是:声明须要暴露的服务接口

这个方法咱们能够看到我设置了两个收获地址,而且把它以list方式返回。

  • Spring Boot主类
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@EnableDubbo // 开启基于注解的dubbo功能
@SpringBootApplication
public class BootUserServiceProviderApplication {

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

}
复制代码

消费者项目:boot-order-service-consumer

pom 文件与刚才的提供者同样。

  • application.yml
dubbo:
 application:
 name: boot-order-service-consumer
 registry:
 address: zookeeper://127.0.0.1:2181
 monitor:
 protocol: registry
server:
 port: 8081
复制代码

具体配的什么,能够参考duboo官方文档的快速启动,也就是刚才上面的网址:

dubbo.apache.org/zh-cn/docs/…

  • OrderServiceImpl
package com.carson.gmall.bootorderserviceconsumer.service.impl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.carson.gmall.bean.UserAddress;
import com.carson.gmall.bootuserserviceprovider.service.OrderService;
import com.carson.gmall.bootuserserviceprovider.service.UserService;
import com.sun.org.apache.bcel.internal.generic.RETURN;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
/** * 1. 将服务提供者注册到注册中心(暴漏服务) * 1) 导入 dubbo 依赖 * 2) 配置服务提供者 * * 2. 让服务消费者去注册中心订阅服务提供者的服务地址 * */
@Service
public class OrderServiceImpl implements OrderService {

    @Reference
    UserService userService;

    public List<UserAddress> initOrder(String userId) {
        System.out.println("用户id:"+userId);
        // 1. 查询用户的收货地址
        List<UserAddress> userAddressList = userService.getUserAddressList(userId);
        return userAddressList;
    }
}

复制代码

注意 @Reference: 远程调用UserService, 本身会去注册中心去发现

  • OrderController
@Controller
public class OrderController {

    @Autowired
    private OrderService orderService;

    @ResponseBody
    @RequestMapping("/initOrder")
    public List<UserAddress> initOrder(@RequestParam("uid") String userId) {
        return orderService.initOrder(userId);
    }
}
复制代码

@ResponseBody: 把获取到的结果以 json方式响应

  • 启动类
@EnableDubbo // 开启基于注解的dubbo功能
@SpringBootApplication
public class BootOrderServiceConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(BootOrderServiceConsumerApplication.class, args);
    }
}
复制代码

和提供者同样


启动zookeeper和dubbo和这两个项目,能够在dubbo控制台看到,已经有了消费者和提供者

而后,咱们刚才启动的Spring Boot,有一个是web项目,而且设置了端口 8081,让咱们试着访问这个 8081端口,而且带上参数:

成功获取到了订单信息;

相关文章
相关标签/搜索