SpringCloud原理分析 | 简介

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: SpringCloud原理分析 | 简介


分布式原理

分布式原理是指将一个大型系统分割成多个子系统,每个子系统都运行在不同的计算机上,这些计算机通过网络互相连接,协同完成系统的任务。分布式系统的设计目标是提高系统的可靠性、可扩展性和性能

  • 分布式计算:将大型问题分解成多个小问题,每个小问题由不同的计算机处理,最终将结果合并得到整个问题的解决方案
  • 分布式存储:将数据分散存储在不同的计算机上,通过网络协议进行访问,提高数据存储的可靠性和可扩展性
  • 分布式通信:通过网络协议实现不同计算机之间的通信,包括点对点通信和广播通信等方式,保证分布式系统的协同工作
  • 分布式算法:设计适合分布式系统的算法,包括分布式锁、分布式事务、分布式一致性等,保证分布式系统的正确性和可靠性
  • 分布式安全:保证分布式系统的安全性,包括身份认证、数据加密、访问控制

分布式系统的应用范围非常广泛,例如云计算、大数据处理、分布式数据库、分布式文件系统等

Dubbo

Dubbo是一款基于Java的高性能、轻量级的开源RPC框架,由阿里巴巴公司开发和维护。Dubbo提供了完整的RPC框架和服务治理方案,使得开发者可以轻松地实现远程服务调用和管理。

Dubbo的主要特点包括:

  • 高性能:Dubbo采用了NIO异步非阻塞IO和线程池机制,可以支持高并发和低延迟的RPC调用
  • 轻量级:Dubbo的核心只有几百KB,非常轻量级,可以快速部署和集成到应用中
  • 易扩展:Dubbo提供了完整的服务治理方案,包括服务注册、发现、负载均衡、容错、路由等,可以轻松地实现服务的扩展和管理
  • 多协议支持:Dubbo支持多种协议,包括Dubbo协议、HTTP协议、RESTful协议等,可以满足不同的应用场景
  • 多语言支持:Dubbo提供了多种语言的实现,包括Java、Python、Node.js等,可以满足不同语言的开发需求

Zookeeper

Zookeeper是一个开源的分布式协调服务,可以用于维护和管理分布式系统中的配置信息、命名服务、分布式锁和分布式队列等。它由Apache基金会开发和维护,是一个高性能、可靠、可扩展的分布式协调服务

  • 高可用性:Zookeeper采用了主从架构,可以实现自动故障转移,提高了系统的可用性
  • 高性能:Zookeeper采用了内存数据库和NIO技术,可以支持高并发和低延迟的操作
  • 可扩展性:Zookeeper可以通过集群方式进行横向扩展,可以支持大规模的分布式系统
  • 严格顺序性:Zookeeper提供了严格的顺序性保证,可以保证所有客户端看到的数据是一致的
  • 简单易用:Zookeeper提供了简单易用的API,可以方便地实现分布式系统中的协调和管理

RPC

RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。它允许程序调用远程计算机上的服务,就像调用本地服务一样;在RPC中,客户端应用程序通过发送一个称为“请求”的消息来调用远程服务器上的过程。服务器应用程序在接收到该请求后执行相应的过程,并将结果作为"响应"消息返回给客户端;RPC协议通常使用HTTP、TCP/IP等协议进行通信。常见的RPC框架有gRPC、Thrift、Dubbo

服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务

服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,选另一台调用

注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者

监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

Zookeeper安装使用

  • 启动服务

  • 启动服务端再启动客户端即可

Dubbo-admin安装使用

Dubbo-admin:监控平台,查看被注册的服务

Dubbo-admin下载地址

  • 项目目录下打包dubbo-admin
mvn clean package -Dmaven.test.skip=true
  • 执行打包出来的jar包
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
  • 浏览器访问:localhost:7001

Dubbo-Zookeeper集成SpringBoot

  • 创建spring框架:provider-service
  • 依赖导入
<dependencies>
        <!--Dubbo-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!--Zookeeper-->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- 引入zookeeper -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
        <!--新版的坑:zookeeper及其依赖包,解决日志冲突,还需要剔除日志依赖-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
            <!--排除这个slf4j-log4j12-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • application.properties
