咸鱼必备!如何用Spring Cloud 帮你偷懒?

本文深入解析SpringCloud作为微服务框架的优势,包括其在配置管理、服务治理、熔断机制等方面的强大功能,以及与SpringBoot和云端平台的集成。通过与RPC框架的对比,展示了SpringCloud在极速开发、分布式调用、线程池管理等方面的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

  • 要求快速开发迭代
  • 传统web框架对于多模块组合的“过时”
  • 避免重复造轮子,框架上的测试链调复杂性高 专注业务

概念定义

Alt pic

  • Spring Cloud是一个微服务框架,相比Dubbo等RPC框架, Spring Cloud提供的全套的分布式系统解决方案。
  • Spring Cloud对微服务基础框架Netflix的多个开源组件进行了封装,同时又实现了和云端平台以及和Spring
    Boot开发框架的集成。
  • Spring Cloud为微服务架构开发涉及的配置管理,服务治理,熔断机制,智能路由,微代理,控制总线,一次性token,全局一致性锁,leader选举,分布式session,集群状态管理等操作提供了一种简单的开发方式。
  • Spring Cloud 为开发者提供了快速构建分布式系统的工具,开发者可以快速的启动服务或构建应用、同时能够快速和云平台资源进行对接。

极速开发

调用其他系统麻烦??
Alt pic

完全不需要HTTP,管理重试和管理链接池

Alt pic
分布式调用自己微服务?不支持gson?

  • 和调用其他系统一致,只不过url改成master上的注册名,系统会自动根据名字做负载均衡,HA等
  • 关于序列化,所有的请求,在HTTP协议中的,都可以通过改header 来,application/json
    就是json,xml就是xml,如果还不满足,可以复写一个类,实现一个serialize方法,来反序列化其他系统的http响应

配置mybaits等插件?数据库自带管理工具

   List<Bean> beans = jdbcTemplate.queryForList("select tag from MUSIC_LOCK",Bean.class);

线程池搞不清,没经验??
Alt pic

完全抛弃原有复杂的线程、线程池管理,一个标签解决所有

Alt pic

全局配置还用ZK?开发成本高?
Alt pic

直接连接git地址加钩子,push后通知所有节点下载配置并进行热更,甚至不用代码开发。

多模块相互依赖日志难以追踪,甚至维持要花一个团队开发??
Alt pic

master上起个组件,一键追踪,比你想的更好。

还有更多…
TOBE CONTINUE!

代码概览

  • spring全家桶代码非常多这里只是抛砖
  • 异步接口
  • 从注解开始:@EnableAsync–》ProxyAsyncConfiguration类构造一个bean(类型:AsyncAnnotationBeanPostProcessor)
  • 从AsyncAnnotationBeanPostProcessor这个类的bean的生命周期走:AOP-Advisor切面初始化(setBeanFactory())–》AOP-生成代理类AopProxy(postProcessAfterInitialization())–》AOP-切点执行(InvocationHandler.invoke)
@Bean(name = TaskManagementConfigUtils.ASYNC_ANNOTATION_PROCESSOR_BEAN_NAME)
    @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
    public AsyncAnnotationBeanPostProcessor asyncAdvisor() {
        Assert.notNull(this.enableAsync, "@EnableAsync annotation metadata was not injected");
        AsyncAnnotationBeanPostProcessor bpp = new AsyncAnnotationBeanPostProcessor();//新建一个异步注解bean后处理器
        Class<? extends Annotation> customAsyncAnnotation = this.enableAsync.getClass("annotation");
        //如果@EnableAsync中用户自定义了annotation属性,即异步注解类型,那么设置           
       if (customAsyncAnnotation != AnnotationUtils.getDefaultValue(EnableAsync.class, "annotation")) {
            bpp.setAsyncAnnotationType(customAsyncAnnotation);
        }
        if (this.executor != null) {//Executor:设置线程任务执行器
            bpp.setExecutor(this.executor);
        }
        if (this.exceptionHandler != null) {//AsyncUncaughtExceptionHandler:设置异常处理器
            bpp.setExceptionHandler(this.exceptionHandler);
        }
        bpp.setProxyTargetClass(this.enableAsync.getBoolean("proxyTargetClass"));//设置是否升级到CGLIB子类代理,默认不开启
        bpp.setOrder(this.enableAsync.<Integer>getNumber("order"));//设置执行优先级,默认最后执行
        return bpp;
    }

}
  • Feign 负载均衡&断路器
 Server server = loadBalancerContext.getServerFromLoadBalancer(loadBalancerURI, loadBalancerKey);   
                    next.onNext(server);

交给 spring cloud ribbon 来做

