Dubbo整合SpringBoor的简单使用

Dubbo使用

  • 上一章已经初步了解了Dubbo 下面开始进行Dubbo的使用

一、搭建zookeeper 环境

  • zookeeper下载地址: http://archive.apache.org/dist/zookeeper/
  • 本次采用 zookeeper-3.3.6 版本
  1. 下载完成之后进入conf目录
  2. 先把 zoo-sample.cfg拷贝一份 以防万一
  3. 修改 zoo-sample.cfg 为 zoo.cfg

img

  1. 进入到bin目录右键使用管理员身份运zkServer.cmd 启动zookeeper服务端

img

  1. 也可以使用 zkCli.cmd 进行连接测试 右键管理员身份运行

img

二、构建dubbo-admin面板

  • 去GitHub下载/克隆dubbox项目

下载地址

  • 下载完的目录结构
  • 这就是个 maven项目

不会使用Maven的话 请参考 Maven的简单使用

img

  • 使用 maven命令进行打包项目

    img

mvn clean package -Dmaven.test.skip=true  #使用maven命令清理并打包 跳过测试
  • 漫长的等待~

img

  • 出现 BUILD SUCCESS 即为打包成功!

  • 进入 dubbo-admin/target 目录 找到 dubbo-admin-2.8.4.war

  • 把改war包复制至tomcat的webapps目录下

    • 建议使用 tomcat8
  • 一定要先开启zookeeper才可以开启dubbo-admin哦!

访问地址

  • 输入 账号:root 密码 root 即可进入 dubbo-admin面板

img

  • dubbo-admin安装成功 !

三、 使用SpringBoot 构建简单的Dubbo项目

环境准备

  • IDEA
  • Zookeeper3.3.6
  • dubbo-admin管理面板
  • maven环境

dubbo项目讲究分层架构

所以我们找个合适的位置创建一个空文件夹

img

  • 使用IDEA打开该文件夹

创建统一的api接口

hello-dubbo-api

IDEA中右键 => new => Module => Maven项目 => 什么都不选 => 填写你想要的项目信息 => 一直下一步

  • 创建接口
package service;
/**
 *
 * <p>
 * Description:  统一对外提供服务的接口
 * </p>
 *
 * @author yufire
 * @version v1.0.0
 * @since 2020-06-11 18:36:20
 * @see service
 *
 */
public interface HelloDubboApi {
    
    

    /**
     * 测试方法
     * @param name
     * @return
     */
    String sayHi(String name);

}
  • 把创建完成的接口安装到本地maven仓库 私服也可以
  • 命令
mvn clean install
  • 完成

创建提供服务的 provider

hello-dubbo-provider

  • 右键=> new => Module => SpringInitializr => 下一步

  • 添加 provider所需的 maven依赖

<!--添加统一接口的依赖-->
<dependency>
    <groupId>cn.yufire</groupId>
    <artifactId>hello-dubbo-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>
<!--添加 dubbo与Spring Boot整合的依赖-->
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>

<!--因为 provider项目不需要对外提供 web服务 所以普通的 starter即可-->
<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>
    <exclusions>
        <exclusion>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
        </exclusion>
    </exclusions>
</dependency>
  • 创建实现 api模块接口的实现类
package cn.yufire.hellodubboprovider.api.impl;

import com.alibaba.dubbo.config.annotation.Service;
import service.HelloDubboApi;
// 注意导包  是 com.alibaba.duboo 包下的 @Service注解
@Service(interfaceClass = HelloDubboApi.class)
public class HelloDubboApiImpl implements HelloDubboApi {
    
    
    @Override
    public String sayHi(String name) {
    
    
        return "Hello Dubbo " + name;
    }
}

  • 修改配置文件 application.yml
# 配置连接注册中心的信息
dubbo:
  application:
    name: hello-dubbo-provider # 服务名称
  registry:
    address: zookeeper://zool.yufure.cn:2181 # 注册中心地址
  protocol: # 协议
    name: dubbo # 协议名称
    port: 20888 # 服务的端口号
  • 修改启动类
