【微服务项目】Spring Cloud Alibaba 实战

news2024/11/15 15:28:58

Spring Cloud Alibaba 实战

一、目标

  • 理解什么是微服务架构
  • 理解什么是springcloud及spring cloud alibaba和springcloud的关系
  • 掌握使用springcloud alibaba 实现微服务远程调用
  • 掌握使用springcloud alibaba 实现服务注册与发现
  • 掌握使用springcloud alibaba 实现基本的服务配置

二、微服务架构

2.1 架构的演变

(1)单一应用架构

当网站流量很小时,只需要一个应用,所有功能部署在一起,减少部署节点成本的框架称之为集中式框架。此时,用于简化增删改查工作量的数据访问框架(ORM)是影响项目开发的关键。

(2)垂直应用架构

当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

(3)分布式服务架构

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

(4)面向服务(SOA)架构

典型代表有两个:流动计算架构和微服务架构;

流动计算架构:

当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。流动计算架构的最佳实践阿里的Dubbo。

微服务架构

与流动计算架构很相似,除了具备流动计算架构优势外,微服务架构中的微服务可以独立部署,独立发展。且微服务的开发不会限制于任何技术栈。微服务架构的最佳实践是SpringCloud及Spring Cloud Alibaba

2.2 微服务架构

​ 微服务架构(MicroserviceArchitect)是一种架构模式,它提倡将单块架构的应用划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境(测试环境)等.

相比传统SOA的服务实现方式,微服务更具有灵活性、可实施性以及可扩展性,其强调的是一种独立测试、独立部署、独立运行的软件架构模式。

即便了解了上面的介绍,也很难对微服务下一个准确的定义。实际上,从业界的讨论来看,微服务本身并没有一个严格的定义,ThoughtWorks首席科学家马丁福勒对微服务进行的一段描述:

​ 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的进程中,服务与服务间采用轻量级的通信机制互相沟通(通常是基于HTTP协议的RESTful API)。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外,应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据业务上下文,选择合适的语言、工具对其进行构建。

微服务架构特点总结:

小, 且专注于做一件事情;
独立的进程中;
轻量级的通信机制;
松耦合、独立部署;

简单理解:

将原本所有的功能放到一个应用中的系统,根据功能模块 进行合理的拆分 拆分成独立的 可运行和部署的子系统;子系统之间通过轻量级协议进行通信(http),我们将这种架构称为微服务架构。

三、Spring Cloud Alibaba

3.1 Spring cloud

微服务架构也会带来一些问题需要我们去解决,例如:

服务通信用什么解决?
服务管理用什么解决?
服务越来越多,配置文件越来越多该如何统一管理?
...

以上都可以通过一些现有的技术框架来解决,但是这些技术框架需要整合在一块相对对开发人员的技术要求较高,另外也有些兼容性问题需要解决。相对比较麻烦。所以如果有一个框架 能解决上边的问题,并且隐藏掉技术细节,框架极好的集成和兼容就再好不过了,所以技术框架下就有了spring cloud 和spring cloud alibaba.

以下摘自百度百科:

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包.

简单理解总结一句话:

spring cloud 是基于springboot的开发工具包,是将流行的成熟的框架整合到一块。目的:就是简化配置,提供一套简单易用的工具用于快速开发分布式系统(微服务),提高开发效率。

3.2 Spring cloud alibaba

​ 同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md

提供的功能和组件包括如下:

Spring Cloud 和Spring Cloud Alibaba的关系:可以简单理解成 集团和子公司的关系。

3.3 使用版本注意

spring cloud的版本说明

SpringCloud是一系列框架组合,为了避免与框架版本产生混淆,采用新的版本命名方式,形式为大版本名+子版本名称
  大版本名用伦敦地铁站名
  子版本名称三种
    SNAPSHOT:快照版本,尝鲜版,随时可能修改
    M版本,MileStone,M1表示第一个里程碑版本,一般同时标注PRE,表示预览版
    SR,Service Release,SR1表示第一个正式版本,同时标注GA(Generally Available),稳定版

另外:
    最新版本已经更新了不再以地铁名为依据,并移除掉了一些组件例如:spring cloud netflex 中的一些组件
新的命名方式说明大家可以看下官方说明:

https://spring.io/blog/2020/04/17/spring-cloud-2020-0-0-m1-released