关于ribbon:

  • ILoadBalancer:是负载均衡的入口类。
  • ServerList:存储远程服务所有可用节点
  • ServerListFilter:用于过滤非法的远程节点(如:不可用等)
  • IRule:负载算法(策略),用于从可用节点选择一个合适的节点。
  • RestClient:远程调用

策略:

  • 简单轮询负载均衡
  • 随机负载均衡
  • 加权响应时间负载均衡:根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低。
  • 区域感知轮询负载均衡:复合判断server所在区域的性能和server的可用性选择server

断路器

  • @FeignClient(name = “SERVICE-HELLOWORLD”, fallback =
    HelloWorldServiceFailure.class)
  • HelloWorldServiceFailure 实现短路策略

Spring Cloud的组件包

在这里插入图片描述

  • Spring Cloud
    Config:配置管理工具,支持使用Git存储配置内容,支持应用配置的外部化存储,支持客户端配置信息刷新、加解密配置内容等
  • Spring Cloud Bus:事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud
    Config联合实现热部署。
  • Spring Cloud
    Netflix:针对多种Netflix组件提供的开发工具包,其中包括Eureka、Hystrix、Zuul、Archaius等。
  • Netflix
    Eureka:一个基于rest服务的服务治理组件,包括服务注册中心、服务注册与服务发现机制的实现,实现了云端负载均衡和中间层服务器的故障转移。
  • Netflix Hystrix:容错管理工具,实现断路器模式,通过控制服务的节点,从而对延迟和故障提供更强大的容错能力。
  • Netflix Ribbon:客户端负载均衡的服务调用组件。
  • Netflix Feign:基于Ribbon和Hystrix的声明式服务调用组件。
  • Netflix Zuul:微服务网关,提供动态路由,访问过滤等服务。
  • Netflix
    Archaius:配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。
  • Spring Cloud for Cloud
    Foundry:通过Oauth2协议绑定服务到CloudFoundry,CloudFoundry是VMware推出的开源PaaS云平台。
  • Spring Cloud Sleuth:日志收集工具包,封装了Dapper,Zipkin和HTrace操作。
  • Spring Cloud Data Flow:大数据操作工具,通过命令行方式操作数据流。
  • Spring Cloud Security:安全工具包,为你的应用程序添加安全控制,主要是指OAuth2。
  • Spring Cloud Consul:封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成。
  • Spring Cloud Zookeeper:操作Zookeeper的工具包,用于使用zookeeper方式的服务注册和发现。
  • Spring Cloud Stream:数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。
  • Spring Cloud CLI:基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。

横向对比

一般的RPC框架我们就暂时用Doubb来代替,

  • 功能对比
    在这里插入图片描述
  • 性能对比
    在这里插入图片描述
  • 功能上,spring cloud的功能和 覆盖面要多的多,包括配置中心,日志追踪,负载均衡,容错路由等等
  • 性能上,RPC框架要好很多,但是我们的想做的是大数据平台 提交的异步任务,web访问性能并不是瓶颈
  • 可测试,RPC框架测试需要代码协助,HTTP 框架只要postman 就可以进行模块独立测试
  • 易用性:1行代码完成 负载均衡,分布式,这里展示下我们框架代码

Master:中心管理器,对应ZK

@SpringBootApplication
@EnableEurekaServer
public class SpringMasterApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringMasterApplication.class, args);
    }
}

Server:微服务提供者,对应RPC服务Producer

@Controller
public class EngineServerController {
    @RequestMapping(value = "/register",method=RequestMethod.POST)
    @ResponseBody
    public MessageBean registerJar(@RequestBody ComponentConfig componentConfig) {
        MessageBean messageBean = MessageBean.builder();
        return messageBean;
    }

Client:调用方,对应Consumers

@FeignClient(name= "goblin-engine")
    EngineServerTest engineServerTest;
    @RequestMapping("/say")
    public MessageBean hello(String name){
        LoggerUtil.info("");
       return engineServerTest.registerJar(new ComponentConfig());
    }

Spring 帮你包装了中间的Http 调用,包装了中间请求中心节点获取下游实际路径的过程,并且封装了Bean,上游consumer 直接以Bean的形式就能使用下游 Controller的 request ,中间总总完全不用操心。

选择的组件

  • Spring Cloud Config
  • Spring Cloud Netflix Eureka
  • Spring Cloud Netflix Feign
  • Spring Cloud Netflix Zuul
  • Spring Cloud Sleuth

作者:蒋文伟

看到这里的小伙伴,如果你喜欢这篇文章的话,别忘了 #转发、收藏、留言互动!

如果对文章有任何问题,欢迎在留言区和我交流~

最近我新整理了一些Java资料,包含面经分享、模拟试题、和视频干货,如果你需要的话,欢迎私信我!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值