天天看点

EDAS: Spring Boot 开发 Dubbo 应用

开发环境:InteliJ IDEA COMMUNITY

操作系统 :macOS Mojave

注册中心:为了便于本地开发,本教程使用 EDAS 提供的轻量级配置中心,轻量级配置中心包含了 EDAS 服务注册中心的基本功能。

1. 注册中心安装与配置

轻量级配置中心配置及使用请单独参考: 轻量级配置中心

验证配置中心是否可以正常使用:

打开浏览器,在地址栏输入 jmenv.tbsite.net:8080,回车,可看到轻量配置中心首页。

EDAS: Spring Boot 开发 Dubbo 应用
EDAS: Spring Boot 开发 Dubbo 应用
EDAS: Spring Boot 开发 Dubbo 应用
EDAS: Spring Boot 开发 Dubbo 应用

2. 创建 dubbo-provider

【File】->【New】->【Project】->【maven】->【Next】-> 自定义输入GroupId, ArtifactId
a. 主要依赖: Spring Boot 2.0.6.RELEASE(starter-web, actuator),dubbo-spring-boot-starter (0.2.0),edas-dubbo-extension (1.0.1)
<?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.alibaba.edas.boot</groupId>
    <artifactId>dubbo-boot-provider</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.0.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba.edas</groupId>
            <artifactId>edas-dubbo-extension</artifactId>
            <version>1.0.1</version>
        </dependency>
    </dependencies>

</project>           
b. 创建接口及方法
EDAS: Spring Boot 开发 Dubbo 应用
创建示例:IEatService,提供方法:eatFood()
package me.gary.edas.boot;

public interface IEatService {
    String eatFood(String str);
}           
c. 实现该接口方法
package me.gary.edas.boot;

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

@Service
public class EatServiceImpl implements IEatService {
    public String eatFood(String name) {
        return "Please eat " + name + " (from Dubbo with Spring Boot)";
    }
}           

d. 配置 dubbo 服务

src/main/resources 路径下创建 application.properties

dubbo.scan.basePackages: 接口服务实现类,@Service 注解所在的 package,若有多个,用逗号隔开

dubbo.registry.address: 前文提到的,本地已配置运行的轻量配置中心地址

# Base packages to scan Dubbo Components (e.g @Service , @Reference)
dubbo.scan.basePackages=me.gary.edas.boot
dubbo.application.name=dubbo-provider-springboot
dubbo.registry.address=edas://127.0.0.1:8080           
e. 开发 SpringBoot 入口类,并启动
package me.gary.edas.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DubboProvider {
    public static void main(String[] args) {
        SpringApplication.run(DubboProvider.class, args);
    }
}
           
EDAS: Spring Boot 开发 Dubbo 应用
 spring boot 的 tomcat 启动失败!!"address already in use"。回忆一下, 轻量注册中心是不是已经启动了8080的web页面啊

?是的。

f. 修改 spring boot 配置,指定端口为非8080端口,本示例使用8081。

最终,application.properties 配置如下:

# Base packages to scan Dubbo Components (e.g @Service , @Reference)
dubbo.scan.basePackages=me.gary.edas.boot
dubbo.application.name=dubbo-provider-springboot
dubbo.registry.address=edas://127.0.0.1:8080
server.port=8081           
“Tomcat started on port(s): 8081 (http) with context path ''”,消费者在指定8081端口成功运行。
EDAS: Spring Boot 开发 Dubbo 应用
打开“jmenv.tbsite.net:8080”,
EDAS: Spring Boot 开发 Dubbo 应用
可以看到服务提供者里已经包含了com.alibaba.edas.boot.IEatService,且可以看到该服务的服务分组和提供者 IP。

3. 创建 dubbo-consumer

a. pom 依赖配置,同 provider

b. 创建接口及方法,同 provider

c. 此项目调用以 Controller 方式为例,创建 ConsumerController

package me.gary.edas.boot;

import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConsumerController {

    @Reference
    private IEatService eatService;

    @RequestMapping("/eatFood/{food}")
    public String eatFood(@PathVariable String food) {
        return eatService.eatFood(food);
    }
}
           
特别注意: 同样,别忘记了 provider 中出现的问题。spring boot 默认在8080端口启动 tomcat,此例 consumer 分配8082。
dubbo.application.name=dubbo-consumer-springboot
dubbo.registry.address=edas://127.0.0.1:8080
server.port=8082           
package me.gary.edas.boot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DubboConsumer {
    public static void main(String[] args) {
        SpringApplication.run(DubboConsumer.class, args);
    }
}           
EDAS: Spring Boot 开发 Dubbo 应用
EDAS: Spring Boot 开发 Dubbo 应用

通过配置中心页面,可以看到服务调用者 com.alibaba.edas.boot.IEatService 已经注册成功。

f. 通过 Consumer  暴露的 RESTful 接口,调用 provider 的 eatFood() 接口。

本例 Consumer 注册端口为:8082,读者需根据 application.properties 中指定的端口,修改以下指令。

curl http://localhost:8082/eatFood/apple           
EDAS: Spring Boot 开发 Dubbo 应用
Yay! RESTful 接口 --> consumer --> provider,该流程验证通过。