《Spring Guides系列学习》guide31 - guide34 及中期简单回顾

news2024/11/27 18:24:59

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。
在这里插入图片描述
接着上篇看过的guide31,接着往下看。

guide31、Observability with Spring

主要讲的是通过waveFront去直观查看spring应用程序的运行情况。

将 Micrometer 指标发布到 Tanzu Observability by Wavefront ,这是一个基于 SaaS
的指标监控和分析平台,可让您对整个堆栈中的数据进行可视化、查询和警报

引入对应的依赖,

<dependency>
   <groupId>com.wavefront</groupId>
   <artifactId>wavefront-spring-boot-starter</artifactId>
   <scope>runtime</scope>
</dependency>

添加配置文件:

management.wavefront.application.name=demo
management.wavefront.application.service-name=getting-started

启动程序,显示:
在这里插入图片描述
guide中的运行显示图:
在这里插入图片描述


guide32、accessing vault

Vault 是 hashicorp 推出的 secrets 管理、加密即服务与权限管理工具。 vault官网:
https://developer.hashicorp.com/vault/docs/internals/architecture

先下载并启动vault:

--下载
brew install vault
--启动
vault server --dev --dev-root-token-id="00000000-0000-0000-0000-000000000000"

然后进行配置, 使用 Vault 命令行启动另一个控制台窗口:

--将应用程序配置存储在 Vault 中
export export VAULT_TOKEN="00000000-0000-0000-0000-000000000000"
export VAULT_ADDR="http://127.0.0.1:8200"

--配置键值对:
vault kv put secret/github github.oauth2.key=foobar

spring boot项目中配置application.properties:

spring.cloud.vault.token=00000000-0000-0000-0000-000000000000
spring.cloud.vault.scheme=http

Application 类启动文件:

@SpringBootApplication
public class Application implements CommandLineRunner {

  @Autowired
  private VaultTemplate vaultTemplate;

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

  @Override
  public void run(String... strings) throws Exception {

    VaultResponse response = vaultTemplate
        .opsForKeyValue("secret", KeyValueBackend.KV_2).get("github");
    System.out.println("Value of github.oauth2.key");
    System.out.println("-------------------------------");
    System.out.println(response.getData().get("github.oauth2.key"));
    System.out.println("-------------------------------");
    System.out.println();

    // 使用Transit后端加密一些数据。
    VaultTransitOperations transitOperations = vaultTemplate.opsForTransit();

    // 首先需要设置传输(如果还没有设置它)。
    VaultSysOperations sysOperations = vaultTemplate.opsForSys();

    if (!sysOperations.getMounts().containsKey("transit/")) {

      sysOperations.mount("transit", VaultMount.create("transit"));

      transitOperations.createKey("foo-key");
    }

    // 加密明文值
    String ciphertext = transitOperations.encrypt("foo-key", "Secure message");

    System.out.println("Encrypted value");
    System.out.println("-------------------------------");
    System.out.println(ciphertext);
    System.out.println("-------------------------------");
    System.out.println();

    // 解密
    String plaintext = transitOperations.decrypt("foo-key", ciphertext);

    System.out.println("Decrypted value");
    System.out.println("-------------------------------");
    System.out.println(plaintext);
    System.out.println("-------------------------------");
    System.out.println();
  }
}

启动后显示:
在这里插入图片描述


guide33、Accessing Data Reactively with Redis

主要讲的是用响应式编程去和redis交互。

创建一个实体类:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Coffee {
  private String id;
  private String name;
}

再创建一个支持反应式Redis操作的bean类:

@Configuration
public class CoffeeConfiguration {
  @Bean
  ReactiveRedisOperations<String, Coffee> redisOperations(ReactiveRedisConnectionFactory factory) {
    Jackson2JsonRedisSerializer<Coffee> serializer = new Jackson2JsonRedisSerializer<>(Coffee.class);
    RedisSerializationContext.RedisSerializationContextBuilder<String, Coffee> builder =
        RedisSerializationContext.newSerializationContext(new StringRedisSerializer());
    RedisSerializationContext<String, Coffee> context = builder.value(serializer).build();
    return new ReactiveRedisTemplate<>(factory, context);
  }
}

