一. 系统架构的演变
1.1 单体架构
单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合在一个应用中的架构方式。
存在的问题:
- 代码耦合
- 迭代困难
- 扩展受限
- 技术债务
1.2 分布式架构
分布式:需要按照功能点把系统拆分,拆分成独立的功能,单独为某一个节点添加服务器,需要系统之间配合才能完成整个业务逻辑。
存在的问题:
- 模块之间有一些通用的业务逻辑无法共用
1.3 soa架构
SOA:Service Oriented Architecture(面向服务的架构)。也就是把工程拆分成服务层,表现层两个工程。服务层中包含业务逻辑,只需要对外提供服务即可。表现层只需要处理和页面的交互,业务逻辑都是调用服务层的服务来实现,使用ESB(Enterparise Servce Bus企业服务总线,代表技术:Mule、WSO2)提供表现层和服务层之间的交互。
存在的问题:
- 不支持集群、臃肿
- 提供者和消费者耦合度太高
- 抽取服务的粒度太大
二. dubbox框架
2.1 dubbox简介
Dubbo(读音[ˈdʌbəʊ])是阿里巴巴公司开源的一个基于Java的高性能RPC(Remote Procedure Call)框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。后期阿里巴巴停止了该项目的维护,于是当当网在这之上推出了自己的Dubbox。
2.2 dubboX架构
节点角色说明:
Provider: 暴露服务的服务提供方。
Container: 服务运行容器。
Registry: 服务注册与发现的注册中心。
Consumer: 调用远程服务的服务消费方。
Monitor: 统计服务的调用次调和调用时间的监控中心。
调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
三. 注册中心zookeeper
3.1 zookeeper介绍
Zookeeper是Apacahe Hadoop的子项目,可以为分布式应用程序协调服务,适合作为Dubbo服务的注册中心,负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互。
3.2 zookeeper的安装(linux系统下安装,前提已经安装过jdk)
- 上传并解压缩zookeeper压缩包
tar -zxvf zookeeper-3.4.11.tar.gz -C /usr/local
- 将conf文件夹下zoo_sample.cfg复制一份,改名为zoo.cfg
cd /usr/local/zookeeper-3.4.11/conf
cp zoo_sample.cfg zoo.cfg
- 修改配置dataDir属性,指定一个真实目录
cd /usr/local/zookeeper-3.4.11
mkdir data
- 打开 zoo.cfg , 修改 data 属性:dataDir=/usr/local/zookeeper-3.4.11/data
3.3 启动zookeeper
-
进入 bin 目录,启动服务输入命令
./zkServer.sh star
- 输出以下内容表示启动成功
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- 关闭服务输入命令
./zkServer.sh stop
- 查看服务状态
./zkServer.sh status
- 如果是启动状态则是以下提示
JMX enabled by default
Using config: /root/zookeeper-3.4.6/bin/../conf/zoo.cfg
Mode: standalone
三. dubbox案例
3.1 创建父工程 dubbox_parent
- 在父工程的pom.xml中添加依赖
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<groupId>com.bjpowernode</groupId>
<artifactId>dubbox_parent</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!-- 由于使⽤了zookeeper作为注册中⼼,则需要加⼊zookeeper的客户端jar包: -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
</project>
3.2 创建公共接口模块 dubbox_interface
- pom.xml
<?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">
<parent>
<artifactId>dubbox_parent</artifactId>
<groupId>com.bjpowernode</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbox_interface</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
</project>
- service 定义一个接口
package com.bjpowernde.service;
public interface HelloService {
String hello();
}
3.3 定义服务提供方 dubbox_provider
- pom.xml
<?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">
<parent>
<artifactId>dubbox_parent</artifactId>
<groupId>com.bjpowernode</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbox_provider</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>dubbox_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
- 配置文件:application.yml
server:
port: 8081
dubbo:
#zookeeper地址
registry:
address: zookeeper://192.168.128.129:2181
#当前服务的名称,监控中心统计服务的调用次数和调用时间
application:
name: dubbox-provider
#协议:Dubbo支持的协议(Dubbo,PEI,http,WebService)
protocol:
name: dubbo
- serviceImpl(类上面的注解不要选错,是alibaba包下的)
- @service:将此类注入到容器中并将该服务注册到zookeeper中
package com.bjpowernode;
import com.alibaba.dubbo.config.annotation.Service;
import com.bjpowernde.service.HelloService;
@Service
public class HelloServiceImpl implements HelloService {
@Override
public String hello() {
return "hello,世界你好!";
}
}
- 启动类App
package com.bjpowernode;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableDubbo //dubbo注解生效
public class DubboxProviderApp {
public static void main(String[] args) {
SpringApplication.run(DubboxProviderApp.class,args);
}
}
3.4 定义服务消费方 dubbox_consumer
- pom.xml
<?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">
<parent>
<artifactId>dubbox_parent</artifactId>
<groupId>com.bjpowernode</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbox_consumer</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.bjpowernode</groupId>
<artifactId>dubbox_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
- 配置文件:application.yml
server:
port: 8080
dubbo:
#zookeeper地址
registry:
address: zookeeper://192.168.128.129:2181
#当前服务的名称,监控中心统计服务的调用次数和调用时间
application:
name: dubbox-consumer
#协议:Dubbo支持的协议(Dubbo,PEI,http,WebService)
protocol:
name: dubbo
- controller(公共接口的注解不要选错@Reference)
package com.bjpowernode.Controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.bjpowernde.service.HelloService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Reference
private HelloService helloService;
@GetMapping("/hello")
public String hello(){
return helloService.hello();
}
}
- 启动类App
package com.bjpowernode;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo //dubbo注解扫描
@SpringBootApplication
public class DubboxConsumerApp {
public static void main(String[] args) {
SpringApplication.run(DubboxConsumerApp.class,args);
}
}
3.5 启动测试
- 注意:先install父工程(大war包要去父工程找依赖的版本号)
- 先启动服务提供方再启动服务消费方
- 访问: http://localhost:8080/hello