JAVA分布式篇3——Dubbo

JAVA分布式篇3——Dubbo

1、架构演变

1.1、单应用架构

  • 当网站流量很小时,只需要一个应用,将所有的功能部署到一起(所有业务都放在一个tomcat 里),从而减少部署节点和成本
  • 用于简化 增删改查 工作量的数据访问框架 (ORM)是关键
  • 例如:某个超市的收银系统,某个公司的员工管理系统

在这里插入图片描述

优点

  • 小项目开发快
  • 成本低
  • 架构简单
  • 易于测试
  • 易于部署

缺点

  • 大项目模块耦合严重
  • 不易开发,维护
  • 沟通成本高
  • 新增业务困难
  • 核心业务与边缘业务混合在一块,出现问题互相影响

1.2、垂直应用架构

  • 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成几个互不相干的几个应 用,以提高效率
  • 大模块按照mvc分层模式,进行拆分成多个互不相关的小模块,并且每个小模块都有独立的服务器
  • 用于加速前端页面开发的web框架(MVC)是关键;因为每个小应用都有独立的页面

在这里插入图片描述

缺点

  • 模块之间不可能完全没有交集,公用模块无法重复利用,开发性的浪费

1.3、分布式服务架构

  • 当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的业务,逐渐形成 稳健的服务中心,使前端应用能更快速的响应多变的市场需求
  • 此时,用户提高业务复用及整合的分布式服务框架(RPC)远程调用是关键

在这里插入图片描述

1.4、流动计算架构

  • 当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐呈现,此时需增加一个调度中心基于 访问压力实时管理集群容量,提高集群利用率
  • 此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键

在这里插入图片描述

2、Dubbo

  • Dubbo是分布式服务框架,是阿里巴巴的开源项目,现交给apache进行维护
  • Dubbo致力于提高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案

3、RPC

RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式

3.1、RPC通信原理

  • 在客户端将对象进行序列化
  • 底层通信框架使用netty(基于tcp协议的socket),将序列化的对象发给服务方提供方
  • 服务提供方通过socket得到数据文件之后,进行反序列化,获得要操作的对象
  • 对象数据操作完毕,将新的对象序列化,再通过服务提供方的socket返回给客户端
  • 客户端获得序列化数据,再反序列化,得到最新的数据对象,至此,完成一次请求

在这里插入图片描述

RPC的核心:通信、序列化

4、Dubbo角色介绍

节点角色说明
Provider服务的提供方
Consumer服务的消费方
Registry服务注册与发现的注册中心
Monitor监控服务的统计中心
Container服务运行容器

在这里插入图片描述

4.1、启动流程

  • 服务容器负责启动,加载,运行服务提供者
  • 服务提供者在启动时,向注册中心注册自己提供的服务
  • 服务消费者在启动时,向注册中心订阅自己所需的服务
  • 在注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给 消费者
  • 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
  • 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

5、Dubbo快速入门

5.1、dubbo监控

在正式开始dubbo前,我们先来处理dubbo监控问题

github https://github.com/apache/dubbo-admin

官网打不开可尝试下面地址

gitee https://codechina.csdn.net/mirrors/apache/dubbo-admin

百度云:https://pan.baidu.com/s/1_b6X3SkgTskLdal3HTtHmw提取码:exa0

进入dubbo-admin-master

如zookeeper与dubbo不在一台机器,需修改配置文件(dubbo-admin-master\dubbo-admin\src\main\resources\application.properties)

在这里插入图片描述

打开cmd,执行mvn package -Dmaven.skip.test=true,时间会有点久,出现下图表成功

在这里插入图片描述

进入dubbo-admin-master\dubbo-admin\target,拷贝jar包到服务器,后台启动jar包

