前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >austin升级为SpringCloud架构!

austin升级为SpringCloud架构!

作者头像
Java3y
发布于 2024-06-14 12:14:07
发布于 2024-06-14 12:14:07
16700
代码可运行
举报
文章被收录于专栏:Java3yJava3y
运行总次数:0
代码可运行

之前有很多同学都问过,austin是不是一个分布式系统。我当时是这样回答的:

可以明确地告诉大家,austin并不是「分布式」「微服务」的项目。目前到此为止,它核心就只有一个发送的接口,而且只能通过HTTP的方式去调用。

那他能做成一个「分布式」项目吗?答案也是可以的,只要把「服务治理」相关的组件引入就可以问题了。

现在是项目是分开module模块的,austin-web(管理后台)/austin-cron(定时任务)/austin-apiaustin-api-impl(接入层)/austin-handler(下发逻辑处理层)这几个都可以单独抽出来部署。

(实际上在生产环境里,也是这么干的)

单独部署了以后,再通过「服务治理」的组件进行管理,那系统就是「分布式」的架构了。听着听不难,对不对?实际上也确实不难。

既然如此,为什么我一直都没去变动我的系统呢?最核心的点在于:我认为以我这类系统来说,功能的完整性比「分布式」这种架构模式更加重要。

最近有空了,我打算把austin整成是分布式的系统,说干就干

现在市面上用Spring Cloud Alibaba 是比较多了,所以我打算在austin上也使用它作为服务治理的鸡架。

SpringCloud版本选择

JDK和SpringBoot的版本决定着Spring Cloud Alibaba使用什么版本:

  • 2023.x 分支对应的是 Spring Cloud 2023 与 Spring Boot 3.2.x,最低支持 JDK 17。
  • 2022.x 分支对应的是 Spring Cloud 2022 与 Spring Boot 3.0.x,最低支持 JDK 17。
  • 2021.x 分支对应的是 Spring Cloud 2021 与 Spring Boot 2.6.x,最低支持 JDK 1.8

由于austin在构建的时候,使用的是JDK 1.8SpringBoot 2.5.6。本着以最低的成本升级,我决定使用2021.x版本,并把SpringBoot升级到2.6.13版本

升级SpringBoot版本遇到的问题1

如果现在有个A对象,它的属性是B对象,而B对象的属性也是A对象。说白了就是A依赖B,而B又依赖A,这就叫做循环依赖。

Spring 2.6.x 之后,无论什么形式的循环依赖默认都是禁止的,需要手动在配置文件开启:spring.main.allow-circular-references=true

升级SpringBoot版本遇到的问题2

swagger是文档工具,在SpringBoot使用时,一般我们会添加以下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

<dependency>
    <groupId>io.springfox</groupId>
    <artifactId>springfox-boot-starter</artifactId>
    <version>3.0.0</version>
</dependency>

但升级到SpringBoot 2.6.x时启动就会报错,很明显就是版本不兼容呗。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException
    .......

解决方案:

  1. 添加配置文件:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

spring.mvc.pathmatch.matching-strategy=ANT_PATH_MATCHER

  1. 添加代码配置:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

    @Bean
    public static BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
        return new BeanPostProcessor() {

            @Override
            public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
                if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
                    customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
                }
                return bean;
            }

            private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
                List<T> copy = mappings.stream()
                        .filter(mapping -> mapping.getPatternParser() == null)
                        .collect(Collectors.toList());
                mappings.clear();
                mappings.addAll(copy);
            }

            @SuppressWarnings("unchecked")
            private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
                try {
                    Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
                    field.setAccessible(true);
                    return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
                } catch (IllegalArgumentException | IllegalAccessException e) {
                    throw new IllegalStateException(e);
                }
            }
        };
    }

分布式架构后,路径配置扫描问题

austin之前只有一个入口类,在模块austin-web包下,路径为:com.java3y.austin.AustinApplication

不少人很好奇,为什么austin-support下config中@Value注解如何拿到austin-web下yml中的值?没有看到开启MapperScanner也能生成代理类?

原因很简单,启动类是在com.java3y.austin这个路径下的,其他的模板都是基于com.java3y.austin.*之上的。

SpringBoot在启动时,如果没有指定,默认会把当前启动类的路径当做扫描路径,所以其他的模块的对象&配置都能注入。

当升级为分布式时,则需要指定对应的路径扫描对应的包

将服务注册到注册中心

austin-service-api-impl模块为例,在原来的基础上,注册服务大致有以下步骤:

1、 增加 spring-cloud-starter-alibaba-nacos-discoveryspring-boot-starter-web 的maven依赖

2、 增加 spring-boot-maven-plugin 打包plugin

3、 增加 单独的 Application 启动类

4、 暴露接口,注册服务

服务启动后,就可以在nacos上看到应用被注册到注册中心上了。

消费服务

