欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Dubbo整合SpringBoor的简单使用

程序员文章站 2022-06-13 19:06:26
...

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

Dubbo整合SpringBoor的简单使用

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

Dubbo整合SpringBoor的简单使用

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

Dubbo整合SpringBoor的简单使用

二、构建dubbo-admin面板

  • 去GitHub下载/克隆dubbox项目

下载地址

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

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

Dubbo整合SpringBoor的简单使用

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

    Dubbo整合SpringBoor的简单使用

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

Dubbo整合SpringBoor的简单使用

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

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

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

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

访问地址

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

Dubbo整合SpringBoor的简单使用

  • dubbo-admin安装成功 !

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

环境准备

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

dubbo项目讲究分层架构

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

Dubbo整合SpringBoor的简单使用

  • 使用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);
    }

}
  • 启动

Dubbo整合SpringBoor的简单使用

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

Dubbo整合SpringBoor的简单使用

创建 服务消费者

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
  • 启动 并测试访问

测试地址

Dubbo整合SpringBoor的简单使用

  • 此时的 dubbo-admin控制面板

Dubbo整合SpringBoor的简单使用

已完成 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

Dubbo整合SpringBoor的简单使用

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

Dubbo整合SpringBoor的简单使用

  • 测试访问

Dubbo整合SpringBoor的简单使用

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

完!