再创建一个bean来在程序启动时加载示例数据:

@Component
public class CoffeeLoader {
  private final ReactiveRedisConnectionFactory factory;
  private final ReactiveRedisOperations<String, Coffee> coffeeOps;

  public CoffeeLoader(ReactiveRedisConnectionFactory factory, ReactiveRedisOperations<String, Coffee> coffeeOps) {
    this.factory = factory;
    this.coffeeOps = coffeeOps;
  }

  @PostConstruct
  public void loadData() {
    factory.getReactiveConnection().serverCommands().flushAll().thenMany(
        Flux.just("Jet Black Redis", "Darth Redis", "Black Alert Redis")
            .map(name -> new Coffee(UUID.randomUUID().toString(), name))
            .flatMap(coffee -> coffeeOps.opsForValue().set(coffee.getId(), coffee)))
        .thenMany(coffeeOps.keys("*")
            .flatMap(coffeeOps.opsForValue()::get))
        .subscribe(System.out::println);
  }
}

@PostConstruct:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

通常是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)


再创建一个接口类,去提供对外接口:

@RestController
public class CoffeeController {
  private final ReactiveRedisOperations<String, Coffee> coffeeOps;

  CoffeeController(ReactiveRedisOperations<String, Coffee> coffeeOps) {
    this.coffeeOps = coffeeOps;
  }

  @GetMapping("/coffees")
  public Flux<Coffee> all() {
    return coffeeOps.keys("*")
        .flatMap(coffeeOps.opsForValue()::get);
  }
}

然后直接启动应用,可以看到结果:
在这里插入图片描述


guide34、 Accessing data with Cassandra

Apache Cassandra是一个高度可扩展的高性能分布式数据库,用于处理大量商用服务器上的大量数据,提供高可用性,无单点故障。这是一种NoSQL类型的数据库。

使用的是DataStax Astra DB Cassandra-as-a-Service,这个服务可以在Cassandra数据库内创建和使用数据。

不过需要配置很多的参数:

-- 配置 Spring Data Cassandra
spring.cassandra.schema-action=CREATE_IF_NOT_EXISTS
spring.cassandra.request.timeout=10s
spring.cassandra.connection.connect-timeout=10s
spring.cassandra.connection.init-query-timeout=10s

#spring.cassandra.local-datacenter=datacenter1
#spring.cassandra.keyspace-name=spring_cassandra

--Astra 自动配置需要配置信息才能连接到云数据库
# Credentials to Astra DB
astra.client-id=<CLIENT_ID>
astra.client-secret=<CLIENT_SECRET>
astra.application-token=<APP_TOKEN>

# Select an Astra instance
astra.cloud-region=<DB_REGION>
astra.database-id=<DB_ID>
astra.keyspace=spring_cassandra

我这边没有申请这些Astra的账户密码。

后续的demo中,创建一个实体类,然后使用spring data Cassandra 去进行数据的存储与查找,它继承了 Spring Data Commons 项目的功能,包括派生查询的能力。

public interface VetRepository extends CrudRepository<Vet, UUID> {  
  Vet findByFirstName(String username);
}
@SpringBootApplication
public class AccessingDataCassandraApplication {
  public static void main(String[] args) {
    SpringApplication.run(AccessingDataCassandraApplication.class, args);
  }
  
  @Bean
  public CommandLineRunner clr(VetRepository vetRepository) {
    return args -> {
      vetRepository.deleteAll();
      
      Vet john = new Vet(UUID.randomUUID(), "John", "Doe", new HashSet<>(Arrays.asList("surgery")));
      Vet jane = new Vet(UUID.randomUUID(), "Jane", "Doe", new HashSet<>(Arrays.asList("radiology, surgery")));
      
      Vet savedJohn = vetRepository.save(john);
      Vet savedJane = vetRepository.save(jane);

      vetRepository.findAll()
        .forEach(v -> log.info("Vet: {}", v.getFirstName()));
      
      vetRepository.findById(savedJohn.getId())
        .ifPresent(v -> log.info("Vet by id: {}", v.getFirstName()));
    };
  }
}

