热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

厚积薄发打卡Day66:【itheima】Dubbo快速入门(上)<从分布式到Dubbo搭建>

1.分布式相关概念1.1互联网项目架构-特点互联网项目架构-特点用户多流量大,并发高海量数据易受攻击功能繁琐变更快传统项目和互联网项目的不同用户体验࿱

1.分布式相关概念


1.1 互联网项目架构-特点

互联网项目架构-特点

  1. 用户多

  2. 流量大,并发高

  3. 海量数据

  4. 易受攻击

  5. 功能繁琐

  6. 变更快

传统项目和互联网项目的不同

在这里插入图片描述

用户体验:
美观、功能、速度、稳定性

衡量一个网站速度是否快: 打开一个新页面一瞬间完成;页面内跳转,刹那间完成。

根据佛经《僧衹律》记载:

一刹那者为一念,二十念为一 瞬,二十瞬为一 弹指,二十弹指为一罗预, 二十罗预为一须臾,一日一夜有三十须臾。

换算一下:以一天24小时为标准倒推

  • 须臾:24/30 = 0.8h
  • 罗预:0.8/20 = 0.04h = 2.4min
  • 弹指:2.4/20 = 0.12min = 7.2s
  • 瞬: 7.2/20 = 0.36s = 360ms
  • 念: 360/20 = 18ms


1.2 互联网项目架构-目标

衡量网站的性能指标:

  • 响应时间: 指执行一个请求从开始到最后收到响应数据所花费的总体时间。
  • 并发数: 指系统同时能处理的请求数量。
  • 并发连接数: 指的是客户端向服务器发起请求,并建立了TCP连接。每秒钟服务器连接的总TCP量
  • 请求数: 也称为QPS(Query Per Second)指每秒多少请求.
  • 并发用户数: 单位时间内有多少用户
  • 吞吐量: 指单位时间内系统能处理的请求数量。

- QPS: Query Per Second每秒查询数。
- TPS: Transactions Per Second每秒事务数。
- 一个事务是指一 个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
- 一个页面的一次访问,只会形成一 个TPS; 但-次页面请求,可能产生多次对服务器的请求,就会有多个QPS- QPS>=并发连接数>= TPS

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

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

​ ● 高可用: 网站服务- 可以正常访问

1.3 集群和分布式

集群和分布式:

  • 集群:很多“人”一起,干一样的事。
  • 一个业务模块,部署在多台服务器上。
  • 分布式:很多"人”一起,干不样的事。这些不一样的事, 合起来是一件大事。

在这里插入图片描述

1.4 架构演进

单体架构:

  • 优点:
    • 简单:开发部署都很方便,小型项目首选
  • 缺点:
    • 项目启动慢
    • 可靠性差

在这里插入图片描述

垂直架构:

​ 垂直架构是指将单体架构中的多个模块拆分为多个独立的项目。形成多个独立的单体架构。

单体架构存在的问题:

  • 项目启动慢

  • 可靠性差

  • 可伸缩性差

  • 扩展性和可维护性差

  • 性能低

垂直架构存在的问题: 重复功能太多

在这里插入图片描述

分布式架构:
是指在垂直架构的基础上,将公共业务模块抽取出来,作为独立的服务供其他调用者消费,以实现服务的共享和重用。底层通过RPC(远程过程调用实现)

RPC:
Remote Procedure Call远程过程调用。有非常多的协议和技术来都实现了RPC的过程。比如: HTTP REST风格,Java RMI规范、WebService SOAP协议Hession等等。

垂直架构存在的问题:

  • 重复功能太多

分布式架构存在的问题:

  • 服务提供方一旦产生变更,所有消费方都需要变更。

在这里插入图片描述

SOA: (Service- Oriented Architecture,面向服务的架构):
是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来。

ESB: (Enterparise Servce Bus):
企业服务总线,服务中介。主要是提供了一个服务于服务之间的交互。

ESB包含的功能如:

  • 负载均衡,流量控制,加密处理,服务的监控,异常处理,监控告急等等。

在这里插入图片描述

微服务架构:

  • 微服务架构是在SOA上做的升华,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成。
  • 微服务架构= 80%的SOA服务架构思想+ 100%的组件化架构思想+ 80%的领域建模思想

