互联网项目架构-特点
用户多
流量大,并发高
海量数据
易受攻击
功能繁琐
变更快
传统项目和互联网项目的不同
用户体验:
美观、功能、速度、稳定性
衡量一个网站速度是否快: 打开一个新页面一瞬间完成;页面内跳转,刹那间完成。
根据佛经《僧衹律》记载:
一刹那者为一念,二十念为一 瞬,二十瞬为一 弹指,二十弹指为一罗预, 二十罗预为一须臾,一日一夜有三十须臾。
换算一下:以一天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
衡量网站的性能指标:
- QPS: Query Per Second每秒查询数。
- TPS: Transactions Per Second每秒事务数。
- 一个事务是指一 个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
- 一个页面的一次访问,只会形成一 个TPS; 但-次页面请求,可能产生多次对服务器的请求,就会有多个QPS- QPS>=并发连接数>= TPS
大型互联网项目架构目标:
● 高性能: 提供快速的访问体验。
● 高可用: 网站服务- 可以正常访问
集群和分布式:
单体架构:
垂直架构:
垂直架构是指将单体架构中的多个模块拆分为多个独立的项目。形成多个独立的单体架构。
单体架构存在的问题:
项目启动慢
可靠性差
可伸缩性差
扩展性和可维护性差
性能低
垂直架构存在的问题: 重复功能太多
分布式架构:
是指在垂直架构的基础上,将公共业务模块抽取出来,作为独立的服务供其他调用者消费,以实现服务的共享和重用。底层通过RPC(远程过程调用实现)
RPC:
Remote Procedure Call远程过程调用。有非常多的协议和技术来都实现了RPC的过程。比如: HTTP REST风格,Java RMI规范、WebService SOAP协议Hession等等。
垂直架构存在的问题:
分布式架构存在的问题:
SOA: (Service- Oriented Architecture,面向服务的架构):
是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来。
ESB: (Enterparise Servce Bus):
企业服务总线,服务中介。主要是提供了一个服务于服务之间的交互。
ESB包含的功能如:
微服务架构:
特点:
网关是啥?
Dubbo概念
节点角色说明: .
Provider: 暴露服务的服务提供方
Contahier: 服务运行容器
Consumer: 调用远程服务的服务消费方
Registry: 服务注册与发现的注册中心 (此处也就是我们的zookeeper)
Monitor:统计服务的调用次数和调用时间的监控中心
安装步骤:
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
实施步骤:
首先用Spring搭建一个接口注入调用实现类的传统方法:
踩坑:
idea中maven用法:
Maven报错:The packaging for this project did not assign a file to the build artifact
- 要用对应工具,看清楚maven项目的依赖顺序
- 用完要停止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
注解
在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>
在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;查看浏览器输出结果
创建公共接口项目&#xff0c;并在service 和 web模块中一起调用
<dependency><groupId>com.itheimagroupId><artifactId>dubbo-interfaceartifactId><version>1.0-SNAPSHOTversion>dependency>
最终项目架构&#xff1a;