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

Spring Boot Dubbo 构建分布式服务的方法

程序员文章站 2024-02-22 11:00:40
概述:   节点角色说明 节点 角色说明 pro...

概述:

 Spring Boot Dubbo 构建分布式服务的方法

节点角色说明

节点 角色说明
provider 暴露服务的服务提供方
consumer 调用远程服务的服务消费方
registry 服务注册与发现的注册中心
monitor 统计服务的调用次数和调用时间的监控中心
container 服务运行的容器

调用关系说明

  • 服务容器 container 负责启动,加载,运行服务提供者。
  • 服务提供者 provider 启动的时候,向注册中心 registry 注册自己提供的服务。
  • 服务消费者 consumer 在启动的时候,向注册中心 registry 订阅自己所需要的服务。注册中心 registry 返回服务提供者的地址列表给消费者,如果有变更注册中心将基于长连接推送变更数据给消费者。
  • 服务消费者从提供者地址列表中,基于软负载均衡算法,选择一台提供者进行进行调用,如果调用失败再选择另外一台。
  • 服务消费者与提供者在内存中统计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心 monitor 。

 项目构建

开发环境主要涉及以下方面:

  • spring boot
  • jdk 8
  • dubbo 2.7.1
  • zookeeper

具体代码可以查看 github 的 dubbo 模块: https://github.com/uniquedong/springboot-study

dubbo api

定义服务接口,打成 jar 包让消费者依赖,服务者实现接口。该工程只有接口定义以及 model 对象。@data 属于lombok 开源库提供的特性,方便开发。

model 对象定义:

@data
public class user implements serializable {
  private long id;
  private string username;
}

provider 接口定义:

public interface userprovider {
  list<user> listuser();
}

provider 服务提供者

pom依赖:

引入spring-boot-starter,dubbo-api 接口就是我们上面提到的 接口定义 jar ,dubbo-spring-boot-starter ,dubbo-dependencies-zookeeper。

<dependencies>
    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter</artifactid>
      <exclusions>
        <exclusion>
          <artifactid>spring-boot-starter-logging</artifactid>
          <groupid>org.springframework.boot</groupid>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupid>zero.springboot.study</groupid>
      <artifactid>dubbo-api</artifactid>
      <version>1.0.0-snapshot</version>
    </dependency>
    <!--dubbo start-->
    <dependency>
      <groupid>org.apache.dubbo</groupid>
      <artifactid>dubbo-spring-boot-starter</artifactid>
      <version>2.7.1</version>
    </dependency>

    <dependency>
      <groupid>org.apache.dubbo</groupid>
      <artifactid>dubbo</artifactid>
      <version>2.7.1</version>
    </dependency>

    <!-- zookeeper dependencies -->
    <dependency>
      <groupid>org.apache.dubbo</groupid>
      <artifactid>dubbo-dependencies-zookeeper</artifactid>
      <version>2.7.1</version>
      <type>pom</type>
      <exclusions>
        <exclusion>
          <artifactid>log4j</artifactid>
          <groupid>log4j</groupid>
        </exclusion>
        <exclusion>
          <artifactid>slf4j-log4j12</artifactid>
          <groupid>org.slf4j</groupid>
        </exclusion>
      </exclusions>
    </dependency>

    <!--dubbo end-->
    
    <dependency>
      <groupid>com.alibaba</groupid>
      <artifactid>fastjson</artifactid>
      <version>1.2.57</version>
    </dependency>
  </dependencies>

配置文件 yaml 定义:

spring:
 application:
  name: dubbo-provider
#自定义配置
embedded:
 zookeeper:
  # zookeeper 服务连接端口
  port: 2181

