Dubbo学习笔记

0分布式系统概念

0.1大型互联网互联网项目特点

•用户多

•流量大,并发高

•海量数据

•易受攻击

•功能繁琐

•变更快

0.2大型互联网项目架构目标

高性能:提供快速的访问体验。

高可用:网站服务一直可以正常访问。

可伸缩:通过硬件增加/减少,提高/降低处理能力。

高可扩展:系统间耦合低,方便的通过新增/移除方式,增加/减少新的功能/模块。

安全性:提供网站安全访问和数据加密,安全存储等策略。

敏捷性:随需应变,快速响应。

0.3集群

很多“人”一起 ,干一样的事
一个业务模块,部署在多台服务器上。

0.4分布式

很多“人”一起,干不一样的事。这些不一样的事,合起来是一件大事。
一个大的业务系统,拆分为小的业务模块,分别部署在不同的机器上

0.5单机、集群、集群分布式

单体架构
在这里插入图片描述
集群
在这里插入图片描述集群分布式
在这里插入图片描述

0.6架构演进

在这里插入图片描述

0.6.1单体架构

在这里插入图片描述

0.6.2垂直架构

在这里插入图片描述

0.6.3分布式架构

在这里插入图片描述

0.6.4soa架构

在这里插入图片描述

0.6.4微服务架构

在这里插入图片描述

1.Dubbo概述

1.1Dubbo

Dubbo是高性能、轻量级的javaRPC框架
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2Dubbo架构

在这里插入图片描述

节点角色说明:

  • Provider:暴露服务的服务提供方
  • Container:服务运行容器
  • Consumer:调用远程服务的服务消费方
  • Registry:服务注册与发现的注册中心 (zookeeper,nacos)
  • Monitor:统计服务的调用次数和调用时间的监控中心

2.Dubbo快速入门

2.1Zookeeper安装(服务注册中心来用,可以用nacos)

2.1.1下载安装

1、环境准备

ZooKeeper服务器是用Java创建的,它运行在JVM之上。需要安装JDK 7或更高版本。

2、上传

将下载的ZooKeeper放到/opt/ZooKeeper目录下


#上传zookeeper alt+p
put f:/setup/apache-zookeeper-3.5.6-bin.tar.gz
#打开 opt目录
cd /opt
#创建zooKeeper目录
mkdir  zooKeeper
#将zookeeper安装包移动到 /opt/zooKeeper
mv apache-zookeeper-3.5.6-bin.tar.gz /opt/zookeeper/

3、解压

将tar包解压到/opt/zookeeper目录下

tar -zxvf apache-ZooKeeper-3.5.6-bin.tar.gz 

在这里插入图片描述

2.2.2 配置启动

1、配置zoo.cfg

进入到conf目录拷贝一个zoo_sample.cfg并完成配置

#进入到conf目录
cd /opt/zooKeeper/apache-zooKeeper-3.5.6-bin/conf/
#拷贝
cp  zoo_sample.cfg  zoo.cfg

修改zoo.cfg

vim zoo.cfg
#打开目录
cd /opt/zooKeeper/
#创建zooKeeper存储目录
mkdir  zkdata
#修改zoo.cfg
vim /opt/zooKeeper/apache-zooKeeper-3.5.6-bin/conf/zoo.cfg

修改存储目录:dataDir=/opt/zookeeper/zkdata
在这里插入图片描述

2、启动ZooKeeper
在这里插入图片描述

cd /opt/zooKeeper/apache-zooKeeper-3.5.6-bin/bin/
#启动
 ./zkServer.sh  start

在这里插入图片描述
看到上图表示ZooKeeper成功启动

3、查看ZooKeeper状态

./zkServer.sh status

zookeeper启动成功。standalone代表zk没有搭建集群,现在是单节点

在这里插入图片描述

2.2Dubbo快速入门代码编写

在这里插入图片描述

