Java学习笔记-Day87 Dubbo分布式服务框架


一、应用系统架构演变


技术为业务而生,架构也为业务而出现。随着业务的发展、用户量的增长,系统数量增多,调用依赖关系也变得复杂,为了确保系统高可用、高并发的要求,系统的架构也从单体时代慢慢迁移至服务SOA时代,根据不同服务对系统资源的要求不同,我们可以更合理的配置系统资源,使系统资源利用率最大化。

(1)单一应用框架
当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的 数据访问框架(ORM) 是关键。缺点:单一的系统架构,使得在开发过程中,占用的资源越来越多,而且随着流量的增加越来越难以维护。

(2)垂直应用框架
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的 Web框架(MVC) 是关键。在垂直架构中相同逻辑代码需要不断的复制,不能复用。

(3)分布式应用架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的 分布式服务框架(RPC) 是关键。

(4)流动计算架构
随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越复杂,诞生了 面向服务的架构体系(SOA Service-Oriented Arthitecture),也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务路由、日志输出等行为进行封装的服务框架。此时,用于提高机器利用率的资源调度和治理中心(SOA) 是关键。微服务就是SOA架构的演进。

在这里插入图片描述

二、Dubbo的简介


Dubbo是阿里巴巴公司开源的一个高性能优秀的分布式服务框架 ,使得应用可通过高性能和透明化的 RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo每天为2千多个服务提供大于30亿次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点以及别的公司的业务中。

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

主要核心部件:
(1)Remoting: 网络通信框架,实现了 sync-over-async 和 request-response 消息机制。
(2)RPC: 一个远程过程调用的抽象,支持负载均衡、容灾和集群功能。
(3)Registry: 服务目录框架用于服务的注册和服务事件发布和订阅。

三、Dubbo的架构


在这里插入图片描述
Dubbo服务调用流程:

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

Dubbo注册中心 :对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量、类型也不断膨胀;对于服务消费方,它最关心如何获取到它所需要的服务,而面对复杂的应用系统,需要管理大量的服务调用。 对于服务提供方和服务消费方来说,它们还有可能兼具这两种角色,即需要提供服务,也需要消费服务。通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。

Dubbo提供的注册中心有如下类型:Multicast注册中心、Zookeeper注册中心、Redis注册中心、Simple注册中心。

四、Dubbo的优缺点


Dubbo的优点:

  • 透明化的远程方法调用。
  • 像调用本地方法一样调用远程方法(只需简单配置,没有任何API侵入)。
  • 软负载均衡及容错机制。
  • 可在内网替代nginx lvs等硬件负载均衡器。
  • 服务注册中心自动注册 & 配置管理。
  • 不用写死 服务提供者地址,注册中心会基于接口名自动查询提供者IP。
  • 使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移入zookeeper集群。
  • 服务接口监控与治理。
  • Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用的不同接口,可以进行 多版本,多协议,多注册中心管理。

Dubbo的缺点:

  • 只支持JAVA语言。

五、Dubbo的使用

1、搭建zookeeper注册中心


(1)访问网站 https://hub.docker.com/,在搜索框输入zookeeper进行搜索。

在这里插入图片描述
(2)通过 docker pull zookeeper 将zookeeper镜像拉取到本地仓库。

在这里插入图片描述

(3)通过 docker run --name 自定义名 --restart always -d -p 2181:2181 镜像编号 启动容器。例如:docker run --name zk01 --restart always -d -p 2181:2181 a7dfca58680a

在这里插入图片描述

2、创建服务者和消费者

2.1、创建公共的类和接口的jar包


(1)先创建一个名称为dubbo空项目,New -> Project -> Empty Project。

在这里插入图片描述
(2)在空项目创建commons的模块。选择该模块的Module SDK,再选择 maven-archtype-quickstart,点击Next。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(3)创建服务者Provider和消费者Consumer公有的类和接口。

  • User.java
package com.etc.entity;

import java.io.Serializable;

public class User implements Serializable {
    
    
    private Integer id;
    private String name;

    @Override
    public String toString() {
    
    
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }

    public Integer getId() {
    
    
        return id;
    }

    public void setId(Integer id) {
    
    
        this.id = id;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }
}
  • UserService.java
package com.etc.service;

import com.etc.entity.User;

public interface UserService {
    
    
    public User getUserById(Integer id);
}

(4)点击窗口右侧的Maven选项,找到commond的install,用鼠标双击install。
在这里插入图片描述
(5)commmons的install操作完成后,会生成Target目录,在Target目录下有一个jar文件。
在这里插入图片描述

2.2、创建Provider服务者


(1)在dubbo项目创建dubboprovide的模块。该模块类型为Spring Intializr,并添加Spring Web依赖。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(2)先点击dubboprovide模块,再连续点击Shift键两下。在搜索框中输入maven关键字,点击 Add Maven Projects 选项,选择dubboprovide模块的pom.xml文件。完成后,会在右侧出现dubboprovide模块的Maven选项。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3)在dubboprovide模块的pom.xml文件加入依赖。

<!-- Dubbo Spring Boot Starter -->
<dependency>
	<groupId>com.alibaba.boot</groupId>
	<artifactId>dubbo-spring-boot-starter</artifactId>
	<version>0.2.1.RELEASE</version>
</dependency>
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>dubbo</artifactId>
	<version>2.6.5</version>
</dependency>
<!--Zookeeper客户端Curator-->
<dependency>
	<groupId>org.apache.curator</groupId>
	<artifactId>curator-recipes</artifactId>
	<version>2.12.0</version>
</dependency>

