基于SpringBoot2.0.x+Dubbo2.6.x+zookeeper3.4.1x创建RPC服务

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 下图是dubbo官网给的图。在系统越来越庞大的情况下,分布式就显得尤为重要了,应用之间交互是不可避免的,将核心业务抽取出来,作为独立的服务,然后逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

由于公司使用的是springboot+dubbo的分布式架构,虽然个人更偏向于springcloud,但是日常中使用dubbo更多,所以也参考了很多的资料,自己搭建了一个基于目前最新版本的RPC服务demo。(springboot 2.0.5+dubbo2.6.3+zookeeper3.4.10)用来熟悉dubbo和学习相关技术,把搭建过程记录下来,防止自己和他人踩坑。


下图是dubbo官网给的图。在系统越来越庞大的情况下,分布式就显得尤为重要了,应用之间交互是不可避免的,将核心业务抽取出来,作为独立的服务,然后逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

20180913151432208.jpg

在项目搭建之前首先需要一个注册中心,dubbo推荐使用zookeeper,所以我这里使用的也是zookeeper,下载地址:http://zookeeper.apache.org/。下载完成后解压就行。不会的参考:http://dubbo.apache.org/zh-cn/docs/admin/install/zookeeper.html

首先使用idea创建一个空的springboot项目用来做多模块的父工程:spring-boot-dubbo-parent。这里要注意把打包方式改为pom类型。代码如下:

<?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.wangzc</groupId>
    <artifactId>spring-boot-dubbo-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>spring-boot-dubbo-parent</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project


然后在父工程下创建一个module:spring-boot-dubbo-api。用来存放所有的公共接口。pom文件同上,打包类型为jar。

再创建一个服务生产者:spring-boot-dubbo-provider。这里需要添加dubbo以及zookeeper的包,同时使用dubbo官方给出的starter。github地址:https://github.com/apache/incubator-dubbo-spring-boot-project(不是alibaba的那个,那个不维护了。)同时引入刚才创建的api。


<?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.wangzc</groupId>
    <artifactId>spring-boot-dubbo-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>spring-boot-dubbo-provider</name>
    <description>Demo project for Spring Boot</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.wangzc</groupId>
            <artifactId>spring-boot-dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


最后一个就是服务消费者了:spring-boot-dubbo-consumer。pom文件同上,多了一个web包。


<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
</dependency>


parent的pom文件引入3个module


<modules>
    <module>spring-boot-dubbo-api</module>
    <module>spring-boot-dubbo-provider</module>
    <module>spring-boot-dubbo-consumer</module>
</modules>


这里就用dubbo官网给出的最简单的sayHello例子用来验证服务是否发布成功,在api的module包下创建一个接口用来提供服务。


package com.FarStars.springbootdubboapi.service;
/**
 * @author FarStars
 * @date 2018/9/13
 */
public interface HelloService {
    /**
     * sayHello
     *
     * @author FarStars
     * @param name name
     * @return java.lang.String
     */
    String sayHello(String name);
}


provider的application.properties配置文件:


# Spring boot application
spring.application.name = spring-boot-dubbo-provider
server.port = 9090
management.port = 9091
# Service version
provider.service.version = 1.0.0
# Base packages to scan Dubbo Components (e.g @Service , @Reference)
# 实现类的包路径(换成自己的)
dubbo.scan.basePackages  = com.xxx.springbootdubboprovider.impl
# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-provider
dubbo.application.name = dubbo-provider
## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880
## RegistryConfig Bean
dubbo.registry.id = my-registry
# zookeeper的地址(换成自己的)
dubbo.registry.address = zookeeper://xxx:2181


HelloService的实现类,注意这里要用dubbo的service注解,不是spring的。


package com.FarStars.springbootdubboprovider.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.FarStars.springbootdubboapi.service.HelloService;
/**
 * @author FarStars
 * @date 2018/9/13
 */
@Service(
        version = "${provider.service.version}",
        application = "${dubbo.application.id}",
        protocol = "${dubbo.protocol.id}",
        registry = "${dubbo.registry.id}"
)
public class HelloServiceImpl implements HelloService {
    /**
     * sayHello
     *
     * @param name name
     * @return java.lang.String
     * @author FarStars
     */
    @Override
    public String sayHello(String name) {
        return "Hello, " + name;
    }
}


consumer的application.properties配置文件:


# Spring boot application
spring.application.name = spring-boot-dubbo-consumer
server.port = 8080
management.port = 8081
# Service Version
consumer.service.version = 1.0.0
# Dubbo Config properties
## ApplicationConfig Bean
dubbo.application.id = dubbo-consumer
dubbo.application.name = dubbo-consumer
## ProtocolConfig Bean
dubbo.protocol.id = dubbo
dubbo.protocol.name = dubbo
dubbo.protocol.port = 20880