[root@VM-8-13-centos bin]# cd /root
[root@VM-8-13-centos ~]# ls
dubbo-admin-0.0.1-SNAPSHOT.jar
[root@VM-8-13-centos ~]# nohup java -jar dubbo-admin-0.0.1-SNAPSHOT.jar > dubbo-admin.log  2>&1 &
[1] 32315
[root@VM-8-13-centos ~]# netstat -tunlp|grep 7001
tcp6       0      0 :::7001                 :::*                    LISTEN      32315/java

访问监控页面

http://81.70.1.65:7001/

默认账号密码都为root

在这里插入图片描述

到此监控页面配置完成

下面介绍linux结束进程

首先查看端口pid

[root@VM-8-13-centos ~]# netstat -tunlp|grep 7001
tcp6       0      0 :::7001                 :::*                    LISTEN      32315/java

杀死进程

[root@VM-8-13-centos ~]# kill -9 32315

5.2、创建maven项目导入依赖

5.2.1、服务方

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"id="WebApp_ID" version="3.1"><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContent.xml</param-value></context-param>
</web-app>

log4j.properties

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/zk.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

applicationContext.xml

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!--应用别名--><dubbo:application name="winkto-dubbo-provider"/><!--注册中心地址--><dubbo:registry address="zookeeper://81.70.1.65:2181" timeout="30000"/><!--服务--><dubbo:annotation package="cn.winkto.service" />
</beans>

服务

public interface RuoyeService {public String sayBye(String name);
}
@DubboService
public class RuoyeServiceImpl implements RuoyeService {public String sayBye(String name) {System.out.println(name);return name+" bye";}
}