spring cloud alibaba使用的时候版本说明

重要:鉴于SpringBoot与SpringCloud关系,SpringBoot建议采用2.2.x版本或者2.3.x,这里我们采用的版本为:

Hoxton SR9
spring boot 2.3.8

四、微服务远程调用

4.1 应用场景

以上就是有个应用场景例如:订单微服务 需要获取到商品信息,则需要订单微服务 远程调用 商品微服务获取到商品的信息,然后再返回给用户展示。

4.2 Spring Cloud OpenFeign介绍

​ Spring Cloud OpenFeign 是声明式的服务调用工具,它整合了Ribbon等其他组件,拥有负载均衡和服务容错功能.

Feign是声明式的服务调用工具,我们只需创建一个接口并用注解的方式来配置它,就可以实现对某个服务接口的调用,简化了直接使用RestTemplate来调用服务接口的开发量。Feign具备可插拔的注解支持,同时支持Feign注解、JAX-RS注解及SpringMvc注解。当使用Feign时,Spring Cloud集成了Ribbon和Eureka以提供负载均衡的服务调用.

fegin 本身是一个组件 整合到spring cloud 之后 就命名为spring cloud openFeign.

4.3 OpenFeign入门使用

基于以上的应用场景,通过代码的方式入门服务调用有多简单。

开发步骤:

1.搭建工程 管理版本
2.创建2个微服务
3.加入起步依赖 并实现远程调用

4.3.1 创建工程

如上图所示:cloud-test工程pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itheima</groupId>
    <artifactId>cloud-test</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>cloud-test-consumer</module>
        <module>cloud-test-provider</module>
    </modules>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.8.RELEASE</version>
    </parent>

    <properties>
        <!--spring cloud版本-->
        <spring.cloud-version>Hoxton.SR9</spring.cloud-version>
        <!--jdk版本-->
        <java.version>1.8</java.version>
        <skipTests>true</skipTests>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--spring cloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.5.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

cloud-test-provider工程pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-test</artifactId>
        <groupId>com.itheima</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-test-provider</artifactId>

    <dependencies>
        <!--配置feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--web起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <!--springboot maven插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

启动类:

@SpringBootApplication
public class ProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class,args);
    }
}

yml:

server:
  port: 8081
spring:
  application:
    name: provider

cloud-test-consumer工程pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>cloud-test</artifactId>
        <groupId>com.itheima</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-test-consumer</artifactId>

    <dependencies>
        <!--web起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--配置feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--springboot maven插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

启动类:

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

yml:

server:
  port: 8080
spring:
  application:
    name: consumer

4.3.2 实现远程调用

provider端创建商品controller:

@RestController
public class ItemController {

    /**
     * 获取商品的信息
     *
     * @param id
     * @return
     */
    @GetMapping("/item/{id}")
    public String getInfo(@PathVariable(name = "id") String id) {
        String itemInfo = "SN:" + id;
        return itemInfo;
    }
}

consumer端创建订单controller,并实现远程调用:

@RestController
public class OrderController {
    @Autowired
    private ItemFeign itemFeign;

    @GetMapping("/doOrder")
    public String doOrder() {
        //1.模拟远程调用获取到到商品信息
        String info = itemFeign.getItemInfo("1");
        //2.模拟下单
        System.out.println("张三:下单成功,商品信息为:"+info);
        //3.模拟返回成功信息
        return info;
    }
}

按照feign的使用创建feign接口:

@FeignClient(name="provider",url = "127.0.0.1:8081")
public interface ItemFeign {

    /**
     * 根据用户ID 获取用户名
     * @param id
     * @return
     */
    @GetMapping("/item/{id}")
    String getItemInfo(@PathVariable(name="id") String id);
}

解释:

@FeignClient(name="provider",url = "127.0.0.1:8081")  指定注解 标识 该类为Feign接口
name 指定要调用的服务名(目前随便填)
url 指定要调用的服务(provider)的ip和端口


该接口中的方法 和 被调用方法的controller中保持一致(即是应当声明一个接口的方法 和 controller一致)

@GetMapping("/item/{id}")
String getItemInfo(@PathVariable(name="id") String id);

接口编写的要求如下:

