1.最近学习dubbo 参照网上资料首次集成springboot和dubbo 特记录本次操作

废话不多说 直接开干

1.安装zookeeper

1.安装zookee 直接参照网上弄了个单机版的zookeeper

官网下载后 直接解压到相关目录

在目录下新建data和logs文件夹

在zookeeper-3.4.13\conf conf目录下 打开zoo_sample.cfg 修改以下内容 另存为zoo.cfg

dataDir=E:/zk/zookeeper-3.4.13/data
dataLogDir=E:/zk/zookeeper-3.4.13/logs
之后就可以启动zookeeper的服务了 

到bin目录下直接输入cmd 运行 zkServer.cmd启动服务

2.dubbo

https://gitee.com/chenghao842822530/springbootdemo/attach_files
dubbo在打war包之前修改其配置如下:
WEB-INF目录下的dubbo.properties文件
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
然后启动tomcat就启动了dubbo的服务,我们可以访问控制台看看

这个是网上我直接copy过来的 直接下载war包 copy到tomcat的webapp目录下 运行

http://localhost:8089/dubbo-admin-2.5.4    我把tomcat的端口设置成了8089 注意自己的默认的是8080

输入密码root

dubbo spring boot 版本 spring boot dubbo zookeeper_zookeeper

dubbo spring boot 版本 spring boot dubbo zookeeper_zookeeper_02

 

这是dubbo 可以查看到 我们的服务 生产者和消费者 我已经运行了 所以有个数据

dubbo spring boot 版本 spring boot dubbo zookeeper_spring_03

dubbo spring boot 版本 spring boot dubbo zookeeper_spring_04

 

 3.编写java生产者 和 消费者

3.1 生产者

新建springboot项目 可以到 https://start.spring.io/ 快速新建一个springboot项目

先看目录结构

dubbo spring boot 版本 spring boot dubbo zookeeper_zookeeper_05

 

配置项写在了properties里 也可以是xml里

## Dubbo \u670D\u52A1\u63D0\u4F9B\u8005\u914D\u7F6E
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.dubbo.dubbodemo.service

 

 pom的依赖 增加以下依赖

<dependency>
     <groupId>log4j</groupId>
     <artifactId>log4j</artifactId>
     <version>1.2.16</version>
     <scope>compile</scope>
   </dependency>
<dependency>
          <groupId>io.dubbo.springboot</groupId>
          <artifactId>spring-boot-starter-dubbo</artifactId>
          <version>1.0.0</version>
      </dependency>
      <dependency>
          <groupId>org.apache.zookeeper</groupId>
          <artifactId>zookeeper</artifactId>
          <version>3.4.6</version>
          <exclusions>
              <exclusion>
                  <groupId>org.slf4j</groupId>
                  <artifactId>slf4j-log4j12</artifactId>
              </exclusion>
              <exclusion>
                  <groupId>log4j</groupId>
                  <artifactId>log4j</artifactId>
              </exclusion>
          </exclusions>
</dependency>

下面我们创建一个简单的服务(其实就是写个接口 实现接口 给消费者调用)
首先创建个实体类User
com.dubbo.dubbodemo.domain.User;
package com.dubbo.dubbodemo.domain;

import java.io.Serializable;

public class User  implements Serializable {
    private static final long serialVersionUID = 1L;
    String name;
    String age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
}

创建接口

com.dubbo.dubbodemo.service.UserService
package com.dubbo.dubbodemo.service;

import com.dubbo.dubbodemo.domain.User;

public interface UserService {
    
    User saveUser(User user);

}

实现接口UserService 注意这里的@Service 是dubbo的service

com.dubbo.dubbodemo.service.impl;
package com.dubbo.dubbodemo.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.dubbo.dubbodemo.service.UserService;
import com.dubbo.dubbodemo.domain.User;

@Service
public class UserServiceImpl implements UserService {