2.2.1Service

  1. 引入依赖
    <properties>
        <spring.version>5.1.9.RELEASE</spring.version>
        <dubbo.version>2.7.4.1</dubbo.version>
        <zookeeper.version>4.0.0</zookeeper.version>

    </properties>

    <dependencies>
        <!-- servlet3.0规范的坐标 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--spring的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--springmvc的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>

        <!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
        
    </dependencies>
  1. 编写代码
package com.jq.service.iml;

import com.jq.service.UserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl implements UserService {
    public String sayHello() {
        return "hello Dubbo!";
    }
}

2.2.2web

  1. 依赖
    端口8000可能被占用报错,改一下端口即可
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jq</groupId>
    <artifactId>dubbo-web</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
        <spring.version>5.1.9.RELEASE</spring.version>
        <dubbo.version>2.7.4.1</dubbo.version>
        <zookeeper.version>4.0.0</zookeeper.version>

    </properties>

    <dependencies>
        <dependency>
            <groupId>com.jq</groupId>
            <artifactId>dubbo-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!-- servlet3.0规范的坐标 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
        <!--spring的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!--springmvc的坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>

        <!--日志-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.21</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
        </dependency>

        <!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo</artifactId>
            <version>${dubbo.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>
        <!--ZooKeeper客户端实现 -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>${zookeeper.version}</version>
        </dependency>

    </dependencies>


    <build>
        <plugins>
            <!--tomcat插件-->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.1</version>
                <configuration>
                    <port>8089</port>
                    <path>/</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  1. 编写代码
package com.jq.controller;


import com.jq.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping("/sayHello")
    public String sayHello(){
        return userService.sayHello();
    }
}

启动
在这里插入图片描述

2.3代码改造1

在这里插入图片描述

import org.apache.dubbo.config.annotation.Service;
@Service //将这个类提供的方法(服务)对外发布,将访问的IP,端口,路径注册到注册中心

2.3.1service配置

<?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://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--	<context:component-scan base-package="com.jq.service"/>-->
	
<!--	Dubbo配置-->
<!--	项目名称唯一-->
	<dubbo:application name="dubbo-service"/>
<!--	配置中心地址配置-->
	<dubbo:registry address="zookeeper:/192.168.56.10:2181"/>
<!--dubbo包扫描-->
	<dubbo:annotation package="com.jq.service.iml"/>
</beans>

2.3.2web改造

删除pom依赖
删除webxml spring的

package com.jq.controller;


import com.jq.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {
    //@Autowired 本地注入
   
    /**
     * @Reference
     *  1.从zookeeper注册中心中获取userService的访问url
     *  2.进行远程调用RPC
     *  3.将结果封装为一个代理对象,给变量赋值
     */
    @Reference //远程注入
    private UserService userService;

    @RequestMapping("/sayHello")
    public String sayHello(){
        return userService.sayHello();
    }
}

配置

<?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:mvc="http://www.springframework.org/schema/mvc"
       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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
         http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <mvc:annotation-driven/>
    <context:component-scan base-package="com.jq.controller"/>

    <!--	Dubbo配置-->
    <!--	项目名称唯一-->
    <dubbo:application name="dubbo-web"/>
    <!--	配置中心地址配置-->
    <dubbo:registry address="zookeeper://192.168.56.10:2181"/>
    <!--dubbo包扫描-->
    <dubbo:annotation package="com.jq.controller"/>
</beans>

在这里插入图片描述

2.4代码改造2

在这里插入图片描述
创建公共模块,删除web,service的UserService接口

package com.jq.service;

public interface UserService {
    public String sayHello();
}

在这里插入图片描述

3.Dubbo高级特性

3.1dubbo-admin管理平台(服务监控中心)

  • dubbo-admin 管理平台,是图形化的服务管理页面
  • 从注册中心中获取到所有的提供者 / 消费者进行配置管理
  • 路由规则、动态配置、服务降级、访问控制、权重调整、负载均衡等管理功能
  • dubbo-admin 是一个前后端分离的项目前端使用vue,后端使用springboot 安装 dubbo-admin 其实就是部署该项目

3.2dubbo-admin安装

1、环境准备