austin-web模块为例,在原来的基础上,消费服务大致有以下步骤:

1、 增加 spring-cloud-starter-alibaba-nacos-discoveryspring-cloud-starter-openfeignspring-cloud-starter-loadbalancer的maven依赖

2、 增加 FeignClient的配置信息

3、 使用 FeignClient代理类去调用服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

/**
 * @author 3y
 * austin-service-impl模块的接口
 */
@FeignClient(name = "austin-service")
public interface AustinServiceRpc {
    @RequestMapping(value = "/send")
    SendResponse send(@RequestBody SendRequest sendRequest);

    @RequestMapping(value = "/batchSend")
    SendResponse batchSend(@RequestBody BatchSendRequest batchSendRequest);

    @RequestMapping(value = "/recall")
    SendResponse recall(@RequestBody SendRequest sendRequest);

    @RequestMapping(value = "/traceByMessageId")
    TraceResponse traceByMessageId(@RequestBody String messageId);
}

后续

项目还在改造中,主要就是每一个都要单独拆开来。后续有应该会把austin-support模块再拆细点,也会把本地的队列的代码给删掉(都分布式远程交互了,本地的队列代码就没有意义了)

暂时打算开源的仓库不动,可能重新开个新的仓库,就叫austin-cloud好了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java3y 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【WEB系列】高版本SpringBoot整合Swagger启动异常问题
前言: Spring Boot 2.6.x 版本引入依赖 springfox-boot-starter (Swagger 3.0) 后,启动项目会报错: Failed to start bean ‘ documentationPluginsBootstrapper ‘ ; nested exception… 异常信息: Error starting ApplicationContext. To display the conditions report re-run your application wit
框架师
2022/05/14
2.6K0
【WEB系列】高版本SpringBoot整合Swagger启动异常问题
【零开始搭建SpringCloud Alibaba】搭建nacos应用端
前面介绍了搭建Nacos应用端(服务发现),这里是使用到Nacos作为分布式配置中心的功能所需要的nacos应用端。
RRT冻羊
2022/11/03
3300
【零开始搭建SpringCloud Alibaba】搭建nacos应用端
Spring全家桶之SpringCloud——高级阶段(上)
SpringCloud高级阶段上 (当前所在位置) 第一章 负载均衡Ribbon 第二章 声明式调用Feign 第三章 服务容错保护Hystrix
时间静止不是简史
2020/07/27
2.8K0
Spring全家桶之SpringCloud——高级阶段(上)
SpringCloud-Feign[入门案例]
  Feign是一种声明式、模板化的HTTP客户端(仅在 consumer 中使用)。
