JAVA—Spring—SpringCloud—一. 分布式系统

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 一个分布式系统由多个计算机(服务)共同组成.减轻了服务器的压力服务器架构演化历史(理解)

1.最开始的服务架构是一个应用整个放在一台服务器上


2.应用复杂之后,换为集群架构  一个应用放在多台服务器上 负载均衡


3.再复杂之后,把应用的核心业务(这个应用的功能)抽取出来做成一个个单独的应用部署在一台台服务器上,需要调用哪一块的功能就调用哪个应用,这个时候由于每个应用之间并不是在同一个服务器内,调用时就需要RPC;


RPC:远程过程调用


通信效率,序列化反序列化


RPC框架 Dubbo gRpc(goole) Thrift(Facebook) HSF(alibaba)


4.当随着抽取的核心应用越来越多,部署的服务器也越来越多,就需要有一个管理控制中心(DUBBO)来监控每个服务的使用量,进而控制服务器资源,避免资源浪费


二.Dubbo简介


作用:服务治理


分布式系统中多个服务之间需要由一个服务治理中心来管理所有的服务


官网: http://dubbo.apache.org/zh-cn/index.html


Dubbo官网上的设计架构



Provider

暴露服务的服务提供方

Consumer

调用远程服务的服务消费方

Registry

服务注册与发现的注册中心

Monitor

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

Container

服务运行容器


需要注意的是注册与发现服务是异步  调用过程是同步


三.使用


环境搭建:


注册中心:zookeeper


监控中心:dubbo_admin



测试项目


一个springboot项目中构建三个子模块:




api-1 模块:所有的服务模型,服务接口,服务异常存放


consumer-1 模块:服务消费者


provider-1 模块:服务提供者


1.搭建项目中遇到一些困难


1.springboot 子模块依赖父模块后无法获得父模块中引用的依赖


解决办法:


加入依赖即可


2.服务提供者启动报错


java.lang.NoClassDefFoundError: org/apache/curator/framework/CuratorFrameworkFactory


原因: 未引入连接zookeeper注册中心的客户端导致


引入curator即可


 

   org.apache.curator

   curator-recipes

   4.2.0


3.必须先启动服务提供者,在启动消费者否则会报错




这是因为dubbo 默认在消费者启动的时候检查是否由服务可用


可以通过配置 check=false 来修改启动时是否检查服务可用


duboo:

 consumer:

   check: false


2.dubbo配置


#服务名称

dubbo:

 application:

   name: dubbo-provider

#注册中心地址

 registry:

   address: 121.199.20.51:2181

#注册中心通信协议 支持dubbo, multicast, zookeeper, redis, consul(2.7.1), sofa(2.7.2),

#etcd(2.7.2), nacos(2.7.2)等协议

   protocol: zookeeper


#服务提供者协议

 protocol:

   name: dubbo

   port: 20880



#监控中心 如果配置protocal为registry 则表示从注册中心发现服务 否则需要配置监控中心地址直连监控中心

 monitor:

   protocol: registry


3.两个注解


@Reference


代替@Autowired 引入远程Bean


@Service(Dubbo包下)


暴露服务


注意:包不要引错


1.配置的加载优先级




命令行参数>外部化配置>程序中配置>dubbo.properties


2.消费者和服务提供者的配置优先级


  • 方法级优先,接口级次之,全局配置再次之。
  • 如果级别一样,则消费方优先,提供方次之。


3.retries 设置重试次数


dubbo:

 consumer:

   retries: 3


概念:


幂等:例如查询  无论重试多少次都不会影响数据的操作


非幂等:例如新增  重试多次会影响到数据的变化


4.多版本(灰度发布)


上述dubbo暴露接口和远程调用服务的两个注解


@Service和@Reference都有版本的概念


当服务提供者由多版本的时候可以使用此功能实现灰度发布


消费者调用时


@Reference(version = "1.0.0")


服务提供者暴露接口


@Service(version = "1.0.0")