5.2.2、消费方

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><!--注册DispatcherServlet--><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-config.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><!--/ 匹配所有的请求;(不包括.jsp)--><!--/* 匹配所有的请求;(包括.jsp)--><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
</web-app>

log4j.properties

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/zk.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

springmvc-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<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:mvc="http://www.springframework.org/schema/mvc"xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://dubbo.apache.org/schema/dubbohttp://dubbo.apache.org/schema/dubbo/dubbo.xsd"><!--Dubbo的应用名称,通常使用项目名 --><dubbo:application name="dubbo-consumer" /><!--配置Dubbo的注册中心地址 --><dubbo:registry address="zookeeper://81.70.1.65:2181" timeout="30000" /><dubbo:annotation package="cn.winkto.controller" /><!-- 自动扫描包,让指定包下的注解生效,由IOC容器统一管理 --><context:component-scan base-package="cn.winkto.controller"/><!-- 让Spring MVC不处理静态资源 --><mvc:default-servlet-handler /><!--处理器映射器和处理器适配器,以及功能增强--><mvc:annotation-driven /></beans>

伪服务接口

public interface RuoyeService {public String sayBye(String name);
}

controller

@RestController
public class YoyaController {@DubboReferenceprivate RuoyeService ruoyeService;@RequestMapping("/bye/{name}")public String bye(@PathVariable String name){System.out.println(name);return ruoyeService.sayBye(name);}
}

测试

http://localhost:8082/dubbo_consumer_war_exploded/bye/yoya

6、配置详解

6.1、启动检查

启动时会在注册中心检查依赖的服务是否可用,不可用时会抛出异常

<!--默认是true:抛异常;false:不抛异常-->
<dubbo:consumer check="false" />

6.2、超时时间

由于网络或服务端不可靠,会导致调用过程中出现不确定的阻塞状态(超时) 为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间

<!--设置超时时间为2秒,默认为1秒-->
<dubbo:provider timeout="2000"/>

dubbo推荐在Provider上尽量多配置Consumer端属性

  • 作服务的提供者,比服务使用方更清楚服务性能参数,如调用的超时时间,合理的重试 次数,等等
  • 在Provider配置后,Consumer不配置则会使用Provider的配置值,即Provider配置可 以作消费者的缺省值

6.3、重试次数

当出现失败,自动切换并重试其它服务器,dubbo重试的缺省值是2次,我们可以自行设置(在提供方设置)

<dubbo:provider timeout="2000" retries="3"/>

并不是所有的方法都适合设置重试次数

  • 幂等方法:适合(当参数一样,无论执行多少次,结果是一样的,例如:查询,修改)
  • 非幂等方法:不适合(当参数一样,执行结果不一样,例如:删除,添加)

配置重试次数

<dubbo:reference id="ruoyeService" interface="cn.winkto.service.RuoyeService"><dubbo:method name="bye" retries="1"/>
</dubbo:reference>

6.4、多版本配置

提供者

@DubboService
public class RuoyeServiceImpl1 implements RuoyeService {public String sayBye(String name) {System.out.println(name);return name+" bye";}
}
@DubboService
public class RuoyeServiceImpl2 implements RuoyeService {public String sayBye(String name) {System.out.println(name);return name+" byebye~";}
}
<dubbo:service interface="cn.winkto.service.RuoyeService" class="cn.winkto.service.RuoyeServiceImpl1" version="1.0.0"/>
<dubbo:service interface="cn.winkto.service.RuoyeService" class="cn.winkto.service.RuoyeServiceImpl2" version="2.0.0"/>

消费者

<dubbo:reference id="ruoyeService" interface="cn.winkto.service.RuoyeService" version="2.0.0"><dubbo:method name="bye" retries="1"/>
</dubbo:reference>
@RestController
public class YoyaController {@DubboReference(version = "2.0.0")private RuoyeService ruoyeService;@RequestMapping("/bye/{name}")public String bye(@PathVariable String name){System.out.println(name);return ruoyeService.sayBye(name);}
}

消费者的控制层要改为自动注入

当消费者的版本修改为 version="*",那么就会随机调用服务提供者的版本

6.5、本地存根

先在消费者处理一些业务逻辑,再调用提供者的过程,就是“本地存根”

在消费者,创建一个接口实现类,注意:必须使用构造方法的方式注入

@Service
public class RuoyeServiceImpl implements RuoyeService {private RuoyeService ruoyeService;public RuoyeServiceImpl(RuoyeService ruoyeService) {this.ruoyeService = ruoyeService;}public String sayBye(String name) {if (!name.equals("zhangsan"))return ruoyeService.sayBye(name);return "名称不正确哦";}
}
@RestController
public class YoyaController {@DubboReference(version = "2.0.0",stub = "cn.winkto.service.RuoyeServiceImpl")private RuoyeService ruoyeService;@RequestMapping("/bye/{name}")public String bye(@PathVariable String name){System.out.println(name);return ruoyeService.sayBye(name);}
}

6.6、负载均衡策略

  • 负载均衡(Load Balance), 其实就是将请求分摊到多个操作单元上进行执行,从而共同完成工作 任务
  • dubbo一共提供4种策略,缺省为 random 随机分配调用

在这里插入图片描述

6.7、高可用

zookeeper注册中心宕机,还可以消费dubbo暴露的服务

  • 监控中心宕掉不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

6.8、 服务降级

服务降级,就是根据实际的情况和流量,对一些服务有策略的停止或换种简单的方式处理,从而释 放服务器的资源来保证核心业务的正常运行

  • 在 管理控制台配置服务降级:屏蔽和容错
    • 屏蔽:mock=force:return+null 表示消费方对该服务的方法调用都 直接返回 null 值,不发起远程 调用。用来屏蔽不重要服务不可用时对调用方的影响
    • 容错:mock=fail:return+null 表示消费方对该服务的方法调用在 失败后,再返回 null 值,不抛异 常。用来容忍不重要服务不稳定时对调用方的影响

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/557444.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

淮北市成人学计算机学校,安徽淮北市成人学电脑?

安徽淮北市成人学电脑&#xff1f;-"零基础"入学,签订就业协议,保证就业薪资,先就业后付款让你学习无忧就业无忧!成人学电脑 安徽成人学电脑 淮北市成人学电脑学电脑找高薪就业it专业就选择VR环境艺术创意设计师&#xff1a;专业优势&#xff0c;装饰行业需要人才时代…

Java分布式篇4——Redis

Java分布式篇4——Redis 1、互联网架构的演变历程 1.1、第一阶段 数据访问量不大&#xff0c;简单的架构即可搞定&#xff01; 1.2、第二阶段 数据访问量大&#xff0c;使用缓存技术来缓解数据库的压力不同的业务访问不同的数据库 1.3、第三阶段 主从读写分离。 之前的缓存…

计算机win7无法安装,新机装不了Win7?照这个方法5分钟搞定!

昨天有小伙伴在评论留言7代酷睿装不了Win7&#xff0c;评论回复有字数限制&#xff0c;小编今天就着重针对100/200系列主板安装Win7给大家推送一个教程&#xff0c;包括USB 3.0驱动和NVME驱动全部搞定&#xff0c;装Win7没有那难&#xff01;首先&#xff0c;下载Win7的原版镜像…

Java分布式篇5——FastDFS

Java分布式篇5——FastDFS 分布式文件系统 1、主流的分布式文件系统 1.1、 HDFS (Hadoop Distributed File System)Hadoop 分布式文件系统 高容错的系统&#xff0c;适合部署到廉价的机器上能提供高吞吐量的数据访问&#xff0c;非常适合大规模数据应用HDFS采用主从结构&a…

如何导出计算机硬盘重数据,硬盘对拷教程,100%保存原硬盘数据

硬盘对拷是老生常谈的问题&#xff0c;网上教程一搜一大把&#xff0c;这里也不是我原创了&#xff0c;就拷贝中关村的一篇写的比较详细的&#xff0c;普及下小白吧&#xff01;●Ghost硬盘对拷优点&#xff1a;全盘完全100%对拷&#xff0c;包括原有操作系统也可使用。新硬盘对…

计算机微格教学心得体会,微格教学心得体会6篇_微格教学体会报告

微格教学的英文为Microteaching&#xff0c;在我国被译为"微型教学"、"微观教学"、"小型教学"等&#xff0c;目前国内用得较多的是"微格教学"。微格教学是一种利用现代化教学技术手段来培训师范生和在职教师教学技能的系统方法。下面是…

Java分布式篇6——RabbitMQ

Java分布式篇6——RabbitMQ 1、MQ&#xff08;Message Queue&#xff09;消息队列 消息队列中间件&#xff0c;是分布式系统中的重要组件主要解决&#xff0c;异步处理&#xff0c;应用解耦&#xff0c;流量削峰等问题实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一…

windows7计算机启动修复怎么办,Win7电脑开机提示启动修复无法进入系统怎么办?...

近日一位Win7系统用户向我们反映&#xff0c;他的电脑在开机的过程中出现了启动修复的提示&#xff0c;导致无法正常进入系统&#xff0c;对于该问题应该如何解决呢&#xff1f;其实这个问题是很多Win7用户都碰到过的&#xff0c;因此本文就给大家介绍三种有效的解决方法。启动…

哈维玛德学院 计算机,哈维玛德学院优势多多,令人神往!

哈维心情学院是美国首批文学和艺术学院之一&#xff0c;位于加利福尼亚州克莱蒙特&#xff0c;成立于1955年12月&#xff0c;是一所私立科学、工程和数学精英学院。哈维心情学院是美国最优秀的大学之一。哈维心情学院在美国大学中排名第14位&#xff0c;具有卓越的学术声誉。这…

Java微服务篇1——SpringBoot

Java微服务篇1——SpringBoot 1、什么是springboot 1.1、Spring出现的问题 Spring是Java企业版&#xff08;Java Enterprise Edition&#xff0c;JEE&#xff0c;也称J2EE&#xff09;的轻量级代替品。无需开发重量级的 Enterprise Java Bean&#xff08;EJB&#xff09;&am…

计算机网络技术双机互联,快速实现双机互联的几种方案

文/大锋寝室里电脑越来越多&#xff0c;平时拷贝软件还得用软盘&#xff0c;况且软盘只有1.44MB&#xff0c;实在不够用&#xff0c;建网的想法也由此而来。当然此方案同样适用于家庭及其他区域内部计算机的互联。直接电缆连接对于双机通信&#xff0c;可以考虑使用并行或串行电…

Java微服务篇2——SpringCloud

Java微服务篇2——SpringCloud 1、微服务架构 1.1、单体应用架构 的⽤户量、数据量规模都⽐较⼩&#xff0c;项目所有的功能模块都放在一个工程中编码、 编译、打包并且部署在一个Tomcat容器中的架构模式就是单体应用架构&#xff0c;这样的架构既简单实 ⽤、便于维护&#…

ajax解析json中的对象数组对象,在JQuery中检索json数组后获取json对象Ajax

我使用JQuery AJAX检索某些数据(标题和说明)。正如你可以看到我打通的结果&#xff0c;并出结果的JSON数组和循环div标签中在JQuery中检索json数组后获取json对象Ajaxsuccess : function(jsonArray){$.each(jsonArray,function(messageIndex,jsonObject){$("#results"…

Java微服务篇3——Lucene

Java微服务篇3——Lucene 1、数据分类 1.1、结构化数据 具有固定格式或有限长度的数据&#xff0c;如数据库&#xff0c;元数据等 常见的结构化数据也就是数据库中的数据&#xff0c;在数据库中搜索很容易实现&#xff0c;通常都是使用 sql语句进行查询&#xff0c;而且能很…

服务器中所有文件夹变只读,我的电脑里全部文件夹属性都变成只读了改也改不过来...

第一个方法&#xff1a;你用管理员身份进入电脑然后更改一下文件夹的属性.隐藏文件看不到可以通过下面的方法显示出来:在文件夹选项里去掉‘隐藏受保护的文件和文件夹’前面的勾选--应用--确定 试试能否显示出你所需要的文件如果还不能显示&#xff0c;那么应该是注册表的问题&…

Java微服务篇4——Elastic search

Java微服务篇4——Elastic search 1、Elastic search安装配置 Elastic search官方&#xff1a;https://www.elastic.co/cn/products/elasticsearch Elastic search6.2.4 百度云&#xff1a;https://pan.baidu.com/s/1JyQok8Nija4gYhcjh-HWcw提取码&#xff1a;isa2 解压即可…

ftp文件服务器杀毒,FTP远程查杀网页木马方法

感谢使用护卫神云查杀系统&#xff0c;该软件专门查杀网页木马&#xff0c;完全免费&#xff0c;欢迎大家使用。远程FTP查杀部分&#xff1a;1、点击【远程查杀】图标&#xff0c;如上图所示&#xff0c;进入远程FTP查杀页面&#xff1a;1、首先要求输入远程FTP连接信息&#x…

Java微服务篇5——Docker

Java微服务篇5——Docker 1、虚拟化技术 虚拟化技术是一种计算机资源管理技术&#xff0c;是将计算机的各种实体资源&#xff0c;如服务器、网络、内存及存储 等&#xff0c;予以抽象、转换后呈现出来。虚拟化技术打破了计算机实体结构间的&#xff0c;不可切割的障碍。使用户…

文件服务器 说明,文件服务器搭建说明.pdf

文件共享服务器搭建 责任人 姜 源 起讫时间 2010 11 15 至 2010 12 19 编号 JY001 0 目录目录 一 确定实现方案 1 二 方案实现方法 4 三 参考资料 12 1 文件服务器搭建说明与经验总结文件服务器搭建说明与经验总结 一 一 确定实现方案确定实现方案 方案方案 A Windows Server E…

Shiro 实战教程

Shiro 实战教程 1.权限的管理 1.1 什么是权限管理 ​ 基本上涉及到用户参与的系统都要进行权限管理&#xff0c;权限管理属于系统安全的范畴&#xff0c;权限管理实现对用户访问系统的控制&#xff0c;按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源…