dubbo-admin 是一个前后端分离的项目。前端使用vue,后端使用springboot,安装 dubbo-admin 其实就是部署该项目。我们将dubbo-admin安装到开发环境上。要保证开发环境有jdk,maven,nodejs

安装node**(如果当前机器已经安装请忽略)**

因为前端工程是用vue开发的,所以需要安装node.js,node.js中自带了npm,后面我们会通过npm启动

下载地址

https://nodejs.org/en/

2、下载 Dubbo-Admin

建议下载最新版本的Dubbo-Admin,否则会出现各种bug

进入github,搜索dubbo-admin

https://github.com/apache/dubbo-admin

3、把下载的zip包解压到指定文件夹(解压到那个文件夹随意)

4、修改配置文件

解压后我们进入…\dubbo-admin-develop\dubbo-admin-server\src\main\resources目录,找到 application.properties 配置文件 进行配置修改

修改zookeeper地址

# centers in dubbo2.7
admin.registry.address=zookeeper://192.168.149.135:2181
admin.config-center=zookeeper://192.168.149.135:2181
admin.metadata-report.address=zookeeper://192.168.149.135:2181

admin.registry.address注册中心
admin.config-center 配置中心
admin.metadata-report.address元数据中心

5、打包项目

在 dubbo-admin-develop 目录执行打包命令

mvn  clean package

在这里插入图片描述

6、启动后端

切换到目录

dubbo-Admin-develop\dubbo-admin-distribution\target>

执行下面的命令启动 dubbo-admin,dubbo-admin后台由SpringBoot构建。

java -jar .\dubbo-admin-0.5.jar

7、前台后端

dubbo-admin-ui 目录下执行命令

npm run dev

8、访问

浏览器输入。用户名密码都是root

http://localhost:8081/

3.3dubbo-admin简单使用

注意:Dubbo Admin【服务Mock】【服务统计】将在后续版本发布…

在上面的步骤中,我们已经进入了Dubbo-Admin的主界面,在【快速入门】章节中,我们定义了服务生产者、和服务消费者,下面我们从Dubbo-Admin管理界面找到这个两个服务

1、点击服务查询

2、查询结果

A:输入的查询条件com.itheima.service.UserService

B:搜索类型,主要分为【按服务名】【按IP地址】【按应用】三种类型查询

C:搜索结果

3.1.4 dubo-admin查看详情

我们查看com.itheima.service.UserService (服务提供者)的具体详细信息,包含【元数据信息】

1)点击详情

从【详情】界面查看,主要分为3个区域

A区域:主要包含服务端 基础信息比如服务名称、应用名称等

B区域:主要包含了生产者、消费者一些基本信息

C区域:是元数据信息,注意看上面的图,元数据信息是空的

我们需要打开我们的生产者配置文件加入下面配置

    <!-- 元数据配置 -->
    <dubbo:metadata-report address="zookeeper://192.168.149.135:2181" />

重新启动生产者,再次打开Dubbo-Admin

这样我们的元数据信息就出来了

3.4Dubbo常用高级配置

3.4.1序列化

在这里插入图片描述

  • user类 :抽离出来的模块,生产者和消费者都依赖这个模块
  • 将来所有的pojo类(例如user类)都需要实现Serializable接口

3.4.2地址缓存

在这里插入图片描述
服务地址缓存到本地

3.4.3超时

在这里插入图片描述在这里插入图片描述
可以在服务提供方(建议),消费方加注解
timeout = 3000

在这里插入代码片package com.itheima.service.impl;

import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;


//@Service//将该类的对象创建出来,放到Spring的IOC容器中  bean定义

@Service(timeout = 3000)//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
public class UserServiceImpl implements UserService {

    public String sayHello() {
        return "hello dubbo hello!~";
    }


    public User findUserById(int id) {
        //查询User对象
        User user = new User(1,"zhangsan","123");

        return user;
    }
}

3.4.4重试

在这里插入图片描述

retries = 3

package com.itheima.service.impl;

import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;


