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进行登录,即可进行操作。