使用起来和之前的Spring Data JPA、Spring Data Gemfire和Spring Data Neo4j类似。


中期回顾和小结

总体来说,每个guide涉及到一个spring的点,由于一篇guide中尽量不去涉及到其他内容,所以整体guide内容比较浅显, 一般只展示了其基本使用。

1、写一个简单的controller, 可以接受请求。

2、用RestTemplate去发送http请求。

3、用maven去构建java项目。

4、上传文件,核心内容是java.nio.file.Path类和java.nio.file.Files类,利用Files.copy(InputStream in, Path target, CopyOption… options)进行文件复制。

5、利用redis进行消息的发送和接收,虽然项目中一般使用redis作数据存储。在消息系统中,有消息的发布者和消息接收者,用StringRedisTemplate去发送消息,再定义一个消息监听容器(定义用到RedisConnectionFactory)。

7、讲了Spring Boot Actuator,是Spring Boot提供用于对应用系统进行自省和监控的功能模块。集成也比较简单,添加依赖即可。

8、guide里通过xml配置用srping integration创建了一个流服务, 也是分为输入适配器、处理通道、输出适配器等组件。未深入了解和掌握。

9、了解了spring batch,一个轻量级的批处理框架。包含的基本组件如下图
在这里插入图片描述
10、spring HATEOAS: 一个api库,可以使用它创建指向Spring MVC控制器的链接,其实就是响应中包含指向其它资源的链接,客户端可以利用这些链接和服务器交互。可以扩展了解下rest成熟度模型,第四层次就是HATEOAS。

11、讲了非侵入式事务 @Transactional注解的使用。

13、讲了jar包和war包,了解了二者的区别。

14、前端提交表单,后端进行处理。

15、使用websocket在浏览器和服务端之间发送消息,guide里用的是stomp协议。guide里展示的比较简单,和传统controller相比,服务端映射注解变成了@messageMapping,发送注解使用@SendTo。浏览器js里使用SockJs和stomp.js去创建socket链接和发请求。

16、编写一个简单的angularJS客户端,没有多了解。

17、了解了跨域,以及@CrossOrigin注解,是用来处理跨源资源共享(CORS)的注解。

20、基于WSDL去创建一个SOAP服务,只知道了概念,未深入了解。

21、讲了用STS的spring boot dashboard,把一个简单的web应用程序,部署到cloud Foundry的操作步骤。

22、用Vaadin去写CURD的UI页面,Vaadin类似于以前的java swing。

23、使用spring cloud config构建轻量级配置中心。基本工作原理图:
在这里插入图片描述

24、讲了怎么连接mysql去操作数据。

25、用spring rest docs为API生成文档,不过要和单元测试结合使用。

26、构建了一个简单的响应式编程服务。这个和传统的web服务地址路由和处理请求的方式不同,后续可以深入了解下。

27、在项目里加上一个简单的spring cloud gateway,其中gateway核心概念是route(路由)、predictae(预言)、filter(过滤器)这三个。

28、只简单介绍了spring cloud stream的概念,也就是source(来源),process(处理器)、sink(接收器)。

29、用spring cloud task构建短期的spring boot服务。

31、通过waveFront去查看应用的运行情况。

32、介绍了可以用来sercet管理加密的vault怎么去使用的。

33、使用spring data redis进行响应式编程,没看太懂,响应式代码编程这块都没有掌握,只了解了表面概念。

6、12、18、19、30、34:

这几个guide讲的东西大同小异,都基本是从某个地方获取数据,在spring data中repository类的基础上,进行各种数据存储与操作。

6 是从基于图形的数据库neo4j中获取数据,实体类查询接口扩展了Neo4jRepository接口类;

12 是从基于文档的数据库MongoDB中获取数据,实体类查询接口继承继承了MongoRepository接类;

18 使用 Spring Data REST 创建和检索存储在JPA中的数据;