//@Service//将该类的对象创建出来,放到Spring的IOC容器中  bean定义

@Service(timeout = 3000,retries = 3)//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
public class UserServiceImpl implements UserService {

    public String sayHello() {
        return "hello dubbo hello!~";
    }


    public User findUserById(int id) {
        //查询User对象
        User user = new User(1,"zhangsan","123");

        return user;
    }
}

3.4.5多版本

在这里插入图片描述

  • 服务方升级
  • 同一接口的多版本
    在这里插入图片描述
    两个服务方,通过注解改变版本
@Service(timeout = 3000,retries = 3,version = "v1.0")
package com.itheima.service.impl;

import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;


//@Service//将该类的对象创建出来,放到Spring的IOC容器中  bean定义

@Service(timeout = 3000,retries = 3,version = "v1.0")//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
public class UserServiceImpl implements UserService {

    public String sayHello() {
        return "hello dubbo hello!~";
    }


    public User findUserById(int id) {
        //查询User对象
        User user = new User(1,"zhangsan","123");

        return user;
    }
}

3.4.6负载均衡

在这里插入图片描述

@Service(timeout = 3000,retries = 3,version = "v1.0",weight = 100)
package com.itheima.service.impl;

import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Service;


//@Service//将该类的对象创建出来,放到Spring的IOC容器中  bean定义

@Service(timeout = 3000,retries = 3,version = "v1.0",weight = 100)//将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
public class UserServiceImpl2 implements UserService {

    public String sayHello() {
        return "hello dubbo hello!~";
    }


    public User findUserById(int id) {
        //查询User对象
        User user = new User(1,"zhangsan","123");

        return user;
    }
}

 @Reference(loadbalance = "random")//远程注入
    private UserService userService;
package com.itheima.controller;

import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    //注入Service
    //@Autowired//本地注入

    /*
        1. 从zookeeper注册中心获取userService的访问url
        2. 进行远程调用RPC
        3. 将结果封装为一个代理对象。给变量赋值

     */

    @Reference(loadbalance = "random")//远程注入
    private UserService userService;


    @RequestMapping("/sayHello")
    public String sayHello(){
        return userService.sayHello();
    }

    /**
     * 根据id查询用户信息
     * @param id
     * @return
     */

    @RequestMapping("/find")
    public User find(int id){
        return userService.findUserById(id);
    }

}


3.4.7集群容错

在这里插入图片描述
服务提供者

    @Reference(loadbalance = "random",cluster ="failover")//远程注入
    private UserService userService;
package com.itheima.controller;

import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    //注入Service
    //@Autowired//本地注入

    /*
        1. 从zookeeper注册中心获取userService的访问url
        2. 进行远程调用RPC
        3. 将结果封装为一个代理对象。给变量赋值

     */

    @Reference(loadbalance = "random",cluster ="failover")//远程注入
    private UserService userService;


    @RequestMapping("/sayHello")
    public String sayHello(){
        return userService.sayHello();
    }

    /**
     * 根据id查询用户信息
     * @param id
     * @return
     */

    @RequestMapping("/find")
    public User find(int id){
        return userService.findUserById(id);
    }

}


3.4.8服务降级

不太重要的服务关掉

在这里插入图片描述

    @Reference(loadbalance = "random",cluster ="failover",mock = "force:return null")//远程注入
    private UserService userService;
package com.itheima.controller;

import com.itheima.pojo.User;
import com.itheima.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    //注入Service
    //@Autowired//本地注入

    /*
        1. 从zookeeper注册中心获取userService的访问url
        2. 进行远程调用RPC
        3. 将结果封装为一个代理对象。给变量赋值

     */

    @Reference(loadbalance = "random",cluster ="failover",mock = "force:return null")//远程注入
    private UserService userService;


    @RequestMapping("/sayHello")
    public String sayHello(){
        return userService.sayHello();
    }

    /**
     * 根据id查询用户信息
     * @param id
     * @return
     */

    @RequestMapping("/find")
    public User find(int id){
        return userService.findUserById(id);
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值