Dubbo 快速入门

1、环境准备

  先确保linux系统jdk环境已经安装,把下载好的压缩包上传到linux

# 先确保jdk环境已经安装
cd /usr/local# 把压缩包上传到linux系统,解压
tar -zxvf zookeeper-3.4.6.tar.gz     
# 进入zookeeper-3.4.6目录
cd zookeeper-3.4.6    
# 进入conf目录
cd conf        
# 把zoo_sample.cfg 改名为zoo.cfg
mv zoo_sample.cfg zoo.cfg        
# 打开zoo.cfg文件, 修改dataDir属性
vi zoo.cfg    
# 设置zoo.cfg放置数据的目录
dataDir=/usr/local/zookeeper-3.4.6/data# 保存退出

# 进入bin目录下
cd /usr/local/zookeeper-3.4.6/bin# 启动服务命令
./zkServer.sh start        

2、创建Demo项目

示例项目分为三个,分别是:

  1. dubbo-api:提供统一的接口,最终会打为jar包,供consumer和provider引用

  2.dubbo-provider:服务提供者,包含api接口的实现类,提供服务的实现逻辑

  3.dubbo-consumer:该项目是一个web项目,有几个作用,首先该项目以http的形式提供前端和浏览器访问的接口,其次,该项目也是dubbo消费者,用来消费dubbo-provider项目提供的服务。

 2.1、首先开发dubbo-api:

  该项目只有一个文件,是一个接口,他定义了统一的接口让provider和consumer来引用,接口文件内容如下:

package cn.itcast.api;

public
interface UserApi { String sayHi(String name); User findById(Long id); } public class User implements Serializable { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

 

2.2、接着我们开发dubbo-provider,项目结构如下:

  

   该项目只有两个类,一个是服务实现类UserServiceImpl,代码如下:

/**
 * 使用dubbo提供的@Service注解
 * 1. 导入的包:org.apache.dubbo.config.annotation.Service
 * 2. 注意:不要导入spring的包 org.springframework.stereotype.Service
 */
//@Service(timeout = 3000,retries = 1)// 设置超时时间(默认1000),重试次数(默认2次)
//@Service(version = "2.0") // version指定服务版本,演示灰色发布,服务消费者可以设置指定要访问的版本
@Service(weight = 200) //如果有多个相同版本的服务提供者,消费者该如何调用?这就需要用到负载均衡
public class UserApiImpl implements UserApi {
    @Override
    public String sayHi(String name) {
        return "hi," + name;
    }

    @Override
    public User findById(Long id) {
       /* try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }*/
        User user = new User();
        user.setId(1l);
        user.setName("张三");
//        System.out.println("UserApiImpl服务版本2.0");
        return user;
    }
}

 另外一个是SpringBoot启动类:

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

还有一个yml配置文件:

# springboot项目对外暴漏的端口(web项目就是访问端口)
server:
  port: ${port:9001}   # 表示端口默认为9001;如果运行时期通过VM Option传入port参数,以传入为主。

dubbo:
  application:
    # 项目名称,用于计算服务的依赖关系。(区分不同项目的服务)
    name: dubbo-service-user
  # 指定zk注册中心地址
  registry:
    address: zookeeper://192.168.200.130:2181
  protocol:
    # 对外暴漏的服务使用的协议:dubbo协议, 官网推荐
    name: dubbo
    # 对外暴漏服务的端口
    port: ${dport:20881} # 表示端口默认为20881;dport是动态传入的参数名称,可以随意定义
  # dubbo包扫描,会扫描dubbo提供的@Service注解
  scan:
    base-packages: cn.itcast.api

以及pom文件导入的依赖:

 <!--指定SpringBoot继承的父项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>
    <dependencies>
        <!--依赖Api接口工程-->
        <dependency>
            <groupId>cn.itcast</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--web启动器,传递依赖了tomcat-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--dubbo的起步依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.5</version>
        </dependency>

