Dubbo学习笔记

1 dubbo的 作用
以下内容摘自dubbo官网:
  dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现;

2 查看官网大坑


  (二)dubbo管理控制台的搭建

git clone https://github.com/apache/incubator-dubbo-ops


cd incubator-dubbo-ops && mvn package

用法,分为三个 admin, register/ monitor
dubbo admin

Dubbo admin is a spring boot application, you can start it with fat jar or in IDE directly.

进入 dubbo-admin,执行 mvn install
-----------------------------
maven 下载打包时需要配置 仓库MAVEN_HOME,Path=xxxxxj,这样的话就会用配置的阿里云镜像,下载会很快
碰到了不能编译,需要配置java环境变量
编译后启动报错了,因为没改zookeeper的配置ip,重新安装打包,运行target下的 java -jar dubbo-xxxxxx.jar,账号参考配置里的 root/root 或者 guest/xxxx,端口查看配置 时 7001


dubbo monitor and dubbo registry
You can get a release of dubbo monitor in two steps:


Step 1:
git clone https://github.com/apache/incubator-dubbo-ops
Step 2:
cd incubator-dubbo-ops && mvn package
Then you will find:

dubbo-monitor-simple-2.0.0-assembly.tar.gz in incubator-dubbo-opsdubbo-monitor-simple arget directory. Unzip it you will find the shell scripts for starting or stopping monitor.
dubbo-registry-simple-2.0.0-assembly.tar.gz in incubator-dubbo-opsdubbo-registry-simple arget directory. Unzip it you will find the shell scripts for starting or stopping registry.

 

2 然后时健康检测项目,打包,改zookeeperip,解压生成的 target下的 xxx.gz,进入 assembly.bin,运行start.bat即可

F:programmedubbo-admin-masterdubbo-monitor-simple argetdubbo-monitor-simple-2.0.0assembly.bin

 

bat启动文件 

f:
cd F:programmedubbo-admin-masterdubbo-admin arget
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

f:
cd F:programmedubbo-admin-masterdubbo-monitor-simple argetdubbo-monitor-simple-2.0.0assembly.bin
start.bat

4 自动生成 serializable 方法的配置再idea中

4 真实的 测试dubbo的例子

/**
 * 订单服务相关接口
 */
public interface OrderService {
    
    /**
     * 初始化订单
     * @param userId
     */
    List<User> initOrder(String userId);

}


public interface UserService {

    /**
     * 获取用户信息
     * @param userId
     * @return
     */
    List<User> getUserList(String userId);
    List<User> getUserAddressList(String userId);
}


user-service-provider
     <dependency>
            <groupId>com.darling.dubboDemo</groupId>
            <artifactId>pub-interfence</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

            <!-- 引入dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
        <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>



package com.provider.userserviceprovider.service;

import com.pubinter.pubinterface.dao.UserService;
import com.pubinter.pubinterface.pojo.User;

import java.util.ArrayList;
import java.util.List;

public class UserServiceImpl implements UserService {


    public List<User> getUserAddressList(String userId) {
        List<User> list = new ArrayList();
        list.add(new User(3,"韦德",36,"迈阿密"));
        list.add(new User(23,"詹姆斯",34,"洛杉矶"));
        list.add(new User(24,"科比",39,"洛杉矶"));
        return list;
    }

    @Override
    public List<User> getUserList(String userId) {
        return null;
    }
}


<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 当前服务的名称 -->
    <dubbo:application name="user-service-provider"/>

    <!-- 注册中心的地址 这里注册中心用的是zookeeper -->
    <dubbo:registry protocol="zookeeper" address="148.70.4.44:2181"/>

    <!-- 指定通信规则(通信协议?通信端口) -->
    <dubbo:protocol name="dubbo" port="20883"></dubbo:protocol>

    <!-- 需要暴露的服务 -->
    <dubbo:service interface="com.pubinter.pubinterface.dao.UserService" ref="userService" version="1.0.0"/>

    <!-- 需要暴露的服务的实现类 -->
    <bean id="userService" class="com.provider.userserviceprovider.service.UserServiceImpl"/>

    <!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>

    <!--
        timeout:超时时间配置
        retries:重试次数配置(超时报错后重试连接的次数,不含第一次调用,如果目标服务有多个重试的时候会自动切换别的服务)
     -->
    <dubbo:provider timeout="2000" retries="6"></dubbo:provider>
</beans>


public class TestProviderDemo {

    public static void main(String[] args) throws IOException {
        // 加载配置文件
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("provider.xml");
        // 容器启动
        applicationContext.start();
        // 使程序阻塞(由于是单元测试,如果程序跑完了我们再dubbo控制台看不到效果)
        System.in.read();
    }
}


