热门标签 | 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;
在这里插入图片描述


推荐阅读
  • Sleuth+zipkin链路追踪SpringCloud微服务的解决方案
    在庞大的微服务群中,随着业务扩展,微服务个数增多,系统调用链路复杂化。Sleuth+zipkin是解决SpringCloud微服务定位和追踪的方案。通过TraceId将不同服务调用的日志串联起来,实现请求链路跟踪。通过Feign调用和Request传递TraceId,将整个调用链路的服务日志归组合并,提供定位和追踪的功能。 ... [详细]
  • 本文介绍了使用Spark实现低配版高斯朴素贝叶斯模型的原因和原理。随着数据量的增大,单机上运行高斯朴素贝叶斯模型会变得很慢,因此考虑使用Spark来加速运行。然而,Spark的MLlib并没有实现高斯朴素贝叶斯模型,因此需要自己动手实现。文章还介绍了朴素贝叶斯的原理和公式,并对具有多个特征和类别的模型进行了讨论。最后,作者总结了实现低配版高斯朴素贝叶斯模型的步骤。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
  • 本文讨论了在shiro java配置中加入Shiro listener后启动失败的问题。作者引入了一系列jar包,并在web.xml中配置了相关内容,但启动后却无法正常运行。文章提供了具体引入的jar包和web.xml的配置内容,并指出可能的错误原因。该问题可能与jar包版本不兼容、web.xml配置错误等有关。 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
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社区 版权所有