        <!-- zookeeper的api管理依赖 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>

        <!-- zookeeper依赖 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>

    </dependencies>

 

2.3、最后来看dubbo-consumer这个web项目,相对来说也是三个项目中最为负责的一个

项目结构:

 

 

 OrderController类就是个控制器,使用requestMapping注解提供http接口服务,内容如下:

/**
 * 负载均衡策略(4种):
 *
 * random :按权重随机,默认值。按权重设置随机概率。
 * roundrobin :按权重轮询。
 * leastactive:最少活跃调用数,相同活跃数的随机。
 * consistenthash:一致性 Hash,相同参数的请求总是发到同一提供者。
 */

/**
 * 集群容错模式:
 *
 * Failover Cluster:失败重试。默认值。当出现失败,重试其它服务器 ,默认重试2次,使用 retries 配置。一般用于读操作
 * Failfast Cluster :快速失败,只发起一次调用,失败立即报错。通常用于写操作。(不重试)
 * Failsafe Cluster :失败安全,出现异常时,直接忽略。返回一个空结果。(一般用于不太重要的操作,比如消息通知)
 * Failback Cluster :失败自动恢复,后台记录失败请求,定时重发。(一般用于非常重要的操作)
 * Forking Cluster :并行调用多个服务器,只要一个成功即返回。
 * Broadcast  Cluster :广播调用所有提供者,逐个调用,任意一台报错则报错
 */
@RestController
@RequestMapping("order")
public class OrderController {

    /**
     * @Reference
     * 1、导入dubbo提供的注解:org.apache.dubbo.config.annotation.Reference
     * 2、用于对指定的接口生成代理对象,通过代理封装远程调用相关代码,实现远程调用
     */
//    @Reference(version = "2.0")//调用指定的服务版本

//    @Reference(loadbalance = "random")// 负载均衡策略:按权重随机,默认值。按权重设置随机概率
//    @Reference(loadbalance = "consistenthash")// 负载均衡策略:一致性 Hash,相同参数的请求总是发到同一提供者。

//    @Reference(cluster = "failover") //设置消费者集群容错模式:失败重试。默认值。默认重试2次,使用 retries 配置。
//    @Reference(cluster = "failfast")//快速失败. 注意:区分大小写
//    @Reference(cluster = "forking")//并行调用多个服务器
//    @Reference(cluster = "broadcast")
    @Reference
    private UserApi userApi;

    @GetMapping("hello")
    public String hello() {
        // 执行RPC远程调用, 获取dubbo服务返回结果. 在浏览器显示
        return userApi.sayHi("Tom");
    }

    /**
     * 根据用户id查询用户信息。
     * http://localhost:18080/order/user/1
     */
    @GetMapping("/user/{id}")
    public User findUserById(@PathVariable("id") Long id){
        User user = userApi.findById(id);
        return user;
    }

}

接下来看yml配置文件:

server:
  port: 18080
dubbo:
  # 项目名称,用于计算服务的依赖关系。(区分不同项目的服务)
  application:
    name: order-web-manager
  # 注册中心地址
  registry:
    address: zookeeper://192.168.200.130:2181

 

然后就是导入的依赖有哪些:

<dependencies>
        <!--依赖Api接口工程-->
        <dependency>
            <groupId>cn.itcast</groupId>
            <artifactId>dubbo-api</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--dubbo的起步依赖-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.5</version>
        </dependency>

        <!-- zookeeper的api管理依赖 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.2.0</version>
        </dependency>

        <!-- zookeeper依赖 -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
        </dependency>
    </dependencies>

 

3、启动项目

  需要先启动服务提供者,再启动服务消费者,访问消费者中的控制器的方法即可远程调用服务提供者

http://localhost:18080/order/hello

 

http://localhost:18080/order/user/1

 

posted @ 2021-10-23 21:06  danielzzz  阅读(578)  评论(0编辑  收藏  举报