19 使用 Spring Data REST 创建和检索存储在MongoDB中的数据;Spring Data REST 还支持Spring Data JPA、Spring Data Gemfire和Spring Data Neo4j作为后端数据存储。

30 是使用Spring提供的数据库响应式编程框架R2DBC去处理数据,实体类查询接口扩展ReactiveCrudRepository接口;

34 是从基于分布式的nosql数据库Cassandra中获取数据,然后进行数据的存储及处理。

上述多个guide中涉及到docker, 响应式编程,还未进行深入了解,后续会再看看这些。

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

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

相关文章

Scrum敏捷迭代规划和执行

Sprint Backlog看板 迭代工作的开展是围绕Sprint Backlog展开的&#xff0c;在Leangoo中&#xff0c;我们需要为每个迭代创建一个Sprint Backlog看板。Sprint Backlog&#xff08;迭代&#xff09;看板&#xff0c;用于管理当前Sprint的需求和开发任务&#xff0c;可视化展示每…

Cesium教程(七):加载自定义影像数据

GIS开发中经常需要调用本地或供应方发布的影像数据,加载独立的场景,此时可以借助GeoServer发 布自定义影像数据。 geoserver下载地址:geoserver下载 1、geoserver安装 1.1 安装方式1(推荐) 要求已安装tomcat:下载 Web Archive 版本的GeoServer,下载完毕解压,目 录如…

【JavaSE】Java基础语法(十九):接口新特性

文章目录 1. 接口组成更新概述2. 接口中默认方法3. 接口中静态方法4. 接口中私有方法 1. 接口组成更新概述 常量&#xff1a;接口可以定义全局常量&#xff0c;使用关键字public static final修饰。 抽象方法&#xff1a;接口中可以定义抽象方法&#xff0c;使用关键字public…

零基础如何入门网络安全?2023年专业学习路线看这篇就够了

前景 很多零基础朋友开始将网络安全作为发展的大方向&#xff0c;的确&#xff0c;现如今网络安全已经成为了一个新的就业风口&#xff0c;不仅大学里开设相关学科&#xff0c;连市场上也开始大量招人。 那么网络安全到底前景如何&#xff1f;大致从市场规模、政策扶持、就业…

汽车以太网通道和相关组件的测试

随着车载网络的发展&#xff0c;已经出现了CAN、LIN、FlexRay、MOST等成熟的协议&#xff0c;而基于LVDS/USB技术的链路传输模式也得到了广泛的应用。然而&#xff0c;面对不断提高的摄像头、显示器和不同传感器系统共享的更复杂信息分辨率&#xff0c;就需要更高的传输速度。 …

企业内容管理入门指南:从概念到实践,提升协作效率和质量

在现代企业管理中&#xff0c;存在一种容易被忽视但又极为重要的管理理念——企业内容管理。由于“企业内容”这一概念过于抽象&#xff0c;大家对它可能还比较模糊。所以&#xff0c;今天我们来聊聊企业内容管理。 在开始之前&#xff0c;对企业内容做一个简明的介绍&#x…

API对接是什么意思,技术分享

在计算机科学中&#xff0c;应用程序接口&#xff08;API&#xff09;是一种程序编程接口&#xff0c;定义了应用程序之间或应用程序和操作系统之间的通信方式。API对接就是在不同的应用程序之间实现数据交换和信息传输的过程。当两个不同的应用程序需要共享数据时&#xff0c;…

黄河千年清一回与人类健康

黄河千年清一回奏响一曲曲让人类走进幸福新时代的壮丽凯歌。疫情之后的首届全世界健康产业发展大会 5 月28 日上午 9 时在中国首都北京召开 The Yellow River has played a magnificent song of triumph in the millennium, ushering humanity into a new era of happiness. T…

常见通信名词的解释

在通信接口的介绍中&#xff0c;难免见到全双工/半双工/单工、同步/异步等这些名词。今天就专门来介绍一下这些名词。 1. 什么是全双工/半双工/单工 数据通信中&#xff0c;数据在线路上的传送方式可以分为单工通信、半双工通信和全双工通信三种。 单工通信&#xff1a;是指…