不启用spring boot 主类,因为没必要,只启动了这个一个配置文件
order-service-consumer

      <!-- 引入公共接口层的依赖 -->
        <dependency>
            <groupId>com.darling.dubboDemo</groupId>
            <artifactId>pub-interfence</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- 引入dubbo -->
        <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
        <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>


    /**
 *   @author 董琳琳
 *   @date 2018/9/14 11:50
 *   @description   订单服务的实现类
 */
@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    UserService userService;

    /**
     * 初始化订单并调用用户服务的接口
     * @param userId
     * @return
     */
    @Override
    public List<User> initOrder(String userId) {
        return userService.getUserAddressList(userId);
    }
}


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
        http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    <!-- 开启springmvc的包扫描 -->
    <context:component-scan base-package="com.order.orderserviceconsumer"></context:component-scan>
    <!-- 当前服务的名称 -->
    <dubbo:application name="order-service-consumer"/>

    <!-- 注册中心的地址 这里注册中心用的是zookeeper -->
    <dubbo:registry protocol="zookeeper" address="148.70.4.44:2181"/>

    <!-- 声明需要调用的远程服务的接口;生成远程服务代理 -->
    <dubbo:reference id="userService" check="false" interface="com.pubinter.pubinterface.dao.UserService" version="*"/>

    <!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
</beans>

user必须实现serializable接口


必须要加扫描路径,不然会出错,找不到类
    <context:component-scan base-package="com.darling.order"></context:component-scan>

/**
 *   @author 董琳琳
 *   @date 2018/9/14 15:57
 *   @description 测试服务调用者是否成功从注册中心订阅服务
 */
public class TestConsumerDemo {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
        OrderService service = applicationContext.getBean(OrderService.class);
        List<User> list = service.initOrder("1");
        for (User user:list) {
            System.out.println(user.toString());
        }
        System.in.read();
    }
}


import java.io.Serializable;

public class User implements Serializable {
    private static final long serialVersionUID = -2844400681715908324L;
    private int age;
    private String name;
    private String address;
    private int number;
    User(){};
    public User(int age,String name,int number,String address){
        this.address=address;
        this.age=age;
        this.number=number;
        this.name=name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }
}

  大概流程是,public 接口,有两个,一个user 类,需要实现serializable接口和 set get方法,第二个项目provider引入公共的刚才的想pub,进行生产者配置,第三个消费者配置,兜售ideal 项目的module方式,

最终的效果是

5 dubbo 2.5版本 telnet命令

 

默认是 22222,可用通过 dubbo.properties修改为
dubbo.application.qos.port=33333
或启动时修改
-Ddubbo.application.qos.port=33333
安全方面 ,谁都可以访问,可以关闭,这样远程的就不可访问
dubbo.application.qos.accept.foreign.ip=false

举例
telnet localhost 22222
接口方式访问

curl "localhost:22222/ls?arg1=xxx&arg2=xxxx"

常用命令:
ls 可查看producer和consumer两个角色信息
online 上线所有的服务,可以正则
online xxx.com 上线某种服务
需要下线后重新上线时采用的场景

下线命令
offline 和 online 用法一样
help 查看帮助,这个很简单 telnet 功能,默认系统配置

-Ddubbo.application.qos.enable=true
-Ddubbo.application.qos.port=33333
-Ddubbo.application.qos.accept.foreign.ip=false

1 docker 使用Dockerfile 构建镜像
例子 只两行
FROM nginx
RUN echo 'abc' > /usr/nginx/index.html

from指定从nginx作为基础版本
run 是执行 linux命令


内容两行

执行一条命令 构建
docker build -他nginx:my .

在当前路径构建,点是当前路径,后面的是名字


执行一条命令运行
docker -d -p 11:80

浏览器打开 xxx:11 结果是自己写的命令输入的内容,所以自己的 镜像构建成功了

docker 的命令15个太多了

2 使用maven 插件打包发布程序为新 镜像分三步,1 是 加maven依赖 配置,
包括了 imagename镜像名 ,包括了 仓库名,镜像名,标签用冒号,2 entrypoint 表示执行的命令
baseimage 就是 from 基于java的 都是
同时引入了 resource.resource.include 表示引入了 拷贝xxx.jar
第二步是 构建,第三步是 运行,就可以查看到了 镜像和容器

 3 然后更加专业的写法,baseimage和  enpoint 都不在pom里,而在 Dockerfile文件里,在 pom只指定一个目录就行了,这样是生产环境专业的写法

 4   最终 自己建立的docker 镜像 会推送到  docker hub中,或者是个人仓库中,

可以用maven也可以用push命令,push命令还没有用过,下面例子是maven:

如果是 hub中心则 在maven的server 中配置 id,hub的 用户名,hub的密码

也可以私有镜像,但需要 baseImage中设置 localhost:5000 xxxxxxxxx

原文地址:https://www.cnblogs.com/genestart/p/11220099.html