server.port=8001
# 服务应用名字
dubbo.application.name=provider-service
# 注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
# 注册服务
dubbo.scan.base-packages=com.wei.service
  • service/TicketService
package com.wei.service;
/**
 * @ClassName TicketService
 * @Description TODO
 * @Author wei_shuo
 * @Date 2023/6/2 14:45
 * @Version 1.0
 */
public interface TicketService {
    public String getTicket();
}
  • service/TicketServiceImpl
package com.wei.service;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
/**
 * @ClassName TicketServiceImpl
 * @Description TODO
 * @Author wei_shuo
 * @Date 2023/6/2 14:45
 * @Version 1.0
 */
@Component
@Service
public class TicketServiceImpl implements TicketService{
    @Override
    public String getTicket() {
        return "wei";
    }
}
  • 创建spring框架:consumer-service
  • 依赖导入
<dependencies>
        <!--Dubbo-->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!--Zookeeper-->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- 引入zookeeper -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
        <!--新版的坑:zookeeper及其依赖包,解决日志冲突,还需要剔除日志依赖-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
            <!--排除这个slf4j-log4j12-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • application.properties
server.port=8002
# 消费者暴露自己的名字
dubbo.application.name=consumer-service
# 注册中心的地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
  • service/TicketService
package com.wei.service;
/**
 * @ClassName TicketService
 * @Description TODO
 * @Author wei_shuo
 * @Date 2023/6/2 14:45
 * @Version 1.0
 */
public interface TicketService {
    public String getTicket();
}
  • service/UserService
package com.wei.service;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
/**
 * @ClassName UserService
 * @Description TODO
 * @Author wei_shuo
 * @Date 2023/6/2 14:46
 * @Version 1.0
 */
@Service
public class UserService {
    //注册中心获取服务
    @Reference
    TicketService ticketService;
    public void buyTicket() {
        String ticket = ticketService.getTicket();
        System.out.println("注册中心获取一张票" + ticket);       //注册中心获取一张票wei
    }
}
启动
  • 启动zkServer:Zookeeper
  • 启动Dubbo-admin
  • 运行provider-service
  • 浏览器访问:localhost:7001

  • 启动consumer-service

控制台输出:注册中心获取一张票wei


活动赞助

618,清华社 IT BOOK 多得图书活动开始啦!活动时间为 2023 年 6 月 7 日至 6 月 18 日,清华社为您精选多款高分好书,涵盖了 C++、Java、Python、前端、后端、数据库、算法与机器学习等多个 IT 开发领域,适合不同层次的读者。全场 5 折,扫码领券更有优惠哦!快来京东点击链接 IT BOOK 多得(或扫描京东二维码)查看详情吧!

京东链接

点击购买https://pro.m.jd.com/mall/active/3Rho97HkMaGFycLzAWfFdvZdyvRn/index.html

🌼 结语:创作不易,如果觉得博主的文章赏心悦目,还请——点赞👍收藏⭐️评论📝


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
1月前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
34 0
|
4天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
42 14
|
19天前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
43 14
|
20天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
64 5
|
26天前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
2月前
|
负载均衡 算法 Java
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
40岁老架构师尼恩分享了关于SpringCloud核心组件的底层原理,特别是针对蚂蚁集团面试中常见的面试题进行了详细解析。内容涵盖了Nacos注册中心的AP/CP模式、Distro和Raft分布式协议、Sentinel的高可用组件、负载均衡组件的实现原理等。尼恩强调了系统化学习的重要性,推荐了《尼恩Java面试宝典PDF》等资料,帮助读者更好地准备面试,提高技术实力,最终实现“offer自由”。更多技术资料和指导,可关注公众号【技术自由圈】获取。
蚂蚁面试:Nacos、Sentinel了解吗?Springcloud 核心底层原理,你知道多少?
|
2月前
|
Java Spring 容器
Spring底层原理大致脉络
Spring底层原理大致脉络
|
2月前
|
Java BI API
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
这篇文章介绍了如何在Spring Boot项目中整合iTextPDF库来导出PDF文件,包括写入大文本和HTML代码,并分析了几种常用的Java PDF导出工具。
593 0
spring boot 整合 itextpdf 导出 PDF,写入大文本,写入HTML代码,分析当下导出PDF的几个工具
|
2月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
144 9
|
2月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
223 2
下一篇
DataWorks