springboot结合dubbo使用

dubbo结合spring需要在配置文件中配置,结合springboot时就可以使用application.yml配置文件或者application.properties。个人更喜欢结合springboot的使用。
不说那么多了,从代码中得到的才是最深沉的。
创建一个maven项目

创建一个springboot提供者的module

step0:创建好后pom.xml中引入jar包依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!--web项目-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--dubbo ali apache-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.7.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.itzz</groupId>
            <artifactId>dubbo02-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

step1把application.properties文件的后缀改为.yml后缀,配置文件中的配置

dubbo:
  application:
    name: dubbo02-provider
  registry:
    address: zookeeper://localhost:2181
  protocol:
    port: 20880
    name: dubbo
  scan:
    base-packages: com.itzz.provider.service.Impl
#自定义当前应用版本号
application:
  version: 1.0.0
#修改web项目启动默认的端口号
server:
  port: 8081

创建相关的包结构,然后再service的Impl包中创建相关的功能

import com.itzz.provider.service.UserService;
import org.apache.dubbo.config.annotation.Service;

@Service(version = "${application.version}")
public class UserServiceImpl implements UserService {
    @Override
    public String getName(int id) {
        System.out.println("------1------");
        if (id == 1){
            return "张三";
        }else if (id == 2){
            return "李四";
        }
        return "傻蛋";
    }
}

@Service(version = “${application.version}”)中引用配置文件中的版本号,假如以后版本升级了,总不能一个一个的更改吧,所以加入相关的注解。我的包结构如下所示:

Springboot整合seattle springboot整合dubbo_Springboot整合seattle

创建一个api的module(maven结构的module)

在api的module中创建跟提供者的module一样的包结构

public interface UserService {
    public String getName(int id);
}

包结构

Springboot整合seattle springboot整合dubbo_spring_02

创建一个消费者的spring boot的module

step0:pom.xml的jar包

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.7.0</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.itzz</groupId>
            <artifactId>dubbo02-api</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

一定要引入api的依赖,不然会报错,说找不到UserService接口
step1:springboot自动生成的配置文件后缀还是改成.yml后缀。跟之前结合spring的时候用的配置信息一样。

dubbo:
  application:
    name: dubbo02-consumer
  registry:
    address: zookeeper://localhost:2181
  scan:
    base-packages: com.itzz.provider.service.Impl
  #自定义当前应用版本号
application:
  version: 1.0.0
  #修改web项目启动默认的端口号
server:
  port: 8082

step2:创建web层,web直接调用接口中定义的方法。

import com.itzz.provider.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Reference(version = "${application.version}")
    private UserService userService;
    @RequestMapping("getName")
    public String getName(Integer id){
        return userService.getName(id);
    }
}

包结构如下:

Springboot整合seattle springboot整合dubbo_dubbo_03


到这里项目就敲完了,先启动提供者的主类,然后再启动消费者的主类剩下的就是在管理中心里进行测试了。

在控制中心测试

在网页中输入http://localhost:7001/进入到管理中心(当然前提是你的管理中心启了着的)。再加一个提供者跟上面的功能一样,做一个提供者集群。

然后看两个是否都已经注册到了监控中心中了

通过消费者的端口在网页的url中访问,如下所示:

Springboot整合seattle springboot整合dubbo_dubbo_04

权重

权重:我在第二个提供的实现类上配置了权重为300,所以访问的几率就会比第一个提供者的次数多。

Springboot整合seattle springboot整合dubbo_Springboot整合seattle_05


禁用就是禁止使用,不再用这个提供者了。

Springboot整合seattle springboot整合dubbo_spring boot_06


服务中心中显示的

Springboot整合seattle springboot整合dubbo_spring_07


Springboot整合seattle springboot整合dubbo_apache_08


Springboot整合seattle springboot整合dubbo_apache_09


Springboot整合seattle springboot整合dubbo_spring boot_10

负载均衡策略

dubbo的负载均衡策略是随机访问的。因为dubbo默认的负载均衡策略就是随机的,除了随机还有轮询(两个提供者挨着来)、并发最小(好比排队哪里人少去哪里)。

随机策略

权重都一样时才会随机

Springboot整合seattle springboot整合dubbo_spring_11


Springboot整合seattle springboot整合dubbo_spring_12


Springboot整合seattle springboot整合dubbo_apache_13

轮询策略

Springboot整合seattle springboot整合dubbo_Springboot整合seattle_14

访问提供者的次数是一样多的。

Springboot整合seattle springboot整合dubbo_spring_15


Springboot整合seattle springboot整合dubbo_spring_16