[Spring] Gateway详解

🌸个人主页:https://blog.csdn.net/2301_80050796?spm=1000.2115.3001.5343
🏵️热门专栏:
🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm=1001.2014.3001.5482
🍕 Collection与数据结构 (93平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm=1001.2014.3001.5482
🧀线程与网络(96平均质量分) https://blog.csdn.net/2301_80050796/category_12643370.html?spm=1001.2014.3001.5482
🍭MySql数据库(93平均质量分)https://blog.csdn.net/2301_80050796/category_12629890.html?spm=1001.2014.3001.5482
🍬算法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12676091.html?spm=1001.2014.3001.5482
🍃 Spring(97平均质量分)https://blog.csdn.net/2301_80050796/category_12724152.html?spm=1001.2014.3001.5482
🎃Redis(97平均质量分)https://blog.csdn.net/2301_80050796/category_12777129.html?spm=1001.2014.3001.5482
🐰RabbitMQ(97平均质量分) https://blog.csdn.net/2301_80050796/category_12792900.html?spm=1001.2014.3001.5482
感谢点赞与关注~~~
在这里插入图片描述

目录

  • 1. 网关介绍
    • 1.1 问题
    • 1.2 什么是API网关
  • 2. Spring Cloud Gateway
    • 2.1 快速上手
    • 2.2 Route Predicate Factories(路由谓词工厂)
      • 2.2.1 Predicate
      • 2.2.2 Route Predicate Factories
      • 2.2.3 代码演示
    • 2.3 Gateway Filter Factories(网关过滤器工厂)
      • 2.3.1 GatewayFilter
        • 快速上手
        • 常见的GatewayFilter类型
        • Default Filters
      • 2.3.2 GlobalFilter
        • 快速上手
    • 2.4 过滤器的执行顺序
    • 2.5 自定义过滤器
      • 2.5.1 自定义Gateway Filter
        • 定义GatewayFilter
        • 配置过滤器
      • 2.5.2 自定义GlobalFilter
        • 自定义GlobalFilter

1. 网关介绍

1.1 问题

在前面,我们通过Eureka,Nacos解决了服务注册,服务发现的问题,使用Spring Cloud LoadBalance解决了负载均衡的问题,使用OpenFeign解决了远程调用的问题.
但是当前所有微服务的接口都是直接对外暴露的,可以直接通过外部访问.为了保证对外服务的安全性,服务端实现的微服务接口通常都带有一定的权限校验机制.由于使用了微服务,原本⼀个应用的的多个模块拆分成了多个应用,我们不得不实现多次校验逻辑.当这套逻辑需要修改时,我们需要修改多个应用,加重了开发人员的负担.

针对上述的问题,一个最常用的方案就是使用API网关.

比如外部人员去一个公司办理业务,公司需要先核实对方的身份之后再去进行办理,而且公司划分为了多个部门,每个部门都需要先对对方的身份进行核实之后再进行办理.这样的效率是非常低的,
为此我们对此进行了改进,设立前台,统一又前台来进行身份的核实,前台身份校验通过之后,其他部门就可以设置信任,直接办理业务.

1.2 什么是API网关

API网关(简称网关)也是一个服务,通常是后端服务的唯一入口,它的定义类似设计模式中的门面模式.它就类似与整个微服务架构的门面,所有的外部客户访问,都要经过它来进行调度和过滤.
在这里插入图片描述
网关核心功能:

  1. 权限控制: 作为微服务的入口,对于用户进行权限校验,如果校验失败则进行拦截.
  2. 动态路由: 一切请求先经过网关,但是网关不做业务处理,而是根据某种规则把请求转发到某个微服务.
  3. 负载均衡: 当路由的目标服务有多个时,还需要做负载均衡.
  4. 限流: 请求过高时,按照网关中配置微服务能够接受的流量进行放行,避免服务压力过大.

常见的网关实现也有很多种,我们今天要讲的是Spring Cloud Gateway

2. Spring Cloud Gateway

2.1 快速上手

我们通过一下的演示,先来了解网关的基本功能.

  1. 创建网关项目
    API网关也是一个服务
    在这里插入图片描述
  2. 引入网关依赖
<dependencies><!--⽹关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--基于nacos实现服务发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
</dependencies>
  1. 编写启动类
@SpringBootApplication
public class GateWayApplication {public static void main(String[] args) {SpringApplication.run(GateWayApplication.class,args);}
}
  1. 添加Gateway的路由设置
    创建application.yml文件,添加如下的配置:
server:port: 10030
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:routes:- id: product-serviceuri: lb://product-servicepredicates:- Path=/product/**- id: order-serviceuri: lb//order-servicepredicates:- Path=/order/**

配置解释:

  • id: 自定义路由ID,保持唯一即可.
  • uri: 目标服务地址,支持普通URI以及以及lb://应用注册服务名称.lb表示负载均衡,使用该格式表示从注册中心获取服务地址.
  • predicates: 路由条件,根据匹配的结果决定是否执行该请求路由,上述代码中,我们把符合Path规则的一切请求,都代理到uri参数指定的地址.
  1. 测试
    启动API网关服务
    通过网关服务访问product-service
    http://127.0.0.1:10030/order/select?id=1
    在这里插入图片描述
    url符合yml文件中配置的 /product/** 规则
    通过网关访问服务order-service
    在这里插入图片描述
    url符合yml配置文件中的/order/**规则.

2.2 Route Predicate Factories(路由谓词工厂)

2.2.1 Predicate

Predicate是java8提供一个函数式编程接口,它接受一个参数并返回一个布尔值,用于条件过滤,请求参数的校验.
代码演示:

  1. 定义一个Predicate
public class StringPredicate implements Predicate<String> {@Overridepublic boolean test(String s) {return s.isEmpty();}
}
  1. 使用这个Predicate
public static void main(String[] args) {Predicate<String> predicate = new StringPredicate();System.out.println(predicate.test(""));System.out.println(predicate.test("aaaa"));
}

在这里插入图片描述
3. Predicate的其他写法
可以使用匿名内部类的写法

public static void main(String[] args) {Predicate<String> predicate = new Predicate<String>() {@Overridepublic boolean test(String s) {return s.isEmpty();}};System.out.println(predicate.test(""));System.out.println(predicate.test("aaa"));
}

lambda写法:

public static void main(String[] args) {Predicate<String> predicate = s -> s.isEmpty();System.out.println(predicate.test(""));System.out.println(predicate.test("aaa"));
}
  1. Predicate的其他方法
    在这里插入图片描述

2.2.2 Route Predicate Factories

Route Predicate Factories (路由断言工厂,也称为路由谓词工厂,此处谓词表示一个函数),在SpringCloud Gateway中,Predicate提供了路由规则的匹配机制.
我们在配置文件中写的断言规则只是字符串,这些字符串会被Route Predicate Factory读取并处理,转变为路由判断条件.
比如前面章节配置的Path=/product/**就是通过Path属性来匹配URL前缀是/product的请求.
这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory来实现的.
SpringCloud Gateway默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请求不同的属性,并且多个Predicate可以通过and逻辑进行组合.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2.3 代码演示

  1. 添加Predicate规则
    在application.yml中添加如下的规则
    在application中添加如下规则
server:port: 10030
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:routes:- id: product-serviceuri: lb://product-servicepredicates:- Path=/product/**- After=2025-01-30T00:00:00.000+08:00[Asia/Shanghai]- id: order-serviceuri: lb://order-servicepredicates:- Path=/order/**- After=2025-01-30T00:00:00.000+08:00[Asia/Shanghai]

测试:http://127.0.0.1:10030/product/select?id=1001
在这里插入图片描述
返回了404.把时间改为2025-1-22之后再试.可以正常获取到请求.
在这里插入图片描述

2.3 Gateway Filter Factories(网关过滤器工厂)

Predicate决定了请求由哪一个路由处理,如果在请求之外处理前后需要加上一些逻辑,这就是Filter的作用范围了.
Filter分为两种类型: Pre类型和Post类型.
Pre类型过滤器: 路由处理之前执行(请求转发到后端服务之前),在Pre类型过滤器中可以做鉴权,限流等.
Post类型过滤器: 请求之心完成之后,将结果返回给客户端之前执行.

在这里插入图片描述
SpringCloud Gateway中内置了很多Filter,用于拦截和链式处理web请求,比如权限校验,访问超时等设定.
SpringCloud Gateway从作用范围上,把Filter可分为GatewayFilter和GlobalFilter.
GatewayFilter: 应用到单个路由或者一个分组路由上.
GlobalFilter: 应用到所有路由上,也就是对所有的路由生效.

2.3.1 GatewayFilter

GatewayFilter同Predicate类似,都是在配置文件application.yml中配置.每个过滤器的逻辑都是固定的.比如配置文件中写AddRequestParameter,就可以为所有的请求添加一个参数,我们通过一个例子来演示GatewayFilter该如何使用.

快速上手
  1. 在application文件中添加过滤器.
server:port: 10030
spring:application:name: gatewaycloud:nacos:discovery:server-addr: 127.0.0.1:8848gateway:routes:- id: product-serviceuri: lb://product-servicepredicates:- Path=/product/**- After=2025-01-22T00:00:00.000+08:00[Asia/Shanghai]filters:- AddRequestParameter=name,zhangsan- id: order-serviceuri: lb://order-servicepredicates:- Path=/order/**- After=2025-01-22T00:00:00.000+08:00[Asia/Shanghai]

该filter值添加在了product-service路由下,因此只对product-service路由生效,也就是/product/**生效.
2. 接收参数并打印
在product-service服务中接收请求的参数,并打印出来.

@RequestMapping("/getParam")
public String getParam(Integer id,String name){System.out.println(id);System.out.println(name);return "接收参数成功";
}
  1. 测试
    发送http://127.0.0.1:10030/product/getParam?id=3
    在这里插入图片描述
    观察控制台日志:
    在这里插入图片描述
常见的GatewayFilter类型

SpringCloud Gateway提供了非常多的Filter.下面列出一些常见过滤器的说明:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
具体可参考Spring官方文档:
https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/gatewayfilter-factories.html

Default Filters

前面的filter添加在指定路由下,所以只对当前路由生效,若需要对全部路由生效,可以使用spring.cloud.gateway.default-filters这个属性.和上面指定路由下一样,下面都是一个filter的列表.
举例:

spring:cloud:gateway:default-filters:- AddResponseHeader=X-Response-Default-Red, Default-Blue- PrefixPath=/httpbin

2.3.2 GlobalFilter

GlobalFilter是Spring Cloud Gateway中的全局过滤器,它和GatewayFilter的作用是相同的.GlobalFilter会应用到所有的路由请求上,全局过滤器通常用于实现安全性,性能监控和日志记录等相关的全局功能.
Spring Cloud Gateway内置的全局过滤器也有很多,比如:

  • Gateway Metric Filter:网关指标,提供监控指标
  • Forward Routing Filter: 用于本地forword,请求不转发到下游服务器.
  • LoadBalancer Client Filter:针对下游服务,实现负载均衡.

更多过滤器参考官方文档:https://docs.spring.io/spring-cloud-gateway/reference/spring-cloud-gateway/global-filters.html

快速上手
  1. 添加依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  1. 添加配置
spring:cloud:gateway:metrics:enabled: true
management:endpoints:web:exposure:include: "*"endpoint:health:show-details: alwaysshutdown:enabled: true

解释上面的配置信息:

  • spring.cloud.gateway.metrics.enabled: metrics表示指标相关的配置项,enabled 是一个布尔类型的配置参数,当设置为 true 时,意味着开启Spring Cloud Gateway的指标收集功能.开启指标收集功能后,Spring Cloud Gateway会收集一系列与网关运行相关的指标数据.这些指标数据能够帮助开发者和运维人员更好地了解网关的运行状态,性能表现以及流量情况等.
  • management.endpoints.web.exposure.include: "*":该配置用于指定哪些端点(endpoints)可以通过 Web 暴露出去.* 表示所有端点都将被暴露.端点是 Spring Boot Actuator提供的用于监控和管理应用程序的接口,比如健康检查、指标统计、环境变量查看等功能都通过这些端点来实现.
  • management.endpoint.health.show-details: always:此配置针对健康检查端点(health),设置为 always 表示在健康检查响应中始终显示详细信息.
  • management.endpoint.shutdown.enabled: true: 启用了应用程序的关闭端点(shutdown).这允许通过向特定的端点发送请求来优雅地关闭应用程序.
  1. 测试
    重启网关,访问http://127.0.0.1:10030/actuator,显示所有监控的信息链接.
    在这里插入图片描述

2.4 过滤器的执行顺序

一个项目中,即有GatewayFilter,又有GlobalFilter时,执行的先后顺序是什么呢?
请求路由之后,网关会把当前项目中GatewayFilter和GlobalFilter合并到一个过滤器链中,并进行排序,依次执行过滤器.
在这里插入图片描述
每个过滤器都必须指定一个int类型的order值,默认值为0,表示该过滤器的优先级.order值越小,优先级越高,执行顺序越靠前.

  • Filter通过实现Order接口或者添加@Order注解来指定order值.
  • SpringCloud Gateway提供的Filter由Spring指定,用户也可以自定义Filter,由用户指定.
  • 当过滤器的order值一样时,会按照defaultFilter>GatewayFilter>GlobalFilter的顺序来执行.

2.5 自定义过滤器

SpringCloud Gateway提供了过滤器的扩展功能,开发者可以根据实际业务来自定义过滤器,同样自定义过滤器也支持GatewayFilter和GlobalFilter两种.

2.5.1 自定义Gateway Filter

自定义Gateway Filter,需要去实现对应的接口GatewayFilterFactory,SpringBoot默认帮我们实现的抽象类是AbstractGatewayFilterFactory,我们可以直接使用.

定义GatewayFilter

首先针对Filter的配置,使用CustomConfig来定义.

@Data
public class CustomConfig {private String Name;
}

继承AbstractGatewayFilterFactory抽象类并重写抽象方法,实现Ordered接口用于指定优先级.

@Component
@Slf4j
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomConfig> implements Ordered {/*** 执行优先级,LOWEST_PRECEDENCE表示的是最低优先级* @return 返回最低优先级*/@Overridepublic int getOrder() {return Ordered.LOWEST_PRECEDENCE;}@Overridepublic GatewayFilter apply(CustomConfig config) {return new GatewayFilter() {/*** Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChainchain)* ServerWebExchange: HTTP请求-响应交互的契约, 提供对HTTP请求和响应的访问, 服务器端请求属性, 请求实例,响应实例等, 类似Context角色* GatewayFilterChain: 过滤器链* Mono: Reactor核心类, 数据流发布者, Mono最多只触发⼀个事件, 所以可以把Mono 用于在异步任务完成时发出通知.* Mono.fromRunnable: 创建⼀个包含Runnable元素的数据流.类似与创建了一个线程*/@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("[Pre] Filter Request:"+config.getName());return chain.filter(exchange).then(Mono.fromRunnable(()-> log.info("[Post] Response Filter")));//执行请求}};}
}

代码说明:

  • 自定义过滤器类名统一以GatewayFilterFactory结尾,因为在默认情况下,过滤器的name会采用该定义类的前缀,这里的name=Custom(yml配置中使用).
  • apply方法中,同时包含了Pre和Postman过滤,then方法中是请求执行结束之后处理的.
  • CustomConfig是一个配置类,该类只有一个属性name,和yml的配置对应.
  • 该类需要交给Spring进行管理,所以需要加@Comopent注解.
  • getOrder表示该过滤器的优先级.
配置过滤器
spring:cloud:gateway:metrics:enabled: trueroutes:- id: product-serviceuri: lb://product-servicepredicates:- Path=/product/**filters:- name: Customargs:name: custom filter

2.5.2 自定义GlobalFilter

GlobalFilter的实现比较简单,它不需要额外的配置,只需要实现GlobalFilter接口,自动会过滤掉所有的Filter.

自定义GlobalFilter
@Component
@Slf4j
public class CustomGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {log.info("[Pre] CustomGlobalFilter enter...");return chain.filter(exchange).then(Mono.fromRunnable(()-> log.info("[Post] CustomGlobalFilter return...")));//执行请求}@Overridepublic int getOrder() {return Ordered.HIGHEST_PRECEDENCE;}
}

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

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

相关文章

Arduino Uno 和 1.44 英寸 TFT 屏幕(SPI 接口)初体验

在嵌入式项目中&#xff0c;1.44 英寸 TFT 屏幕&#xff08;SPI 接口&#xff09;是一种非常实用的显示设备&#xff0c;适合用于显示文本、图形和简单动画。本文将详细介绍如何使用 Arduino Uno 和 1.44 英寸 TFT 屏幕进行基本的显示操作&#xff0c;包括显示文本、绘制图形和…

Linux应用编程(五)USB应用开发-libusb库

一、基础知识 1. USB接口是什么&#xff1f; USB接口&#xff08;Universal Serial Bus&#xff09;是一种通用串行总线&#xff0c;广泛使用的接口标准&#xff0c;主要用于连接计算机与外围设备&#xff08;如键盘、鼠标、打印机、存储设备等&#xff09;之间的数据传输和电…

Git处理冲突详解

文章目录 Git处理冲突详解一、引言二、冲突产生的原因三、解决冲突的步骤1. 手动解决冲突1.1 查看冲突文件1.2 编辑冲突文件1.3 提交解决冲突 2. 使用合并工具解决冲突 四、使用示例五、总结 Git处理冲突详解 一、引言 在团队协作开发中&#xff0c;Git冲突是不可避免的。当多…

Linux 下注册分析(4)

系列文章目录 Linux 设备树 Linux 下注册分析&#xff08;1&#xff09; Linux 下注册分析&#xff08;2&#xff09; Linux 下注册分析&#xff08;3&#xff09; Linux 下注册分析&#xff08;4&#xff09; 文章目录 系列文章目录1、device_create简介device_createdevice_c…

第十五届蓝桥杯大赛软件赛省赛Java 大学 B 组(1、2题)

1.报数游戏 问题描述 小蓝和朋友们在玩一个报数游戏。由于今年是 2024 年&#xff0c;他们决定要从小到大轮流报出是 20或 24 倍数的正整数。前 10 个被报出的数是&#xff1a;20,24,40,48,60,72,80,96,100,120。请问第 202420242024个被报出的数是多少? 答案提交 这是一道结果…

批量修改图片资源的属性。

Unity版本2022.3 如图&#xff0c;比如我们想要修改图片的属性的时候&#xff0c;大部分都是 TextureImporter importer (TextureImporter)AssetImporter.GetAtPath("Assets/1.png"); // 获取文件 importer.xxxxxxx xxxxxxx; // 修改属性到这里没什么问题&#xf…

基于神经网络的视频编码NNVC(1):帧内预测

在H.266/VVC发布后&#xff0c;基于传统编码框架提升压缩率越来越难&#xff0c;随着深度学习的发展&#xff0c;研究人员开始尝试将神经网络引入编码器。为此&#xff0c;JVET工作组在2020年成立AHG11小组来专门进行基于神经网络的视频编码的研究。 为了方便研究&#xff0c;工…

C语言初阶牛客网刷题—— HJ97 记负均正【难度:简单】

1. 题目描述 牛客网在线OJ题 1、首先输入要输入的整数个数 n &#xff0c;然后输入 n 个整数。输出为 n 个整数中负数的个数&#xff0c;和所有正整数的平均值&#xff0c; 结果保留一位小数。 注意&#xff1a; 0 即不是正整数&#xff0c;也不是负数&#xff0c;不计入计算&…

【Web开发】一步一步详细分析使用Bolt.new生成的简单的VUE项目

https://bolt.new/ 这是一个bolt.new生成的Vue小项目&#xff0c;让我们来一步一步了解其架构&#xff0c;学习Vue开发&#xff0c;并美化它。 框架: Vue 3: 用于构建用户界面。 TypeScript: 提供类型安全和更好的开发体验。 Vite: 用于快速构建和开发 主界面如下&#xff1a…

Rabbitmq高级特性之消费方确认

背景&#xff1a; 发送方发送消息之后&#xff0c;到达消费端之后&#xff0c;可能会有以下情况&#xff1a;消息处理成功&#xff0c;消息处理异常。RabbitMQ在向消费者发送消息之后&#xff0c;就会把这条消息给删除掉&#xff0c;那么第二种情况&#xff0c;就会造成消息丢…

基于微信小程序的健身管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Couchbase UI: Server

在 Couchbase UI 中的 Server&#xff08;服务器&#xff09;标签页主要用于管理和监控集群中的各个节点。以下是 Server 标签页的主要内容和功能介绍&#xff1a; 1. 节点列表 显示集群中所有节点的列表&#xff0c;每个节点的详细信息包括&#xff1a; 节点地址&#xff1…

Spark Streaming编程基础

文章目录 1. 流式词频统计1.1 Spark Streaming编程步骤1.2 流式词频统计项目1.2.1 创建项目1.2.2 添加项目依赖1.2.3 修改源目录1.2.4 添加scala-sdk库1.2.5 创建日志属性文件 1.3 创建词频统计对象1.4 利用nc发送数据1.5 启动应用&#xff0c;查看结果 2. 编程模型的基本概念3…

OpenCV imread函数读取图像__实例详解

OpenCV imread函数读取图像__实例详解 本文目录&#xff1a; 零、时光宝盒 一、imread函数定义 二、imread函数支持的文件格式 三、imread函数flags参数详解 &#xff08;3.1&#xff09;、Flags-1时&#xff0c;样返回加载的图像&#xff08;使用alpha通道&#xff0c;否…

ssm基于HTML5的红酒信息分享系统

SSM基于HTML5的红酒信息分享系统是一个专注于红酒领域的综合性信息平台&#xff0c;旨在为红酒爱好者、从业者以及普通消费者提供一个便捷的交流与获取红酒相关信息的空间。 一、系统背景与意义 随着人们生活水平的提高和消费观念的转变&#xff0c;红酒作为一种高雅的饮品&a…

Windows Docker Desktop安装及使用 Docker 运行 MySQL

Docker Desktop是Docker的官方桌面版&#xff0c;专为Mac和Windows用户设计&#xff0c;提供了一个简单易用的界面来管理和运行Docker容器。它集成了Docker引擎&#xff0c;为开发人员提供了一个快速、可靠、可扩展的方式来构建、运行和管理应用。DockerDesktop的优势在于&…

人形机器人,自动驾驶“老炮”创业第二站

造一台人形机器人&#xff0c;或许正在成为2025年最炙手可热的事情。 从去年第四季度开始&#xff0c;伴随着大模型应用的深入&#xff0c;具身智能概念被点燃&#xff0c;其中最鲜明的一个特点是&#xff0c;大量自动驾驶大佬的转行加入。 随便说几个比较有分量的&#xff0…

Flutter_学习记录_基本组件的使用记录

1.TextWidge的常用属性 1.1TextAlign: 文本对齐属性 常用的样式有&#xff1a; TextAlign.center 居中TextAlign.left 左对齐TextAlign.right 有对齐 使用案例&#xff1a; body: Center(child: Text(开启 TextWidget 的旅程吧&#xff0c;珠珠, 开启 TextWidget 的旅程吧&a…

什么是COLLATE排序规则?

在当今数字化世界中&#xff0c;数据的整理、比较和排序是至关重要的。在数据库管理和编程语言中&#xff0c;我们经常需要对字符串进行排序&#xff0c;以展示或处理信息。为了实现这一点&#xff0c;各种系统和工具提供了排序规则&#xff0c;其中COLLATE排序规则就是其中的一…

打印输入单词字符数量统计直方图-C语言第二版

1. 编程要求 多年前写过一篇用 C 语言实现打印单词字符数量统计的直方图的文章, 现在看上去有些混乱, 对一些任务划分不清晰, 全部混在一起. 于是重写了这个编程题, 希望可以给初学者一些参考, 并且我分别用 C, C, Java, Python 四种语言完成了这道编程题, 有兴趣的可以看我另…