如果指定消费者version = * 则随机调用服务提供者的服务\


5.dubbo 与 springboot 集成的三种方式


  1. 引入dubbo-spring-boot-starter,开启@EnableDubbo,在yml/properties中配置服务,并使用@Service,@Referenece暴露或调用远程服务
  2. 保留dubbo的xml配置文件,在springboot启动类上使用@ImportResource 引入dubbo的配置文件,同样使用@Service,@Referenece暴露或调用远程服务
  3. 使用@Bean的方式配置dubbo


6.dubbo的高可用


当dubbo的注册中心宕机之后,消费者和服务提供者之间依然可以通过本地缓存通讯,不会因为宕机影响到服务


7.直连dubbo


@Reference(url = "127.0.0.1:20880")


当dubbo宕机之后也可以使用@Refenence url属性直连服务提供者


8.负载均衡


Random LoadBalance 根据权重随机的调用服务


RoundRobin LoadBalance 轮询  循环调用服务


LeastActive LoadBalance 最少活跃数 每次调用相应最快的服务


ConsistentHash LoadBalance 一致性哈希 所有的相同请求交给一个服务处理


一致性Hash解析:


把所有的服务的ip地址进行hash计算,得到每个ip地址的hash值,然后映射到一个由0到最大正整数的hash环上,




当调用服务时,首先根据请求的参数计算路由规则(例如用户Id)的hash值,这个hash值落在上述hash环的某一个地方,然后由最近的ip服务处理


9.服务降级


当一台服务器上由多个服务时,在高并发服务器压力比较大的时候可以通过屏蔽某一个或多个不关键的服务,来缓解服务器压力从而保证核心业务不受影响,这就是服务降级


10.集群容错


当调用服务出错时,dubbo由多种容错机制:


使用cluster设置容错机制


@Reference(timeout = 1000,retries = 1,cluster = "failfast")


  1. Failover cluster
    失败重试:当失败时会重试,可以通过retries=2设置重试次数(不包含第一次连接)
    同等级别下消费者配置优先级是要高于服务提供者配置的
    这种容错机制适合用于幂等操作,可以重复操作
    Dubbo默认也是这种容错机制

@Service(retries = 3)

@Referene(retries = 1)

  1. Failfast cluster
    快速失败:只调用一次 不会重复连接
  2. Failsafe :安全失败  失败直接忽略,就是不会报错

  3. 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
    并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。可通过 forks="2" 来设置最大并行数。
    广播调用所有提供者,逐个调用,任意一台报错则报错 [2]。通常用于通知所有提供者更新缓存或日志等本地资源信息。

Failback Cluster

Forking Cluster

Broadcast Cluster


11.切换nacos注册中心


引入依赖


   com.alibaba

   dubbo-registry-nacos

   0.0.2


   com.alibaba.nacos

   nacos-client

   [0.6.1,)


修改配置文件连接注册中心地址和协议


dubbo:

 registry:

   address: 121.199.20.51:8848

   protocol: nacos


四.Dubbo原理


1.框架设计




  1. business 业务层,开发只需要关注这一层
  2. RPC层
  1. config Dubbo的配置信息层
  2. Proxy Dubbo创建为消费者和服务提供者创建代理层
  3. Registry 注册中心层 Dubbo的消费者和provier都需要注册到注册中心
  4. Cluster 负载均衡 这一层负责实现负载均衡
  5. Monitor 监控层
  6. Protocol 调用层 这一层真正意义上的远程调用方法
  1. Remoting 通信层 主要由Netty实现
  1. Exchange 数据交换
  2. Transport 传输数据
  3. Serialize 序列化层


2.源码分析


没理解

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
25天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
64 2
|
22天前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
12天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
28 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
12天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
46 5
|
13天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
23天前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
41 0
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
35 0
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
197 2
|
18天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
37 1
SpringBoot入门(7)- 配置热部署devtools工具
|
1月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
40 2
 SpringBoot入门(7)- 配置热部署devtools工具