🌟个人博客:www.hellocode.top🌟
⭐所有文章均在上方博客首发,其他平台同步更新
🔥本文专栏:《流行框架》
🌞如没有JavaWEB基础,请先前往《Java Web从入门到实战》专栏学习相应知识
⚡如有问题,欢迎指正,一起学习~~
传统项目与互联网项目

用户体验
衡量一个网站速度是否快
互联网项目特点
大型互联网项目架构目标
高性能:提供快速的访问体验
响应时间:指执行一个请求从开始到最后收到响应数据所花费的总体时间
并发数:指系统同时能处理的请求数量
吞吐量:指单位时间内系统能处理的请求数量
QPS >= 并发连接数 >= TPS
高可用:网站服务一直可以正常访问
可伸缩:通过硬件增加/减少,提高/降低处理能力
高可扩展:系统间耦合低,方便的通过新增/移除方式,增加/减少新的功能/模块
安全性:提供网站安全访问和数据加密,安全存储等策略
敏捷性:随需应变,快速响应

集群:很多“人”一起,干一样的事
分布式:很多“人”一起,干不一样的事。这些不一样的事,合起来是一件大事
早期单机架构

改进之后

继续改进


单体架构

垂直架构

分布式架构

SOA架构

微服务架构

概念
架构

Zookeeper
下载安装
Dubbo官方推荐使用Zookeeper作为注册中心(默认端口2181)
Zookeeper服务器是用Java创建的,它运行在JVM之上,需要安装JDK 7或更高版本
将下载的Zookeeper放到/opt/zooKeeper目录下(建议)
#上传zookeeper alt+p
put e:/apache-zookeeper-3.5.6-bin.tar.gz
#打开 opt目录
cd /opt
# 创建zooKeeper目录
mkdir zooKeeper
#将zooKeeper安装包移动到 /opt/zooKeeper
mv apache-zookeeper-3.5.6-bin.tar.gz /opt/zooKeeper
将tar包解压到/opt/zooKeeper目录下(建议)
tar -zxvf apache-ZooKeeper-3.5.6-bin.tar.gz
配置启动
配置zoo.cfg(初始的zoo_sample.cfg并不生效,需要改名为zoo.cfg)
#进入到conf目录
cd /opt/zooKeeper/apache-zooKeeper-3.5.6-bin/conf/
#拷贝
cp zoo_sample.cfg zoo.cfg
修改zoo.cfg
#打开目录
cd /opt/zooKeeper/
#创建zooKeeper存储目录
mkdir zkdata
#修改zoo.cfg,修改存储目录dataDir=/opt/zooKeeper/zkdata
vim /opt/zooKeeper/apache-zooKeeper-3.5.6-bin/conf/zoo.cfg
启动ZooKeeper
#进入zk的bin目录
cd /opt/zooKeeper/apache-zooKeeper-3.5.6-bin/bin/
# 启动
./zkServer.sh start
# 停止
./zkServer.sh stop
# 状态
./zkServer.sh status
实现步骤
<properties>
<dubbo.version>2.7.4.1dubbo.version>
<zookeeper.version>4.0.0zookeeper.version>
properties>
<dependencies>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
<version>3.1.0version>
<scope>providedscope>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.1.9.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.1.9.RELEASEversion>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>1.7.5version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-log4j12artifactId>
<version>1.7.21version>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubboartifactId>
<version>${dubbo.version}version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-frameworkartifactId>
<version>${zookeeper.version}version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-recipesartifactId>
<version>${zookeeper.version}version>
dependency>
dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.mavengroupId>
<artifactId>tomcat7-maven-pluginartifactId>
<version>2.1version>
<configuration>
<port>8000port>
<path>/path>
configuration>
plugin>
plugins>
build>
#将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
log4j.rootLogger=DEBUG,console,file
#控制台输出的相关设置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%c]-%m%n
#文件输出的相关设置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File=./log/logFile.log
log4j.appender.file.MaxFileSize=10mb
log4j.appender.file.Threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%p][%d{yy-MM-dd}][%c]%m%n
#日志输出级别
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
服务提供者:dubbo-service
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo-service"/>
<dubbo:registry address="zookeeper://192.168.23.129:2181"/>
<dubbo:annotation package="top.hellocode.service"/>
beans>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<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>
基本和Spring类似,Spring是将对应的bean加入到IOC容器中,而dubbo是将对应的方法(服务)加入到远程服务中,称为服务提供者
注解都是Service,但是要注意对应的包
服务消费者:dubbo-web
@Reference:远程注入注解(可以类比本地注入@Autowired理解)
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://dubbo.apache.org/schema/dubbo
http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="top.hellocode.controller"/>
<dubbo:application name="dubbo-web">
<dubbo:parameter key="qos.port" value="33333"/>
dubbo:application>
<dubbo:registry address="zookeeper://192.168.23.129:2181"/>
<dubbo:annotation package="top.hellocode.controller"/>
beans>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>DispatcherServletservlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
<init-param>
<param-name>contextConfigLocationparam-name>
<param-value>classpath*:Spring-MVC.xmlparam-value>
init-param>
servlet>
<servlet-mapping>
<servlet-name>DispatcherServletservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
web-app>
注意
安装
安装nodejs
下载dubbo-admin:https://github.com/apache/dubbo-admin,并解压
修改配置文件
进入dubbo-admin-develop\dubbo-admin-server\src\main\resources目录,找到application.properties配置文件,进行修改