特点:

  • 服务实现组件化:开发者可以自由选择开发技术。也不需要协调其他团队
  • 服务之间交互一 般使用REST API
  • 去中心化:每个微服务有自己私有的数据库持久化业务数据
  • 自动化部署:把应用拆分成为一个个独立的单个服务,方便自动化部署、测试、运维

在这里插入图片描述

网关是啥?


2. Dubbo 概述

Dubbo概念

  • Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。
  • 致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。
  • 官网: htp://ubbo.apache.orgo

在这里插入图片描述

节点角色说明: .

  • Provider: 暴露服务的服务提供方

  • Contahier: 服务运行容器

  • Consumer: 调用远程服务的服务消费方

  • Registry: 服务注册与发现的注册中心 (此处也就是我们的zookeeper)

  • Monitor:统计服务的调用次数和调用时间的监控中心


3. dubbo快速入门


3.1 zookeeper安装

安装步骤:

第一步:安装 jdk

ZooKeeper服务器是用Java创建的,它运行在JVM之上。需要安装JDK 7或更高版本。
在此次学习中我们用的是win10的wsl,详细的环境搭建可以查看下面推文:

厚积薄发打卡Day55 :[狂神]Redis详细教程(上)<从Nosql 概述到WSL安装Redis踩坑记录>

环境已经准备好:

在这里插入图片描述

第二步:上传安装包

把 zookeeper 的压缩包(zookeeper-3.4.6.tar.gz)上传到 linux 系统

将下载的ZooKeeper放到/opt/ZooKeeper目录下,此时我们用xftp6 窗口模式操作

在这里插入图片描述

第三步:解压缩压缩包

#创建zooKeeper目录
mkdir zookeeper
#将zookeeper安装包移动到 /opt/zooKeeper
mv apache-zookeeper-3.5.6-bin.tar.gz /opt/zookeeper/

第四步:进入zookeeper-3.4.6目录,创建data目录

mkdir data

第五步:进入conf目录 ,把zoo_sample.cfg复制改名为zoo.cfg

cd conf
#拷贝
cp zoo_sample.cfg zoo.cfg

第六步:打开zoo.cfg文件, 修改data属性:

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

在这里插入图片描述

进入Zookeeper的bin目录,启动服务命令

./zkServer.sh start

在这里插入图片描述

停止服务命令

./zkServer.sh stop

在这里插入图片描述

查看服务状态:standalone 单节点

./zkServer.sh status

在这里插入图片描述

3.2 spring和springmvc整合

实施步骤:

  1. 创建服务提供者Provider模块
  2. 创建服务消费者Consumer模块
  3. 在服务提供者模块编写UserServicelmpl提供服务
  4. 在服务消费者中的UserC ontroller远程调用
  5. UserServicelmpl提供的服务
  6. 分别启动两个服务,测试

首先用Spring搭建一个接口注入调用实现类的传统方法:

在这里插入图片描述

在这里插入图片描述

踩坑:

idea中maven用法:

Maven报错:The packaging for this project did not assign a file to the build artifact

  1. 要用对应工具,看清楚maven项目的依赖顺序
  2. 用完要停止tomcat

Dubbo作为一个RPC框架,其最核心的功能就是要实现跨网络的远程调用。

本小节就是要创建两个应用,一个作为服务的提供方,一个作为服务的消费方。

通过Dubbo来实现服务消费方远程调用服务提供方的方法。

1 服务提供方开发

开发步骤:

(1)创建maven工程(打包方式为war)dubbodemo_provider,在pom.xml文件中导入如下坐标

<properties><project.build.sourceEncoding>UTF-8project.build.sourceEncoding><maven.compiler.source>1.8maven.compiler.source><maven.compiler.target>1.8maven.compiler.target><spring.version>5.0.5.RELEASEspring.version>
properties>
<dependencies><dependency><groupId>org.springframeworkgroupId><artifactId>spring-contextartifactId><version>${spring.version}version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-beansartifactId><version>${spring.version}version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-webmvcartifactId><version>${spring.version}version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-jdbcartifactId><version>${spring.version}version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-aspectsartifactId><version>${spring.version}version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-jmsartifactId><version>${spring.version}version>dependency><dependency><groupId>org.springframeworkgroupId><artifactId>spring-context-supportartifactId><version>${spring.version}version>dependency><dependency><groupId>com.alibabagroupId><artifactId>dubboartifactId><version>2.6.0version>dependency><dependency><groupId>org.apache.zookeepergroupId><artifactId>zookeeperartifactId><version>3.4.6version>dependency><dependency><groupId>com.github.sgroschupfgroupId><artifactId>zkclientartifactId><version>0.1version>dependency><dependency><groupId>javassistgroupId><artifactId>javassistartifactId><version>3.12.1.GAversion>dependency><dependency><groupId>com.alibabagroupId><artifactId>fastjsonartifactId><version>1.2.47version>dependency>
dependencies>
<build><plugins><plugin><groupId>org.apache.maven.pluginsgroupId><artifactId>maven-compiler-pluginartifactId><version>2.3.2version><configuration><source>1.8source><target>1.8target>configuration>plugin><plugin><groupId>org.apache.tomcat.mavengroupId><artifactId>tomcat7-maven-pluginartifactId><configuration><port>8081port><path>/path>configuration>plugin>plugins>
build>