    @Override
    public User saveUser(User user) {
//        user.setAge("1");
//        user.setName("hanhao");
        // TODO Auto-generated method stub
        System.out.println(user.toString());
        System.out.println(user.toString());
        return user;
    }
}
到这里生产者我们就完成了

3.2消费者 创建一个新的springboot项目

dubbo spring boot 版本 spring boot dubbo zookeeper_spring_06

新建User 
com.dubbo.dubbodemo.domain.User
package com.dubbo.dubbodemo.domain;

import java.io.Serializable;

public class User implements Serializable{
    
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    String name;
    String age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    
    

}

新建Service com.dubbo.dubbodemo.service.UserService

package com.dubbo.dubbodemo.service;

import com.dubbo.dubbodemo.domain.User;


public interface UserService {
    User saveUser(User user);
}

新建调用Service的方法 注意

@Reference

com.dubbo.dubbodemo.service.ComsumerService

package com.dubbo.dubbodemo.service;

import org.springframework.stereotype.Component;

import com.alibaba.dubbo.config.annotation.Reference;
import com.dubbo.dubbodemo.domain.User;

@Component
public class ConsumerService {
    
    @Reference
    UserService userService;

    public User saveUser()
    {
        User user = new User();
        user.setAge("10");
        user.setName("hanwenhao");
        return userService.saveUser(user);
    }
}
新建一个controller调用 UserController
package com.dubbo.dubbodemo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.dubbo.dubbodemo.service.ConsumerService;

@RestController
public class UserController{
    
    /**
     * 
     */
    
    @Autowired
    private ConsumerService service;
    
    @RequestMapping("/save")
    public Object saveUser()
    {
        System.out.println("customer");
        return service.saveUser();
    }

}

消费者完成

忘记说消费者的pom 加下面依赖

<!-- Spring Boot Dubbo 依赖 -->
        <dependency>
            <groupId>io.dubbo.springboot</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
            <version>1.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.6</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>log4j</groupId>
                    <artifactId>log4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

properties配置

## \u907F\u514D\u548C server \u5DE5\u7A0B\u7AEF\u53E3\u51B2\u7A81
##因为我是一台机器运行 设置8081防止端口占用
server.port=8081 

## Dubbo \u670D\u52A1\u6D88\u8D39\u8005\u914D\u7F6E
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=com.dubbo.dubbodemo.service

 

运行后

查看dubbo里面有没有什么神奇的东西出现 而后调用controller 实现调用

dubbo spring boot 版本 spring boot dubbo zookeeper_zookeeper_07

 调用Cotrolller结果

dubbo spring boot 版本 spring boot dubbo zookeeper_spring_08

 

感想

自己根据网上搞的第一个springboot dubbo zookeeper示例 代码写的不太规范

这个dubbo zookeeper集成说是分布式 感觉和接口调用有点类似。网上查了下

http好比普通话,rpc好比团伙内部黑话。

讲普通话,好处就是谁都听得懂,谁都会讲。

讲黑话,好处是可以更精简、更加保密、更加可定制,坏处就是要求“说”黑话的那一方(client端)也要懂,而且一旦大家都说一种黑话了,换黑话就困难了。

 

所谓的效率优势是针对http1.1协议来讲的,http2.0协议已经优化编码效率问题,像grpc这种rpc库使用的就是http2.0协议。这么来说吧http容器的性能测试单位通常是kqps,自定义tpc协议则通常是以10kqps到100kqps为基准

简单来说成熟的rpc库相对http容器,跟多的是封装了“服务发现”,"错误重试"一类面向服务的高级特性。可以这么理解,rpc框架是面向服务的更高级的封装。如果把一个http server容器上封装一层服务发现和函数代理调用,那它就已经可以做一个rpc框架了。

所以为什么要用rpc调用?

因为良好的rpc调用是面向服务的封装,针对服务的可用性和效率等都做了优化。单纯使用http调用则缺少了这些特性。