package cn.yufire.hellodubboprovider;

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 HelloDubboProviderApplication {
    
    

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

}
  • 启动

img

  • 启动成功之后 查看dubbo-admin控制面板 会发现出现了个提供者

img

创建 服务消费者

hello-dubbo-consumer

  • 右键=> new => Module => SpringInitializr => 下一步

  • 添加 consumer 所需的 maven依赖

 <!--添加统一接口的依赖-->
<dependency>
    <groupId>cn.yufire</groupId>
    <artifactId>hello-dubbo-api</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

<!--添加 dubbo与Spring Boot整合的依赖-->
<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>

<!--consumer项目是需要对外提供web服务的所以需要使用 web的starter-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</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>
  • 创建 Controller
package cn.yufire.hello.dubbo.consumer.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import service.HelloDubboApi;

@RestController
public class HelloDubboController {
    
    

    // 使用 dubbo提供的 @Reference 远程调用 注册中心的 HelloDubboApi类
    @Reference
    private HelloDubboApi helloDubboApi;

    @GetMapping("/hello")
    public String helloDubbo(String name) {
    
    
        return helloDubboApi.sayHi(name);
    }

}
  • 修改启动类
package cn.yufire.hello.dubbo.consumer;

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 HelloDubboConsumerApplication {
    
    

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

}
  • 修改配置文件
server:
  port: 8090 # consumer项目需要对外 提供web服务 避免与本地tomcat冲突 所以 改下端口号

dubbo:
  application:
    name: hello-dubbo-consumer
  registry:
    address: zookeeper://zool.yufuie.cn:2181
  protocol:
    name: dubbo
  consumer:
    timeout: 2000
  • 启动 并测试访问

测试地址

img

  • 此时的 dubbo-admin控制面板

img

已完成 dubbo的基本操作!

四、Dubbo的负载均衡

  • 在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。

官网的负载均衡策略

Random LoadBalance

  • 随机,按权重设置随机概率。
  • 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

RoundRobin LoadBalance

  • 轮询,按公约后的权重设置轮询比率。
  • 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

LeastActive LoadBalance

  • 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
  • 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

ConsistentHash LoadBalance

  • 一致性 Hash,相同参数的请求总是发到同一提供者。
  • 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
  • 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing
  • 缺省只对第一个参数 Hash,如果要修改,请配置 ``
  • 缺省用 160 份虚拟节点,如果要修改,请配置 ``

配置负载均衡

  • 打开 provider项目的 配置文件 添加负载均衡配置
# 配置连接注册中心的信息
dubbo:
  application:
    name: hello-dubbo-provider # 服务名称
  registry:
    address: zookeeper://zool.yufire.cn:2181 # 注册中心地址
  protocol: # 协议
    name: dubbo # 协议名称
    port: 12345  # 服务的端口号
  provider: 
    loadbalance: roundrobin # 配置负载均衡  策略为: 轮询
  • 修改 HelloDubboApiImpl 类
package cn.yufire.hellodubboprovider.api.impl;

import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Value;
import service.HelloDubboApi;
// 注意导包  是 com.alibaba.duboo 包下的 @Service注解
@Service(interfaceClass = HelloDubboApi.class)
public class HelloDubboApiImpl implements HelloDubboApi {
    
    
    
    @Value("${dubbo.protocol.port}")
    private String port;
    
    @Override
    public String sayHi(String name) {
    
    
        return "Hello Dubbo " + name + " 我来自:" + port;
    }
}
  • 修改IDEA的配置

idea上方选项卡 => RUN => Edit Configurations

img

  • 重新启动项目
  • 启动一个之后 修改配置文件的端口号 再次启动

img

  • 测试访问

img

  • 这时会发现 随着每次访问 对应的端口号都会跟着改变 这就是 dubbo的轮询机制

完!

猜你喜欢

转载自blog.csdn.net/weixin_43420255/article/details/106695665