1.接口的方法返回值    和 被调用方controller中的方法的返回值保持一致
2.接口的方法的请求路径 和 被调用方controller中的请求路径保持一致
3.接口的参数类型和参数个数 和被调用方controller中的方法的参数类型和个数保持一致
4.接口的方法参数需要修饰注解,并设置相关属性例如:@PathVariable(name = "id") @RequestParam(name="name")  @RequestBody 

简单记忆:和被调用方的编写一致即可。

启动类中添加注解启用feignclients:

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

五、微服务注册与发现

5.1 NACOS介绍

5.1.1 应用场景

当服务调用越来越多,服务的地址需要管理起来,并实现动态调用而不是硬编码在接口中。此时需要一个注册中心来帮助我们管理服务。

1.商品微服务注册IP和端口到注册中心
2.订单微服务先从注册中心获取到商品微服务的IP和端口
3.订单微服务中使用获取到的IP和端口执行远程调用

5.1.2 NACOS介绍

NACOS是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。简单来说:NACOS就是一个注册中心 ,用来实现服务的注册与发现。

Github:https://github.com/alibaba/Nacos

5.2 NACOS作为注册中心使用

如上图所示 ,当我们将NACOS作为注册中心来使用,那么就需要满足三个条件 有一个注册 有两个微服务 并且向注册中心进行注册并发现服务 实现远程调用。

使用步骤:

1.搭建nacos注册中心
2.搭建微服务并向nacos进行注册
3.实现远程调用。

5.2.1 搭建注册中心

(1)下载 zip 如图所示

(2)解压zip

(3)双击如图所示的脚本启动

(4)访问地址验证是否启动成功

浏览器中访问:http://localhost:8848/nacos

输入用户名和密码:

nacos/nacos

出现如下画面说明搭建正确:

5.2.2 实现服务的注册与发现

实现步骤

1.搭建微服务consumer 并实现注册与发现
2.搭建微服务provider 并实现注册与发现
3.修改feign 实现远程调用(非硬编码方式)

5.2.2.1 消费端

(1)在cloud -consumer-test工程中添加依赖:(依赖的版本参考之前的使用版本注意)

可以参考官方说明:

https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

(2)启动类中添加注解如下:

(3)yaml中进行配置:

5.2.2.2 提供端

(1)在cloud -provider-test工程中添加依赖:(依赖的版本参考之前的使用版本注意)

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

(2)启动类中添加注解 开启服务注册和发现

(3)配置yaml

(4)进行测试查看:

启动consumer 和provider 和注册中心

在nacos的控制台界面就可以看到如下效果:

1619323958652

5.2.2.3 动态远程调用

修改接口之后,重新启动一次 再次进行调用如下效果:

照样能获取到结果。

控制台输出如下

由此可以看出:实际上nacos添加之后,默认从注册中心根据服务名动态获取到ip和端口 并实现远程调用。

六、微服务实现服务配置

6.1 应用场景

​ 随着业务的发展、微服务架构的升级,服务的数量、程序的配置日益增多(各种微服务、各种服务器地址、各种参数),传统的配置文件方式和数据库的方式已无法满足开发人员对配置管理的要求:

  • 安全性:配置跟随源代码保存在代码库中,容易造成配置泄漏
  • 时效性:修改配置,需要重启服务才能生效
  • 局限性:无法支持动态调整:例如日志开关、功能开关

因此,我们需要配置中心来统一管理配置文件。例如:一旦配置修改,则应用即可立即生效。不需要重启微服务。

6.2 NACOS作为配置中心使用

以上,配置中心 可以有很多的技术,这里我们使用NACOS作为配置中心使用也是可以的。结合之前我们使用的注册中心 NACOS 可以两用。

使用步骤:

1.需求:获取配置文件中的jdbc.url中的值,并可以在线进行编辑修改 不需要重启系统即能生效
2.搭建配置中心服务
3.搭建微服务(consumer或者provider)此处我们以consumer来作为案例
4.实现在线编辑 之后立即生效

6.2.1 搭建配置中心

该配置中心已经搭建,就是之前搭建的nacos server端。控制台如下,将来我们的配置文件全部在如下左框所示下进行配置。

6.2.2 微服务中使用Nacos

6.2.2.1 添加起步依赖

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

6.2.2.2 配置yaml

6.2.2.3 控制台(配置中心)进行配置

(稍微注意下目前就是只能用properites)

6.2.2.4 代码中进行测试