# dubbo 配置
dubbo:
 # 注册中心配置 
 registry:
  id: dubbo-provider
  address: zookeeper://127.0.0.1:${embedded.zookeeper.port}
  group: local
 application:
  name: dubbo-provider
  id: dubbo-provider
  logger: slf4j
  qosenable: true
  qosport: 22224
  qosacceptforeignip: false
 # dubbo 协议配置
 protocol:
  # -1 表示使用随机未被占用的端口
  port: -1
  name: dubbo
 scan:
  # dubbo 服务提供者实现类所在包
  base-packages: com.zero.provider.impl

实现 api 定义的接口

注意 @service 是 dubbo 的,不要导入了 spring 的。

import com.google.common.collect.lists;
import com.zero.api.model.user;
import com.zero.api.provider.userprovider;
import org.apache.dubbo.config.annotation.service;

import java.util.list;

@service(interfaceclass = userprovider.class)
public class userproviderimpl implements userprovider {
  @override
  public list<user> listuser() {
    user user = new user();
    user.setid(1l);
    user.setusername("青龙");
    return lists.newarraylist(user);
  }
}

consumer

pom 定义:

我们要依赖 spring-boot-starter-web 提供http rest接口给前端调用。同时内部通过 dubbo 实现 rpc调用服务提供者。

<dependencies>
    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-web</artifactid>
      <exclusions>
        <exclusion>
          <groupid>org.springframework.boot</groupid>
          <artifactid>spring-boot-starter-logging</artifactid>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupid>zero.springboot.study</groupid>
      <artifactid>dubbo-api</artifactid>
      <version>1.0.0-snapshot</version>
    </dependency>
    <!--dubbo start-->
    <dependency>
      <groupid>org.apache.dubbo</groupid>
      <artifactid>dubbo-spring-boot-starter</artifactid>
      <version>2.7.1</version>
    </dependency>

    <dependency>
      <groupid>org.apache.dubbo</groupid>
      <artifactid>dubbo</artifactid>
      <version>2.7.1</version>
    </dependency>

    <!-- zookeeper dependencies -->
    <dependency>
      <groupid>org.apache.dubbo</groupid>
      <artifactid>dubbo-dependencies-zookeeper</artifactid>
      <version>2.7.1</version>
      <type>pom</type>
      <exclusions>
        <exclusion>
          <artifactid>log4j</artifactid>
          <groupid>log4j</groupid>
        </exclusion>
        <exclusion>
          <artifactid>slf4j-log4j12</artifactid>
          <groupid>org.slf4j</groupid>
        </exclusion>
      </exclusions>
    </dependency>

    <!--dubbo end-->

    <dependency>
      <groupid>org.projectlombok</groupid>
      <artifactid>lombok</artifactid>
      <optional>true</optional>
    </dependency>

  </dependencies>

yaml 定义:

server:
 # web 日更年期端口
 port: 9005
spring:
 application:
  name: dubbo-comsumer
#自定义配置
embedded:
 zookeeper:
  port: 2181
# dubbo 配置
dubbo:
 registry:
  id: dubbo-comsumer
  address: zookeeper://127.0.0.1:${embedded.zookeeper.port}
  group: local
 application:
  name: dubbo-comsumer
  id: dubbo-comsumer
  logger: slf4j
  qosenable: false
  qosport: 22223
  qosacceptforeignip: false
 protocol:
  port: -1
  name: dubbo
 # 是否检查服务提供者有效 
 consumer:
  check: false

服务消费者调用服务生产者

import com.zero.api.model.user;
import com.zero.api.provider.userprovider;
import org.apache.dubbo.config.annotation.reference;
import org.springframework.stereotype.service;

import java.util.list;

@service
public class userservice {

  @reference
  private userprovider userprovider;

  public list<user> listuser() {
    return userprovider.listuser();
  }
}

我们通过一个restfull接口,提供给前端调用。

@restcontroller
@requestmapping("/users")
public class usercontroller {
  @autowired
  private userservice userservice;

  @getmapping
  public object listuser() {
    list<user> list = userservice.listuser();
    return list;
  }
}

总结

各种具体协议、注册中心、多注册中心、超时等配置可以查看官方文档

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。