用户4919348
2019/06/14
2.3K0
SpringCloud-Feign[入门案例]
Java学习笔记—总所周知的微服务架构SpringCloud中Feign
Feign 是一个声明web服务客户端,这便得编写web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign.
慕容千语
2019/06/13
4670
升级 SpringBoot 2.6.x 版本后,Swagger 没法用了!
首先我们来聊聊SpringBoot的版本,目前最新版本是2.6.4版本,2.7.x即将发布,2.4.x及以下版本已经停止维护了,目前的主流版本应该是2.5.x和2.6.x。具体可以看下下面这张表。
macrozheng
2022/04/12
2.9K0
升级 SpringBoot 2.6.x 版本后,Swagger 没法用了!
Nacos注册中心有几种调用方式?
Spring Cloud Alibaba Nacos 作为近几年最热门的注册中心和配置中心,也被国内无数公司所使用,今天我们就来看下 Nacos 作为注册中心时,调用它的接口有几种方式?
磊哥
2023/10/30
3570
Nacos注册中心有几种调用方式?
SpringCloud02Nacos Discovery--服务治理
https://nacos.io/zh-cn/docs/concepts.html
天蝎座的程序媛
2022/11/28
3510
SpringCloud02Nacos Discovery--服务治理
Springcloud Alibaba + jdk17+nacos 项目实践
前文中已经分享了 springboot3.0 升级实践,在本文中将继续以此为基础介绍一个微服务的项目架构如何搭建以及一些新的知识点。技术的迭代日新月异,需要随时保持学习的心态和最新的技术知识储备。在本文中将以Springcloud Alibaba + jdk17 + Nacos2.x 为基础创建微服务项目,在这个创建和开发过程中会遇到新的问题,会总结一些开发的实践经验分享给大家。
闻说社
2024/10/17
1810
Springcloud Alibaba + jdk17+nacos 项目实践
微服务课程之SpringCloud 概述及微服务搭建
2,本章重点 微服务的概念,特点,优点,缺点 分布式框架(微服务)的演变过程 springcloud简介和特征 springcloud组件和体系架构 搭建父子项目,编写一个微服务 3,具体内容 3.1 微服务的概念 微服务(micro service),是一种架构风格,它将一个复杂的应用拆分成多个独立自治的服务,服务与服务间通过松耦合的形式交互。这些服务都可以单独的开发,测试,部署,运行;相互协作,更好完成原来大的业务系统的所有功能。 3.2 微服务的特点,优点和缺点 1)特点 解耦:服务做了拆分,相互影响会大大降低,符合软件设计的低耦合原则。 组件化:每个服务都相当于一个独立的组件,可以进行独立升级和扩展,可以被重复使用,节省人力成本。 业务能力强:职责明确,更专注于某一个业务 自治:一个微服务就是一个独立的实体,它可以独立部署、升级,服务与服务之间通过REST等形式的标准接口进行通信,并且一个微服务实例可以被替换成另一种实现,而对其它的微服务不产生影响。 敏捷性: 微服务可以敏捷开发(迭代)非常适合。 中国扶贫办->中国移动(华为,亚信)-> 精简版上线30天上线->每隔2-3周迭代一个新功能(修复旧版本的BUG),直到整个10个月全部完成 2)优点 易于开发和部署(单个项目) 启动快 局部更新,对整体影响很小 技术不受限制 按需求伸缩 devops(develop开发 operations运维) 促进开发,运维和测试(质检QA)的协作 DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。 它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。
用户9184480
2024/12/13
1450
微服务课程之SpringCloud 概述及微服务搭建
SpringCloud微服务架构升级实践
起源:微服务的概念源于 2014 年 3 月 Martin Fowler 所写的一篇文章“Microservices”。文中内容提到:微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。
宜信技术学院
2019/06/26
6870
SpringCloud微服务架构升级实践
sbc(五)Hystrix-服务容错与保护
其实产生某项需求的原因都是为了解决某个需求。当我们将应用进行分布式模块部署之后,各个模块之间通过远程调用的方式进行交互( RPC)。拿我们平时最常见的下单买商品来说,点击下单按钮的一瞬间可能会向发送的请求包含:
crossoverJie
2022/08/19
2310
sbc(五)Hystrix-服务容错与保护
ApiBoot Logging使用SpringCloud Openfeign透传链路信息
ApiBoot Logging可以无缝整合SpringCloud来采集请求日志,目前支持RestTemplate、Openfeign两种方式,我们本章来讲解下在使用Openfeign完成服务之间请求相互调用的一条链路请求日志是否可以都采集到。
恒宇少年
2019/11/11
5720
SpringCloud系列(五)| 集成OpenFeign实现服务间调用
前面的案例中我们已经搭建好了SpringCloud的基本架构。目前主要就是三个服务。一个Nacos服务,目前作为我们的注册中心,一个用户服务,一个订单服务。上个章节中,我们已经成功的将用户服务和订单服务注册到了Nacos中,并且模拟了多节点部署的情况下,Nacos对于服务实例的管理。
一缕82年的清风
2023/12/18
1.5K0
SpringCloud系列(五)| 集成OpenFeign实现服务间调用
SpringCloud的入门学习之概念理解、Hystrix断路器
1、分布式系统面临的问题,复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。
别先生
2019/12/02
4120
谁家面试往死里问 Swagger 啊?
说个挺奇葩的事,有个老铁给我发私信吐槽了一下它的面试经历,他去了个国企单位面试,然后面试官跟他就Swagger的问题聊了半个多小时。额~ 面试嘛这些都不稀奇,总能遇到是千奇百怪的人,千奇百怪的问题。不过,我分析这个面试官是不太好意思直接让他走,哈哈哈!
程序员小富
2023/08/31
4520
(三)SpringCloud OpenFegin使用指北
微服务设于基于RESTful架构,使用RESTful可以将愈发复杂单体应用通过HTTP请求、JSON传输数据拆分为不同的业务模块,达到服务独立部署、快速启动、模块协同开发、低耦合、代码复用、职责单一的目的,使团队间相对隔离的敏捷式开发。微服务的盛行首要解决的便是不同服务间调用的问题。
关忆北.
2021/12/07
3690
(三)SpringCloud OpenFegin使用指北
SpringCloud的入门学习之概念理解、Eureka入门
  答:微服务强调的是服务的大小,它关注的是某一个点,是具体解决某一个问题、提供落地对应服务的一个服务应用,狭意的看,可以看作Eclipse里面的一个个微服务工程/或者Module模块。
别先生
2019/11/26
4260
SpringCloud--Netflix入门
SpringCloud是一系列框架的集合,目的是将业务系统拆分成一个个微服务,服务于服务之间相互独立,支持水平扩展,高可用,微服务架构主要的功能有服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,Netflix虽然已经过时了,但是他框架集和其他微服务框架集作用差不多
aruba
2022/09/20
4930
SpringCloud--Netflix入门
使用Sentinel进行服务调用的熔断和限流管理(SpringCloud2023实战)
Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
codetrend
2024/06/21
5260
推荐阅读
相关推荐
【WEB系列】高版本SpringBoot整合Swagger启动异常问题
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文