Dubbo快速上手与spring-boot整合以及配置体系

导读:本篇文章讲解 Dubbo快速上手与spring-boot整合以及配置体系,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

本期小编为大家带来dubbo与spring-boot的整合,由于目前大部分项目已经使用spring-boot了,所以小编就没有在spring上做整合,同时,dubbo的jar包内置了与spring整合的包,所以不像mybatis一样需要引入mybatis-spring的整合jar包。待会儿小编会讲到

与spring-boot整合

zookeeper注册中心

这边小编就不具体说明了,zookeeper安装配置可以看这篇博客:windows安装zookeeper教程.

dubbo的jar包结构

在这里插入图片描述
这里spring-context-support就是与spring做了相关整合
dubbo 功能集合:netty: ⽤于⽹络传输,javassist: ⽤于实现动态SPI机制, snakeyaml :⽤于解析yml 配置⽂件,json:json格式化。

代码示例

首先项目架构分为:

  • dubbo service:服务端,提供服务
  • dubbo client:消费者,调用dubbo服务
  • dubbo-api:服务和消费共同用到的jar包,服务接口和传输类以及异常都在这个jar包里面

dubbo service

dubbo service 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">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>boot-server</artifactId>
    <properties>
        <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>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>

        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.8</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>coderead</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

服务端的代码

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

@DubboService
public class UserService implements IUserService {
    @Override
    public UserDto getUser(Long id) {
        UserDto userDto = new UserDto();
        userDto.setAge(18);
        userDto.setId(id);
        userDto.setName("Bob");
        return userDto;
    }
}

application.properties

dubbo.application.name=boot-server
dubbo.protocol.name=dubbo
dubbo.protocol.port=-1
dubbo.registry.address=zookeeper://127.0.0.1:2181

dubbo client

服务差不多
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">
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>dubbo-client</artifactId>

    <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>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.4.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-dependencies-zookeeper</artifactId>
            <version>2.7.8</version>
            <exclusions>
                <exclusion>
                    <artifactId>slf4j-log4j12</artifactId>
                    <groupId>org.slf4j</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>log4j</artifactId>
                    <groupId>log4j</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>com.learn</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.8</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

代码

@EnableDubbo
@SpringBootApplication
public class DubboClientApplication {

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

@RestController
@RequestMapping(value = "/user")
public class UserController {
    @DubboReference
    private IUserService userService;

    @RequestMapping("/getUser")
    public UserDto getUserById(@RequestParam("userId") Long id){
        return userService.getUser(id);
    }
}

application.properties

dubbo.application.name=boot-server
dubbo.protocol.name=dubbo
dubbo.protocol.port=20881
dubbo.registry.address=zookeeper://127.0.0.1:2181
server.port=8082

调用结果
在这里插入图片描述

上面日志在启动时会报错
所以在pom文件中exclude log日志则zookeeper

配置体系

Dubbo配置的整体说明:

标签 用途 解释
<dubbo:application/> 公共 ⽤于配置当前应⽤信息,不管该应⽤是提供者还是消费者
<dubbo:registry/> 公共 ⽤于配置连接注册中⼼相关信息
<dubbo:protocol/> 服务 ⽤于配置提供服务的协议信息,协议由提供⽅指定,消费⽅被动接受
<dubbo:service/> 服务 ⽤于暴露⼀个服务,定义服务的元信息,⼀个服务可以⽤多个协议暴露,⼀个服务也可以注册到多个注册中⼼
<dubbo:provider/> 服务 当 ProtocolConfig 和 ServiceConfig 某属性没有配置时,采⽤此缺省值,可选
<dubbo:consumer/> 引⽤ 当 ReferenceConfig 某属性没有配置时,采⽤此缺省值,可选
<dubbo:reference/> 引⽤ ⽤于创建⼀个远程服务代理,⼀个引⽤可以指向多个注册中⼼
<dubbo:method/> 公共 ⽤于 ServiceConfig 和 ReferenceConfig 指定⽅法级的配置信息
<dubbo:argument/> 公共 ⽤于指定⽅法参数配置

配置分类 所有配置项分为三类。

  1. 服务发现:表示该配置项用于服务的注册与发现,目的是让消费方找到提供。
  2. 服务治理:表示该配置项用于治理服务间的关系,或为开发测试提供便利条件。
  3. 性能调优:表示该配置项用于调优性能,不同的选项对性能会产生影响。

配置之间关系
在这里插入图片描述
配置传递逻辑:
在服务中设置⼀个timeout属性,很容易让⼈误解成服务端响应超时限制,但实际该配置的作⽤是于设置消费者对该服务调⽤超时限制。就是说当超时真正发⽣的时候,只有消费才有异常,⽽服务⽅不会有反应?

@DubboService(timeout = 2000)

为会客户端的超时配置 要配置服务端呢?以及该配置参数怎么传递给客户端的呢? 原因是服务提供者 ⽐服务调⽤者更清楚 该服务的执⾏时间,所以对消费者⽽⾔这个配置有指 导意义。当然消费者本身也是可以通过设置 @DubboReference(timeout = 3000) 采⽤⾃定义的配置。参数的传递是通过服务在暴露时 放在URL上,并通过注册中⼼传递客户端。 类似这种配在服务端⽤在客户端的配置还有很多,如retries(重试次数)、async(是否异 步)、loadbalance(负载均衡)等等。
配置继承逻辑
如果需要暴露多个服务的时候,每个服务都要设置其超时时间,貌似有点繁琐。Dubbo中可 以通过 <dubbo:provider> 来实现服务端缺省配置。它可以同时为<dubbo:service> 和 <dubbo:protocol> 两个标签提供缺省配置。如:

#相当于每个服务提供者设置了超时时间 和重试次数
<dubbo:provider timeout=“2000” retries=“2”></dubbo:provider>

同样客户端也有缺省配置标签:<dubbo:consumer>,这些缺省设置可以配置多个 通 过 <dubbo:service provider=“providerId”> ,如果没指定就⽤第⼀个。

配置的优先级
在服务端配置timeout 之后 所有客户端都会采⽤该⽅超时时间,其客户端可以⾃定义超时时间吗?通过 <dubbo:reference timeout=“2000”> 可以设定或者在<dubbo:consumer timeout=“2000”> 也可以设定 甚⾄可以设定到⽅法级别 <dubbo:method name=“getUser” timeout=“2000”/>。加上服务端的配置,超时总共有6处可以配置。如果6处都配置了不同的 值,最后肯定只会有⼀个超时值⽣效,其优先级如下:
在这里插入图片描述
⼩提示:通过DefaultFuture的newFuture ⽅法就可观测到实际的超时设置。其中的timeout值 就是实际超时时间。

#创建结果回执,
org.apache.dubbo.remoting.exchange.support.DefaultFuture#newFuture(Channel channel, Request request, int timeout, ExecutorService executor)

总结

上面小编配置小编看得很头疼,dubbo的配置还是挺鸡肋的,希望大家自己调试了。谢谢!

参考

由于3.0文档还没生成小编使用2.7版本的dubbo的相关jar包以及参考2.7版本的官方文档
链接: Dubbo2.7官方文档

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/13579.html

(0)
小半的头像小半

相关推荐

半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!