关于原生feign发起请求时,参数注解的相关问题

先说结论&#xff1a; POST请求必须指定请求头&#xff0c;body参数用RequestBody或者Param&#xff08;需要一个一个写&#xff09;。 GET请求&#xff0c;传参只能用QueryMap&#xff0c;后边变量是Map形式&#xff0c;哪怕是一个参数也必须放到map里边。如果是路径变量&…

MySql基础学习(1)

MySql基础学习 一、数据库1.1 什么是数据库1.2 MySql的启动与停止1.3 MySql数据模型 二、SQL2.1 SQL通用语法2.2 SQL分类2.2.1 数据类型2.2.2 DDL使用方法2.2.3 、表操作-修改&删除DDL总结 2.3 DML2.3.1 DML添加数据2.3.2 DML---修改数据2.3.3 DML---删除数据DML总结 2.4 D…

【C++从入门到放弃】vector深度剖析及模拟实现

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《C从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; vecto…

当二叉树遇上递归:如何判断单值二叉树?

本篇博客会讲解力扣“965. 单值二叉树”的解题思路&#xff0c;这是题目链接。 先来审题&#xff1a; 以下是输出示例&#xff1a; 以下是提示&#xff1a; 本题非常适合使用递归实现。分以下情况讨论&#xff1a; 若是空树&#xff0c;则符合单值二叉树的性质。若非空&am…

[Nacos] Nacos Server处理注销请求 (七)

文章目录 1.InstanceController.deregister()1.1 从请求中获取要操作的instance1.2 删除instance 1.InstanceController.deregister() 从请求中获取要操作的instance从注册表中获取service从获取的service中删除instance 1.1 从请求中获取要操作的instance private Instance g…

什么是SOAP

什么是SOAP 什么是SOAP? SOAP (Simple Object Access Protocol) 是一种基于XML的通信协议&#xff0c;用于在网络上交换结构化的信息。它被广泛用于分布式系统中的应用程序间通信。 SOAP定义了一组规范&#xff0c;描述了消息的格式、通信的方式和处理消息的过程。它允许应…

23种设计模式之解释器模式(Interpreter Pattern)

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将23种设计模式中的解释器模式&#xff0c;此篇文章为一天学习一个设计模式系列文章&#xff0c;后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大佬…

C语言打印九九乘法表的多种方式多种形式(完整,左上,左下,右上,右下)

&#x1f4e2;博客主页&#xff1a;肩匣与橘&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由肩匣与橘编写&#xff0c;首发于CSDN&#x1f649;&#x1f4e2;生活依旧是美好而又温柔的&#xff0c;你也是✨ …

机器学习_Lasso回归_ElasticNet回归_PolynomialFeatures算法介绍_02---人工智能工作笔记0037

Lasso回归用的是L1正则化可以看到,这里的alpha就是这里的alpha对吧,就是 L1的权重 然后对于ElasticNet回归来说,这里的alpha可以看到是L1权重的超参数对吧,然后这里的p,表示的是 L2正则里面的(1-p)这里 这里要提一下: L1和L2为什么能防止过拟合,它们有什么区别?通过添加…

使用CNN-LSTM来预测锂离子电池健康状态SOH(附代码)

对于电动汽车而言&#xff0c;动力锂电池的健康状态(State of Health,SOH)估算方法是电池管理系统中非常重要的一个方面。准确估计锂电池老化状态并预测电池剩余寿命对于电动汽车稳定安全运行有着重要的意义。借助数据驱动方法的思想&#xff0c;本文对锂离子电池寿命历史数据进…

【案例实战】SpringBoot整合EasyExcel实现列表导出功能

这篇文章会给大家实操一个关于列表导出成excel表格的功能&#xff0c;相信大家在日常工作中也会遇到列表导出的需求&#xff0c;看完本篇文章那么你就可以轻松的去整合列表导出的功能。 本次使用的导出工具是阿里巴巴开源的EasyExcel&#xff0c;关于EasyExcel我这里简单的介绍…