HelloController类:


package com.FarStars.springbootdubboconsumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.FarStars.springbootdubboapi.service.HelloService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author FarStars
 * @date 2018/9/13
 */
@RestController
public class HelloController {
    @Reference(
            version = "${consumer.service.version}",
            application = "${dubbo.application.id}",
            url = "dubbo://localhost:20880"
    )
    private HelloService helloService;
    @RequestMapping("/sayHello")
    public String sayHello(@RequestParam String name) {
        return helloService.sayHello(name);
    }
}


启动类上要加controller包扫描


@SpringBootApplication(scanBasePackages =     
    "com.FarStars.springbootdubboconsumer.controller")


这样就算搭建完成了,测试时先启动provider,再启动consumer。

示例 Controller : http://localhost:8080/sayHello?name=FarStars  网页输出如下,表示服务发布成功


20180913161531718.png


本文参考:dubbo官网:http://dubbo.apache.org/zh-cn/index.html

starter中文文档:https://github.com/apache/incubator-dubbo-spring-boot-project/blob/master/README_CN.md

也可以引入actuator包检查健康状态,请参考以上文档。

(本人才疏学浅,如有错误纯属正常,欢迎指出!)

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
23天前
|
Dubbo 应用服务中间件 API
使用 Apifox、Postman 测试 Dubbo 服务,Apache Dubbo OpenAPI 即将发布
Apache Dubbo 3.3.3(即将发布)实现了与 OpenAPI 的深度集成,通过与 OpenAPI 的深度集成,用户能够体验到从文档生成到接口调试、测试和优化的全流程自动化支持。不论是减少手动工作量、提升开发效率,还是支持多语言和多环境,Dubbo 3.3.3 都展现了其对开发者体验的极大关注。结合强大的 Mock 数据生成和自动化测试能力,这一版本为开发者提供了极具竞争力的服务治理解决方案。如果你正在寻找高效、易用的微服务框架,Dubbo 3.3.3 将是你不容错过的选择。
|
24天前
|
JavaScript NoSQL Java
基于SpringBoot+Vue实现的大学生就业服务平台设计与实现(系统源码+文档+数据库+部署等)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
63 6
|
4月前
|
存储 负载均衡 监控
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
这篇文章是关于Apache Dubbo框架与Zookeeper的关系,以及如何下载、安装和启动Zookeeper的教程,包括解决启动过程中可能遇到的报错问题。
163 3
dubbo学习一:zookeeper与dubbo的关系,下载安装启动zookeeper(解决启动中报错)
|
4月前
|
Dubbo 应用服务中间件 Apache
Dubbo 应用切换 ZooKeeper 注册中心实例,流量无损迁移
如果 Dubbo 应用使用 ZooKeeper 作为注册中心,现在需要切换到新的 ZooKeeper 实例,如何做到流量无损?
55 4
|
4月前
|
存储 前端开发 JavaScript
前端的全栈之路Meteor篇(四):RPC方法注册及调用-更轻量的服务接口提供方式
RPC机制通过前后端的`callAsync`方法实现了高效的数据交互。后端通过`Meteor.methods()`注册方法,支持异步操作;前端使用`callAsync`调用后端方法,代码更简洁、易读。本文详细介绍了Methods注册机制、异步支持及最佳实践。
|
4月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
293 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
9月前
|
Dubbo Java 应用服务中间件
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
微服务学习 | Springboot整合Dubbo+Nacos实现RPC调用
|
4月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
100 2
|
6月前
|
Dubbo Java 应用服务中间件
💥Spring Cloud Dubbo火爆来袭!微服务通信的终极利器,你知道它有多强大吗?🔥
【8月更文挑战第29天】随着信息技术的发展,微服务架构成为企业应用开发的主流模式,而高效的微服务通信至关重要。Spring Cloud Dubbo通过整合Dubbo与Spring Cloud的优势,提供高性能RPC通信及丰富的生态支持,包括服务注册与发现、负载均衡和容错机制等,简化了服务调用管理并支持多种通信协议,提升了系统的可伸缩性和稳定性,成为微服务通信领域的优选方案。开发者仅需关注业务逻辑,而无需过多关心底层通信细节,使得Spring Cloud Dubbo在未来微服务开发中将更加受到青睐。
103 0
|
3月前
|
Dubbo Cloud Native 应用服务中间件
阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。
在云原生时代,微服务架构成为主流。阿里云的 Dubbo 和 Nacos 深度整合,提供了高效的服务注册与发现、配置管理等关键功能,简化了微服务治理,提升了系统的灵活性和可靠性。示例代码展示了如何在项目中实现两者的整合,通过 Nacos 动态调整服务状态和配置,适应多变的业务需求。
110 2