(4)将公共的类和接口的jar包 commons-1.0-SNAPSHOT.jar 添加到dubboprovide模块的src目录下。右键该jar包,点击Add as Library。

在这里插入图片描述
(5)修改application.properties配置文件。

#端口
server.port=8081
#appname
spring.application.name=dubbo-provider-user
#dubbo app name
dubbo.application.name=dubbo-provider-user
#扫描的包
dubbo.scan.base-packages=com.etc.dubboprovide.service
#注册中心地址
dubbo.registry.address=zookeeper://192.168.170.128:2181

(6)创建Service实现类。该实现类有两个@Service注解,一个是Spring的@Service注解,另一个是Dubbo的@Service注解(支持远程调用)。

package com.etc.dubboprovide.service.impl;

import com.etc.entity.User;
import com.etc.service.UserService;
import org.springframework.stereotype.Service;

@Service
@com.alibaba.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {
    
    
    @Override
    public User getUserById(Integer id) {
    
    
        User user = new User();
        user.setName("Tom");
        user.setId(1);
        return user;
    }
}

(7)在启动类前添加@EnableDubbo注解。

package com.etc.dubboprovide;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class DubboprovideApplication {
    
    

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

}

(8)运行 DubboprovideApplication 启动类。

在这里插入图片描述

2.2、创建Consumer消费者


(1)在dubbo项目创建dubboconsumer的模块。该模块类型为Spring Intializr,并添加Spring Web依赖。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
(2)先点击dubboconsumer模块,再连续点击Shift键两下。在搜索框中输入maven关键字,点击 Add Maven Projects 选项,选择dubboconsumer模块的pom.xml文件。完成后,会在右侧出现dubboconsumer模块的Maven选项。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
(3)在dubboprovide模块的pom.xml文件加入依赖。

<!-- Dubbo Spring Boot Starter -->
<dependency>
	<groupId>com.alibaba.boot</groupId>
	<artifactId>dubbo-spring-boot-starter</artifactId>
	<version>0.2.1.RELEASE</version>
</dependency>
<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>dubbo</artifactId>
	<version>2.6.5</version>
</dependency>
<dependency>
	<groupId>org.apache.curator</groupId>
	<artifactId>curator-recipes</artifactId>
	<version>2.12.0</version>
</dependency>

(4)将公共的类和接口的jar包 commons-1.0-SNAPSHOT.jar 添加到dubboconsumer模块的src目录下。右键该jar包,点击Add as Library。

在这里插入图片描述
(5)修改application.properties配置文件。

#端口
server.port=8082
#appname
spring.application.name=dubbo-consumer-user
#dubbo app name
dubbo.application.name=dubbo-consumer-user
#注册中心地址
dubbo.registry.address=zookeeper://192.168.170.128:2181

(6)创建Service接、Service实现类和Controller类。Service实现类中的@Reference注解表示引用服务者生成的service对象。

  • UService.java
package com.etc.dubboconsumer.service;

import com.etc.entity.User;

public interface UService {
    
    
    public User getProviderById(Integer id);
}

  • UServiceImpl.java
package com.etc.dubboconsumer.service.impl;

import com.alibaba.dubbo.config.annotation.Reference;
import com.etc.dubboconsumer.service.UService;
import com.etc.entity.User;
import com.etc.service.UserService;

import org.springframework.stereotype.Service;

@Service
public class UServiceImpl implements UService {
    
    
    @Reference
    private UserService userService;

    @Override
    public User getProviderById(Integer id) {
    
    
        return userService.getUserById(id);
    }
}

  • UController.java
package com.etc.dubboconsumer.controller;

import com.etc.dubboconsumer.service.UService;
import com.etc.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UController {
    
    
    @Autowired
    UService uService;

    @GetMapping("u/{id}")
    public User getUser(@PathVariable("id") Integer id){
    
    
        return uService.getProviderById(id);
    }
}

(7)在启动类前添加@EnableDubbo注解。

package com.etc.dubboconsumer;

import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@EnableDubbo
public class DubboconsumerApplication {
    
    

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

}

(8)运行 DubboconsumerApplication 启动类。访问地址 127.0.0.1:8082/u/1 即可看到从另一个模块(dubboprovide)提供的数据。

在这里插入图片描述
在这里插入图片描述

3、搭建 Dubbo Monitor 管理控制台


(1)访问网页 https://github.com/apache/dubbo-admin,通过Code -> Download ZIP 下载 dubbo-admin-develop 的代码。

在这里插入图片描述
(1)修改 dubbo-admin-develop\dubbo-admin-server\src\main\resources 目录下的application.properties。

  • admin.server.port:指定管理控制台的端口。
  • admin.config-center:指定配置中心的地址。
  • admin.registry.address:指定注册中心的地址。
  • admin.metadata-report.address:指定元数据中心的地址。
  • admin.root.user.name:设置登录账户。
  • admin.root.user.password:设置登录密码。
    在这里插入图片描述
    (2)在DOS窗口中,进入 dubbo-admin-develop 根目录,运行:mvn clean package -Dmaven.skip.test=true 进行编译。
    在这里插入图片描述
    (3)编译成功后,会在dubbo-admin-develop\dubbo-admin-distribution\target下生成jar包。在DOS窗口中,进入dubbo-admin-develop\dubbo-admin-distribution\target 运行 java -jar dubbo-admin-0.3.0-SNAPSHOT.jar

在这里插入图片描述
在这里插入图片描述
(4)访问网页 127.0.0.1:8083 ,进入Dubbo管理控制台,输入账号root和密码root进行登录,即可进行操作。
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42141141/article/details/115273156