1.什么是SOA架构
SOA是Service-Oriented Architecture的首字母简称,它是一种支持面向服务的架构样式。从服务、基于服务开发和服务的结果来看,面向服务是一种思考方式。其实SOA架构更多应用于互联网项目开发。
为什么互联网项目会采用SOA架构呢?随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,迫切需一个治理系统确保架构有条不紊的演进。
2.Dubbox简介
Dubbo 是一个分布式服务框架,其前身是阿里巴巴开源项目Dubbo ,被国内电商及互联网项目中使用,后期阿里巴巴停止了该项目的维护,当当网便在Dubbo基础上进行优化,并继续维护,为了与原有的Dubbo区分,故将其命名为Dubbox。
Dubbox 致力于提供高性能和透明化的RPC[RPC是远程过程调用(Remote Procedure Call)的缩写形式]远程服务调用方案,以及SOA服务治理方案。简单的说,dubbox就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbox这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架。
Dubbo是一个基于RPC的分布式服务框架【只有在分布式】
Dubbo运行结构图
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0. 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计
数据到监控中心。
3.Zookeeper 介绍
官方推荐使用 zookeeper 注册中心。注册中心负责服务地址的注册与查找,相当于目录服务,服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。
Zookeeper 是 Apacahe Hadoop 的子项目,是一个树型的目录服务,支持变更推送,适合作为Dubbox 服务的注册中心,工业强度较高,可用于生产环境。
4.Zookeeper 在Linux系统的安装
安装步骤:
第1步:安装 Linux(此步省略)[因为我们使用的windows系统,所以我们只能把linux安装在虚拟机中] 安装虚拟机和在虚拟机中安装linux系统请参考linux课件
【设置虚拟机网络连接方式为仅主机。】
第2步:下载zookeeper安装包
第3步:通过SecureCRT工具将在windows系统中下载好的zookeeper安装包上传到 linux 系统。
第4步:解压缩zookeepe压缩包
tar -zxvf apache-zookeeper-3.6.2-bin.tar.gz
第5步:进入 zookeeper的解压目录,创建 data文件夹。
第6步:修改conf目录中的zoo_sample.cfg文件的名称,修改成zoo.cfg
第7步:打开zoo.cfg , 修改 data 属性
修改 data 属性:dataDir=/home/wxrj/apache-zookeeper-3.6.2-bin/data
第8步:进入bin目录,启动zookeeper服务输入命令
进入apache-zookeeper-3.6.2-bin目录,启动服务输入命令
./zKServer.sh start
输出以下内容表示启动成功
第9步:进入bin目录,关闭zookeeper服务输入命令
./zKServer.sh stop
输出以下提示信息
5.Dubbo快速入门
实现步骤:
(1)创建服务提供者Provider模块
(2)创建服务消费者Consumer模块
(3)在服务提供者模块编写UserServiceImpl提供服务
(4)在服务消费者中的UserController远程调用UserServiceImpl提供的服务
(5)分别启动两个服务,测试
provide模块
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 https://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.6.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.weiwei.dubbodemo</groupId>
<artifactId>dubbo-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dubbo-provider</name>
<description>dubbo-provider</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.7</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
<version>1.2.8.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
</plugin>
</plugins>
</build>
</project>
UserService接口
public interface UserService {
String getString();
}
UserServiceImpl
import com.alibaba.dubbo.config.annotation.Service;
@Service
public class UserServiceImpl implements UserService{
@Override
public String getString() {
return "张三";
}
}
application.properties
spring.dubbo.application.name=dubboprovider
spring.dubbo.registry.address=zookeeper://192.168.25.128:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.weiwei.dubbodemo.dubboprovider.service
consumer模块
pom.xml同provide模块
controller控制类
package com.weiwei.dubbodemo.dubboconsumer.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.weiwei.dubbodemo.dubboprovider.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Reference
private UserService userService;
@RequestMapping("/user.do")
public String getStr(){
return userService.getString();
}
}
需要把provider模块的接口复制过来
application.properties
##避免和 server 工程端口冲突
server.port=8081
## Dubbo 服务消费者配置
spring.dubbo.application.name=dubboconsumer
#注册中心地址 ip查看虚拟机的ip
spring.dubbo.registry.address=zookeeper://192.168.25.128:2181
#声明需要暴露的服务接口
spring.dubbo.scan=com.weiwei.dubbodemo.dubboconsumer.controller
异常:java.net.ConnectException: Connection timed out: no further information
Zookeeper注册中心连接超时
原因:可能是注册中心所在的计算机【Linux ContOS7】的防火墙未关闭。
解决方法:关闭防火墙
centOS7 查看防火墙状态
一、防火墙的开启、关闭、禁用命令
(1)设置开机启用防火墙:systemctl enable firewalld.service
(2)设置开机禁用防火墙:systemctl disable firewalld.service
(3)启动防火墙:systemctl start firewalld
(4)关闭防火墙:systemctl stop firewalld
(5)检查防火墙状态:systemctl status firewalld