@RestController
@RefreshScope
public class OrderController {
    @Autowired
    private ItemFeign itemFeign;

    @Value("${jdbc.url}")
    private String url;

    @GetMapping("/doOrder")
    public String doOrder() {
        //1.模拟远程调用获取到到商品信息
        String info = itemFeign.getItemInfo("1");
        //2.模拟下单
        System.out.println("张三:下单成功,商品信息为:"+info);
        //3.模拟返回成功信息
        //4.模拟配置信息获取 打印
        System.out.println("值为:"+url);

        return info;
    }
}

浏览器中输入:http://localhost:8080/doOrder

再次修改配置中心的配置值

再发送请求:

七、总结

讲解了如下内容:
什么是微服务架构,
springcloud是什么以及springcloud aliaba是什么及他们的关系
spring cloud alibaba的入门实战 实现:
    远程调用
    服务发现和注册
    服务的配置

项目资源:大牛详解Spring Cloud Alibaba技术栈

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

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

相关文章

240:vue+openlayers上传CSV文件,在地图上显示信息

第240个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers上传CSV文件,在地图显示,点击点后,显示点信息。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,请加载其他来练习 文章目录 示例效果使用的csv…

玩转ChatGPT:制作AI播报视频

一、写在前面 羊了几天&#xff0c;上线就发现&#xff0c;GPT的第三方插件的数量越来越多&#xff0c;使得官方推出了搜索功能&#xff1a; 我逛了一圈&#xff0c;发现这个插件挺有意思&#xff0c;用来生成AI语音播报视频的。 下面给大家尝尝鲜。 二、实战过程 &#xff0…

k8s pvc详解

一、概述 PVC 的全称是&#xff1a;PersistentVolumeClaim&#xff08;持久化卷声明&#xff09;&#xff0c;PVC 是用户存储的一种声明&#xff0c;PVC 和 Pod 比较类似&#xff0c;Pod 消耗的是节点&#xff0c;PVC 消耗的是 PV 资源&#xff0c;Pod 可以请求 CPU 和内存&am…

移动端做安全测试的重要性

安全性测试的目的是发现危害手机中数据的安全和完整性的错误和缺陷。发现安全错误通常是比较困难的,软件通常功能运行正常但却不安全。 一、软件权限 APP软件权限包括:网络通信、信息发送、自动启动、 媒体录制、读取用户信息、写入用户数据等权限,因关系到用户个人信息和隐私…

Java开发手册中为什么建议初始化HashMap的容量大小,以及HashMap源码中相关参数(容量大小设置参数公式)说明

场景 Java开发手册中对于HashMap的推荐如下: 【推荐】集合初始化时&#xff0c;指定集合初始值大小。 说明&#xff1a;HashMap 使用 HashMap(int initialCapacity) 初始化&#xff0c;如果暂时无法确定集合大小&#xff0c;那么指定默认值&#xff08;16&#xff09;即可。…

2023年前端面试题汇总-数据结构(链表)

1. 链表的概念 1.1. 链表的结构 在计算机里&#xff0c;不保存在连续存储空间中&#xff0c;而每一个元素里都保存了到下一个元素的地址的数据结构&#xff0c;我们称之为链表&#xff08;Linked List&#xff09;。链表上的每一个元素又可以称它为节点&#xff08;Node&…

【大数据之Hive】六、Hive之metastore服务部署

metastore为Hive CLI或Hiveserver2提供元数据访问接口。 1 metastore运行模式 metastore运行模式有两种&#xff0c;嵌入式模式和独立服务模式。 &#xff08;1&#xff09;嵌入式模式 将metastore看作一个依赖嵌入到Hiveserver2和每一个HiveCLI客户端进程&#xff0c;使得Hi…

零基础开发小程序第六课-删除数据

目录 1 物理删除数据2 逻辑删除数据总结 我们上一篇介绍了修改数据&#xff0c;本篇介绍一下删除数据。一般的小程序如果提供给管理员使用的功能&#xff0c;通常会有删除数据的功能。 删除数据有真删除和假删除的区别。那什么是真删除呢&#xff1f;真删除就是把这条数据从数据…

通过JVM深入理解Java异常机制