&#xff08;2&#xff09;配置web.xml文件


<web-app><display-name>Archetype Created Web Applicationdisplay-name><context-param><param-name>contextConfigLocationparam-name><param-value>classpath:applicationContext*.xmlparam-value>context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListenerlistener-class>listener>
web-app>

&#xff08;3&#xff09;创建服务接口

package com.itheima.service;
public interface HelloService {public String sayHello(String name);
}

&#xff08;4&#xff09;创建服务实现类

注意&#xff1a; 服务实现类上使用的Service注解是Dubbo提供的&#xff0c;用于对外发布服务

package com.itheima.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.service.HelloService;&#64;Service //此时注意这个service是dubbo框架下的
public class HelloServiceImpl implements HelloService {public String sayHello(String name) {return "hello " &#43; name;}
}

tomcat7:run

2 服务消费方开发

开发步骤&#xff1a;

&#xff08;1&#xff09;创建maven工程&#xff08;打包方式为war&#xff09;dubbodemo_consumer&#xff0c;pom.xml配置和上面服务提供者相同&#xff0c;只需要将Tomcat插件的端口号改为8082即可

&#xff08;2&#xff09;配置web.xml文件


<web-app><display-name>Archetype Created Web Applicationdisplay-name><servlet><servlet-name>springmvcservlet-name><servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class><init-param><param-name>contextConfigLocationparam-name><param-value>classpath:applicationContext-web.xmlparam-value>init-param><load-on-startup>1load-on-startup>servlet><servlet-mapping><servlet-name>springmvcservlet-name><url-pattern>*.dourl-pattern>servlet-mapping>
web-app>

&#xff08;3&#xff09;将服务提供者工程中的HelloService接口复制到当前工程

&#xff08;4&#xff09;编写Controller

package com.itheima.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.service.HelloService;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
&#64;Controller
&#64;RequestMapping("/demo")
public class HelloController {&#64;Referenceprivate HelloService helloService;&#64;RequestMapping("/hello")&#64;ResponseBodypublic String getName(String name){//远程调用String result &#61; helloService.sayHello(name);System.out.println(result);return result;}
}

注意&#xff1a;Controller中注入HelloService使用的是Dubbo提供的&#64;Reference注解

3.3 服务提供者

在dubbodemo_provider工程中src/main/resources下创建applicationContext-service.xml


<beans xmlns&#61;"http://www.springframework.org/schema/beans"xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"xmlns:p&#61;"http://www.springframework.org/schema/p"xmlns:context&#61;"http://www.springframework.org/schema/context"xmlns:dubbo&#61;"http://code.alibabatech.com/schema/dubbo"xmlns:mvc&#61;"http://www.springframework.org/schema/mvc"xsi:schemaLocation&#61;"http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><dubbo:application name&#61;"dubbodemo_provider" /><dubbo:registry address&#61;"zookeeper://localhost:2181"/><dubbo:protocol name&#61;"dubbo" port&#61;"20881">dubbo:protocol><dubbo:annotation package&#61;"com.itheima.service.impl" />
beans>

3.4 服务消费者

在dubbodemo_consumer工程中src/main/resources下创建applicationContext-web.xml


<beans xmlns&#61;"http://www.springframework.org/schema/beans"xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"xmlns:p&#61;"http://www.springframework.org/schema/p"xmlns:context&#61;"http://www.springframework.org/schema/context"xmlns:dubbo&#61;"http://code.alibabatech.com/schema/dubbo"xmlns:mvc&#61;"http://www.springframework.org/schema/mvc"xsi:schemaLocation&#61;"http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><dubbo:application name&#61;"dubbodemo-consumer" /><dubbo:registry address&#61;"zookeeper://192.168.134.129:2181"/><dubbo:annotation package&#61;"com.itheima.controller" />
beans>

运行测试

tomcat7:run启动

在浏览器输入http://localhost:8082/demo/hello.do?name&#61;Jack&#xff0c;查看浏览器输出结果

在这里插入图片描述

3.5 抽取公共接口

创建公共接口项目&#xff0c;并在service 和 web模块中一起调用
在这里插入图片描述

<dependency><groupId>com.itheimagroupId><artifactId>dubbo-interfaceartifactId><version>1.0-SNAPSHOTversion>dependency>

最终项目架构&#xff1a;
在这里插入图片描述


推荐阅读
  • 本文详细介绍了Java代码分层的基本概念和常见分层模式,特别是MVC模式。同时探讨了不同项目需求下的分层策略,帮助读者更好地理解和应用Java分层思想。 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • (1)前期知识:1. 单机架构:单一服务器计算机——其处理能力和存储容量有限。2. 集群架构(负载均衡器与多节点服务器)——通过增加节点数量来提升系统性能和可靠性,实现高效的任务分配和资源利用。 ... [详细]
  • 本文推荐了六款高效的Java Web应用开发工具,并详细介绍了它们的实用功能。其中,分布式敏捷开发系统架构“zheng”项目,基于Spring、Spring MVC和MyBatis技术栈,提供了完整的分布式敏捷开发解决方案,支持快速构建高性能的企业级应用。此外,该工具还集成了多种中间件和服务,进一步提升了开发效率和系统的可维护性。 ... [详细]
  • 目录RPC是什么RPC的优点RPC的缺点RPC是什么RPC(RemoteProcedureCall)isaprotocolthatoneprogramcanusetorequest ... [详细]
  • Java EE 平台集成了多种服务、API 和协议,旨在支持基于 Web 的多层应用程序开发。本文将详细介绍 Java EE 中的 13 种关键技术规范,帮助开发者更好地理解和应用这些技术。 ... [详细]
  • 微服务优雅上下线的最佳实践
    本文介绍了微服务上下线的正确姿势,避免使用 kill -9 等粗暴手段,确保服务的稳定性和可靠性。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 修复一个 Bug 竟耗时两天?真的有那么复杂吗?
    修复一个 Bug 竟然耗费了两天时间?这背后究竟隐藏着怎样的复杂性?本文将深入探讨这个看似简单的 Bug 为何会如此棘手,从代码层面剖析问题根源,并分享解决过程中遇到的技术挑战和心得。 ... [详细]
  • 本文详细介绍了在CentOS 6.5 64位系统上使用阿里云ECS服务器搭建LAMP环境的具体步骤。首先,通过PuTTY工具实现远程连接至服务器。接着,检查当前系统的磁盘空间使用情况,确保有足够的空间进行后续操作,可使用 `df` 命令进行查看。此外,文章还涵盖了安装和配置Apache、MySQL和PHP的相关步骤,以及常见问题的解决方法,帮助用户顺利完成LAMP环境的搭建。 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
  • Ceph API微服务实现RBD块设备的高效创建与安全删除
    本文旨在实现Ceph块存储中RBD块设备的高效创建与安全删除功能。开发环境为CentOS 7,使用 IntelliJ IDEA 进行开发。首先介绍了 librbd 的基本概念及其在 Ceph 中的作用,随后详细描述了项目 Gradle 配置的优化过程,确保了开发环境的稳定性和兼容性。通过这一系列步骤,我们成功实现了 RBD 块设备的快速创建与安全删除,提升了系统的整体性能和可靠性。 ... [详细]
  • 2019年后蚂蚁集团与拼多多面试经验详述与深度剖析
    2019年后蚂蚁集团与拼多多面试经验详述与深度剖析 ... [详细]
  • Windows环境下详细教程:如何搭建Git服务
    Windows环境下详细教程:如何搭建Git服务 ... [详细]
  • Panabit应用层流量管理解决方案
    Panabit是一款国内领先的应用层流量管理解决方案,提供高度开放且免费的专业服务,尤其擅长P2P应用的精准识别与高效控制。截至2009年3月25日,该系统已实现对多种网络应用的全面支持,有效提升了网络资源的利用效率和安全性。 ... [详细]
author-avatar
维尼饭爱nichkhun_774
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有