admin.registry.address 注册中心
admin.config-center 配置中心
admin.metadata-report.address 元数据中心
打包项目
在dubbo-admin-develop目录调出cmd窗口执行命令mvn clean package
启动后端
dubbo-admin-develop\dubbo-admin-distribution\targetjava -jar .\dubbo-admin-0.4.0.jar启动dubbo-admin对应的jar文件前台后端
dubbo-admin-develop\dubbo-admin-uinmp run dev访问
http://localhost:8081第一次打开dubbo-admin时查看里面的元数据信息是空的
需要打开生产者配置文件加入下面配置
重新启动生产者,再次打开dubbo-admin,这样元数据信息就出来了
两个机器传输数据,如何传输Java对象?

消费者调用生产者提供的服务,返回数据为Java对象时,将会通过序列化,以流的形式将对应的Java对象传递给消费者
补充:对应的Java类要想被序列化,需要实现Serializable接口
序列化和反序列化的过程还是比较麻烦的,不过dubbo内部已经将序列化和反序列化的过程内部封装了。我们只需要在定义pojo类的时候实现Serializable接口即可
实现Serializable接口之后,需要传输对象时,只需要在生产者对应服务(方法)中return即可(具体序列化与反序列化过程dubbo框架内部封装了)
注册中心挂了,服务是否可以正常访问?
也就是说,如果zookeeper因为意外故障导致服务停止的话,也不会影响旧功能的运行,对应的服务提供者地址都是有缓存的,如果不变更或新增,都不会影响使用
超时

timeout属性是在
@Reference或者@Service中使用的,推荐在服务提供方使用(@Service)
重试

@Service(timeout = 3000, retries = 2) 当前服务3秒超时,重试2次,一共三次



在指定相应的生产者的版本之后,在消费者的
@Reference远程注入注解中同样使用version进行版本选择

dubbo一共提供四种负载均衡的策略



权重在服务提供者,
@Service注解中,有一个weight属性,可对权重进行设置
@Reference)注解中,通过loadbalance属性进行指定


集群容错模式
• Failover Cluster:失败重试。默认值。当出现失败,重试其它服务器 ,默认重试2次,使用 retries 配置。一般用于读操作
• Failfast Cluster :快速失败,只发起一次调用,失败立即报错。通常用于写操作。
• Failsafe Cluster :失败安全,出现异常时,直接忽略。返回一个空结果。
• Failback Cluster :失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
• Forking Cluster :并行调用多个服务器,只要一个成功即返回。
• Broadcast Cluster :广播调用所有提供者,逐个调用,任意一台报错则报错。
对应的集群容错策略是在服务消费者远程注入处声明,即
@Reference注解处对应的策略字符串常量查询方式和负载均衡类似,查询Cluster接口对应的实现类



服务降级方式
mock=force:return null表示消费方对该服务的方法调用都直接返回null值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响mock=fail:return null表示消费方对该服务的方法调用在失败后,再返回null值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响使用时需要在消费者远程注入的注解处声明降级方式(
@Reference)