JVM内部结构 要深入理解JVM异常处理机制&#xff0c;需要从JVM内部结构开始。 下图描述的主要是Java程序在执行时&#xff0c;由JVM管理的运行时数据区&#xff1b;包括方法区、Java堆、Java虚拟机栈、PC寄存器、本地方法栈&#xff0c;还有常量池。它们又被分为两大类——线程…

SeaTunnel StarRocks 连接器的使用及原理介绍

作者&#xff1a;毕博&#xff0c;马蜂窝数据平台负责人&#xff0c;StarRocks 活跃贡献者 & Apache SeaTunnel 贡献者 Apache SeaTunnel&#xff08;以下简称 SeaTunnel&#xff09;是一个分布式、高性能、易扩展、用于海量数据&#xff08;离线&实时&#xff09;同步…

Spring为什么默认是单例的?

目录 一、五种作用域 二、单例bean与原型bean的区别 三、单例Bean的优势与劣势 一、五种作用域 1.singleton: singleton是Spring Bean的默认作用域&#xff0c;也就是单例模式。在整个应用程序中&#xff0c;只会创建一个实例&#xff0c;Bean的所有请求都会共享这个实例。 …

ETLCloud轻松应对CDC实时数据流和维度数据合并的需求,实时监控订单数据

如何实现实时流与批流合并打宽数据 通常情况下我们使用CDC实时监听表销售或订单表数据的LOG时会形成流式的数据&#xff0c;即订单变化时数据是按照变化时间不断的传入到ETL的流程中的&#xff0c;业务希望实时看到订单数据的报表。 CDC每次传入的数据有可能是一条也可能是多…

基于geoserver开发地图发布服务

写在前面&#xff1a;我在github上创建了对应的项目&#xff0c;可点此跳转&#xff0c;本文的所有源码均可在项目里找到&#xff0c;欢迎大家访问交流 一、开发背景 在gis领域&#xff0c;geoserver是后端地图发布的开源项目。目前我们在启动服务后&#xff0c;可通过自带的…

科研工具-R-META分析与【文献计量分析、贝叶斯、机器学习等】多技术融合实践

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

【AIGC】14、GLIPv2 | 在 GLIP 上扩展 negative phrase 并新增分割功能

文章目录 一、背景二、方法2.1 A Unified VL Formulation and Architecture2.2 GLIPv2 pre-training2.3 将 GLIPv2 迁移到 Localization 和 VL task 三、结果3.1 One model architecture for all3.2 One set of model parameters for all3.3 GLIPv2 as a strong few-shot learn…

Latex使用algorithm2e包写伪代码

用Latex写伪代码我们需要用到一个包&#xff0c;Algorithm2e&#xff0c;这个工具包的使用手册下载地址为&#xff08;http://mlg.ulb.ac.be/files/algorithm2e.pdf&#xff09;CSDN的链接为&#xff08;&#xff09; 准备 导入该包 \usepackage[ruled,linesnumbered]{algor…

上海亚商投顾:沪指小幅震荡微涨 AI应用端持续活跃

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 大小指数今日走势分化&#xff0c;沪指全天窄幅震荡&#xff0c;创业板指低开低走&#xff0c;盘中一度跌超1.6%&a…

【Java基础】I/O流 —— Java中的流都需要关闭吗?

目录 一、为什么要关闭流&#xff1f;二、close方法和flush方法1.使用close方法2.使用flush方法 三、流按指向分类四、不用关闭的流 一、为什么要关闭流&#xff1f; 涉及到对外部资源的读写操作&#xff0c;包括网络、硬盘等等的I/O流&#xff0c;如果在使用完毕之后不关闭&a…

Unity基础框架从0到1(六)对象池模块

索引 这是Unity基础框架从0到1的第六篇文章&#xff0c;框架系列的项目地址是&#xff1a;https://github.com/tang-xiaolong/SimpleGameFramework 文章最后有目前框架系列的思维导图&#xff0c;前面的文章和对应的视频我一起列到这里&#xff1a; 文章 Unity基础框架从0到…

算力不竭如江海,天翼云“息壤”如何助力千行百业算力智能调度?

科技云报道原创。 数字时代下&#xff0c;算力已成为新型生产力&#xff0c;并朝着多元泛在、安全可靠、绿色低碳的方向演进。以算力为核心的数字信息基础设施&#xff0c;是国家战略性布局的关键组成部分&#xff0c;也成为数字经济时代的“大国重器”。 作为云服务国家队&am…