《Spring Guides系列学习》guide66 - guide68及小结

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

在这里插入图片描述

接着上篇看过的guide65,接着往下看。

guide66、Spring Cloud Circuit Breaker Guide

首先了解下Spring Cloud Circuit Breaker是Spring Cloud提供的一组用于实现断路器模式的组件,其中包括Hystrix和Resilience4J两种实现方式。

在了解下断路器模式:

断路器模式(Circuit Breaker Pattern)是一种用于处理分布式系统中故障的设计模式。在分布式系统中,各个服务之间的网络通信容易受到网络故障、超时、延迟、资源不足等问题的影响,如果不进行有效处理,可能会导致系统崩溃或无法正常工作。断路器模式通过在服务之间插入一个断路器组件,监控服务调用的状态,并在出现故障时自动切换到备用方案,避免了故障的传递和系统的崩溃。

断路器模式通常包含以下几个组件:

  1. 断路器状态:断路器可以处于开启、关闭或半开状态。开启状态表示服务调用失败,在一定时间内不会再次尝试调用服务;关闭状态表示服务调用正常,可以尝试调用服务;半开状态表示断路器正在尝试重新调用服务,如果调用成功,则切换到关闭状态,否则切换到开启状态。
  2. 断路器监控器:用于监控服务调用的状态,根据状态切换断路器状态。
  3. 服务调用:需要进行断路器保护的服务调用。
  4. 备用方案:当服务调用失败时,切换到的备用方案,通常是返回缓存数据、调用备用服务、返回默认值等。

断路器模式可以有效提高分布式系统的稳定性和可靠性,防止故障的传递和系统的崩溃,从而提高用户体验和业务效率。

这篇guide采用的是Resilience4J。

要简单实现断路器,要设置至少两个服务。

先设置一个Bookstore服务,可以访问/recommended端点,然后返回String。

@RestController
@SpringBootApplication
public class BookstoreApplication {

  @RequestMapping(value = "/recommended")
  public Mono<String> readingList(){
    return Mono.just("Spring in Action (Manning), Cloud Native Java (O'Reilly), Learning Spring Boot (Packt)");
  }

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

再启动另外一个服务reading,算作是bookstore应用程序的前端,我们在reading服务提供/to-read接口,该接口从bookstore调用服务。

@Service
public class BookService {
  private static final Logger LOG = LoggerFactory.getLogger(BookService.class);
  private final WebClient webClient;
  private final ReactiveCircuitBreaker readingListCircuitBreaker;
  public BookService(ReactiveCircuitBreakerFactory circuitBreakerFactory) {
    this.webClient = WebClient.builder().baseUrl("http://localhost:8090").build();
    this.readingListCircuitBreaker = circuitBreakerFactory.create("recommended");
  }

  public Mono<String> readingList() {
    return readingListCircuitBreaker.run(webClient.get().uri("/recommended").retrieve().bodyToMono(String.class), throwable -> {
      LOG.warn("Error making request to book service", throwable);
      return Mono.just("Cloud Native Java (O'Reilly)");
    });
  }
@RestController
@SpringBootApplication
public class ReadingApplication {
    
  @Autowired
  private BookService bookService;
  
  @RequestMapping("/to-read")
  public Mono<String> toRead() {
    return bookService.readingList();
  }
  public static void main(String[] args) {
    SpringApplication.run(ReadingApplication.class, args);
  }
}

注意两个服务端口要不同,然后运行两个端口,访问localhost:8080/to-read,

会返回:

在这里插入图片描述

关闭bookstore服务,熔断器齐了作用,返回:
在这里插入图片描述


guide67、Building a Guide with VS Code

就是介绍下用vs code创建和打开项目。


Building a GraphQL service

GraphQL是一种用于API设计的查询语言和运行时环境。它可以让客户端应用程序准确地描述它们需要的数据,并从API中获取它们,而不是返回整个文档或数据集,从而提高了API的效率和可扩展性。

使用 Spring for GraphQL 创建服务器的主要步骤:

  • 定义 GraphQL 模式
  • 实现逻辑以获取查询的实际数据

guide中的应用程序就是一个简单的 API,用于获取特定书籍的详细信息。

定义graphql模式:

type Query {
    bookById(id: ID): Book
}

type Book {
    id: ID
    name: String
    pageCount: Int
    author: Author
}

type Author {
    id: ID
    firstName: String
    lastName: String
}

每个 GraphQL schema 都有一个顶级Query类型,它下面的字段是应用程序公开的查询操作。这里的模式定义了一个名为查询的查询bookById,它返回一本特定书籍的详细信息。

还定义了Book和Author两种类型。

在GraphQL中,Schema(模式)定义了API的类型系统和可用操作。它是一个描述所有可用类型和操作的约定。
Schema由类型定义和字段定义组成,它定义了可用的查询和变更操作以及它们的参数和返回类型。Schema还定义了类型之间的关系,例如对象之间的关联、列表和非空约束等。
在GraphQL中,Schema是API的核心,它定义了客户端可以查询的所有数据和操作。客户端可以使用Schema来构建查询,并使用Schema来验证查询是否符合API的约定。

数据来源:

GraphQL 的一个关键优势是可以从任何地方获取数据。数据可以来自数据库、外部服务或静态内存列表。

为了简化教程,书籍和作者数据将来自各自类中的静态列表。

创建Book和Author数据源:也就是Book和Author类

public class Author {
    private String id;
    private String firstName;
    private String lastName;
    private static List<Author> authors = Arrays.asList(
            new Author("author-1", "Joshua", "Bloch"),
            new Author("author-2", "Douglas", "Adams"),
            new Author("author-3", "Bill", "Bryson")
    );
    public static Author getById(String id) {
        return authors.stream()
                .filter(author -> author.getId().equals(id))
                .findFirst()
                .orElse(null);
    }
    ...
public class Book {
    private String id;
    private String name;
    private int pageCount;
    private String authorId;
    private static List<Book> books = Arrays.asList(
            new Book("book-1", "Effective Java", 416, "author-1"),
            new Book("book-2", "Hitchhiker's Guide to the Galaxy", 208, "author-2"),
            new Book("book-3", "Down Under", 436, "author-3")
    );
    public static Book getById(String id) {
        return books.stream()
                .filter(book -> book.getId().equals(id))
                .findFirst()
                .orElse(null);
    }
    ...

Spring for GraphQL 提供了一种基于注解的编程模型。使用控制器注解方法,我们可以声明如何获取特定 GraphQL 字段的数据。

@Controller
public class BookController {
    @QueryMapping
    public Book bookById(@Argument String id) {
        return Book.getById(id);
    }

    @SchemaMapping
    public Author author(Book book) {
        return Author.getById(book.getAuthorId());
    }
}

通过定义一个被@QueryMapping注释的方法bookById,就可以获取Book。

@Argument是一个GraphQL Java库中的注解,用于将方法参数映射到GraphQL查询或变量中的参数。通过将@Argument注解添加到处理程序方法的参数上,可以指定参数的名称、类型、默认值和是否必需等信息。这样,GraphQL查询就可以使用相应的参数来调用处理程序方法。

GraphiQL 是一个有用的可视化界面,用于编写和执行查询等。通过将此配置添加到application.properties文件来启用 GraphiQL。

spring.graphql.graphiql.enabled=true

启动程序后,导航到:http://localhost:8080/graphiql?path=/graphql

左边输入查询语句:

在这里插入图片描述

也可以用postman测试:

在这里插入图片描述


后半部分小结:

35:介绍了spring里的调度任务,核心是注解@Scheduled和@EnableScheduling。

36:用gradle去创建管理项目,构建方式类似于maven,核心在于build.gradle文件。

37:主要介绍了jdbcTemplate的使用,其就是在jdbc上面对数据库的操作做了深层次的封装。

38:用Spring Security的嵌入式LDAP服务器保护应用程序。

39:用RabbitTemplate来进行消息的发送和接收。RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件。

40:通过javax.validation中的验证注解对表单输入进行检查。

41:用jms进行消息的发送接收。其中使用JmsTemplate来发消息。

42:介绍了spring security, SecurityFilterChain bean定义哪些URL路径被保护, 哪些不用经过身份验证。

43:在Apache Geode数据管理系统上,使用spring data进行数据操作。

44:利用spring cache将数据缓存到Apache Geode。

45:使用 Spring Data JPA 存储和检索数据

46、介绍了spring mvc框架,请求从客户端发送到控制器(Controller),然后控制器根据业务逻辑处理请求,并将结果传递给视图(View),最后视图将结果渲染成 HTML 或其他格式的响应发送给客户端。

47、创建异步的方法,讲了@Async注解。

48、用springboot构建程序。

49、使用sts的简易教程,现在都不用sts了。

50、用jquery去ajax访问restful服务。

51、介绍了解了soap服务。

52、使用Spring Data REST检索存储在Neo4j NoSQL的数据。

53、使用Spring Data REST检索数据,和上篇讲的基本一致,就是把底层数据存储结构变为了Pivotal GemFire。

54、使用spring缓存,核心是@cacheable、@cacheput等注解。

55、介绍使用intelliJ IDEA创建打开程序。

56、用Eureka来做服务注册中心,进行服务注册和发现。

57、用spring进行单元测试,除了springTest注解可以加载整个应用上下文之外,还可以使用@WebMvcTest注解,将测试缩小到web层。

58、用maven进行多模块管理,这个也在之前部门项目里学习过。

59、使用google cloud pub/sub进行消息传输,仅了解。

60、一种API设计模式Consumer Driven Contracts,其中API使用者定义了他们期望API提供者提供的行为。

61、使用Vault,将配置属性存储在 Vault 中,构建 Spring 应用程序并将其与 Vault 连接使用。Vault 是一个数据管理系统,允许存储静态加密的敏感数据。

62、将一个应用程序部署到Azure的操作步骤,仅了解下。

63、构建一个微服务应用程序,该应用程序使用 Spring Cloud LoadBalancer 在对另一个微服务的调用中提供客户端负载平衡。核心是@LoadBalanced 以及@LoadBalancerClient 注解。

64、介绍了解了Spring Cloud Data Flow ,一个用于构建和管理数据流管道的开源工具。

65、介绍了Kubernetes, 也就是K8s,开源的容器编排和管理平台。

66、了解Spring Cloud Circuit Breaker,是Spring Cloud提供的一组用于实现断路器模式的组件。

67、介绍用vs code创建打开项目。

68、介绍了GraphQL,是一种用于API设计的查询语言和运行时环境。它可以让客户端应用程序准确地描述它们需要的数据,并从API中获取它们,而不是返回整个文档或数据集。

目前guide已基本看完,还有一些模块没有深入了解,比如:docker、 响应式编程、k8s、spring框架剖析(接下来主要去看这块)。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tatuk GIS Developer Kernel for .NET 11.77 Crack

Tatuk GIS Developer Kernel for .NET 是一个变体&#xff0c;它是受控代码和 .NET GIS SDK&#xff0c;用于为用户 Windows 操作系统创建 GIS 专业软件的过程。它被认为是一个完全用于 Win Forms 的 .NET CIL&#xff0c;WPF 的框架是为 C# 以及 VB.NET、VC、oxygen 以及最终与…

netty学习第一课

技术主题 Netty是一个基于Java NIO&#xff08;非阻塞 I/O&#xff09;框架的网络编程框架。它提供了一系列的高级网络编程API&#xff0c;使得开发者可以非常容易地实现高性能、高可靠性的网络应用。Netty具有非常好的可扩展性和灵活性&#xff0c;能够很好地支持多种协议和数…

数字图像处理①基于ADMM的全变分去噪算法

文章目录 1. Problem2. 仿真结果3. MATLAB算法4. 源码地址参考文献 1. Problem 在图像处理中&#xff0c;图像信号总会因为各种原因受到噪声的干扰&#xff0c;其中高斯噪声就是典型的干扰类型之一。 针对图像去噪的模型有很多种&#xff0c;其中全变分模型被认为是最有效的模…

linux中断

一 Linux中断原理 Linux中断&#xff08;Interrupt&#xff09;是指在计算机执行过程中&#xff0c;由于某些事件发生&#xff08;例如硬件请求、错误、异常等&#xff09;&#xff0c;CPU暂停当前正在执行的程序&#xff0c;转而执行相应的处理程序的过程。中断是计算机多任务…

Flask+表格静态展示

Python网页开发&#xff08;持续更新ing…&#xff09; 诸神缄默不语-个人CSDN博文目录 本文的需求场景是&#xff1a;我现在有一个JSON格式的表格&#xff0c;这个具体格式不重要相信你们能看懂其他格式的表格怎么改。总之我想用PythonFlask提取这个表格&#xff0c;并展示在…

【网络编程一】初识网络:IP与端口号 网络模型

目录 &#x1f31f;需要知道 一、基础概念 &#x1f308;1、IP地址与端口号 &#x1f308;2、五元组 二、协议分层 &#x1f308;1、OSI七层网络网络模型 &#x1f308;2、TCP/IP五层(四层)模型 &#x1f308;3、封装和分用&#xff08;重点&#xff01;&#xff09; &…

软件测试基础篇

文章目录 一、软件测试的生命周期二、BUGBUG的描述BUG的级别BUG生命周期产生争执怎么办?如何开始第一次测试测试的执行和BUG的管理 一、软件测试的生命周期 软件测试的生命周期&#xff1a; 1.需求分析&#xff1a;需求是否完整&#xff0c;需求是否正确 2.测试计划&#xff…

串口屏-迪文10寸T5串口屏数据交互

效果演示 为了便于理解 建议先看上篇博客 点击跳转到上一篇博客 正式开始 1 打开DGUS 2 如图点击文本显示 数据变量 3 填写数据地址 按步骤操作 3-1 先点击框选1处 3-2 再点击框选2处改地址 我改的1000 3-3 设置完直接导出 插入U盘替换DWSET文件夹文件(这一步不理解去看上一…

C++ set类成员函数介绍 (set和multiset)

目录 &#x1f914;set模板介绍&#xff1a; &#x1f914;特点&#xff1a; &#x1f914;set的成员函数&#xff1a; &#x1f60a;set构造函数&#xff1a; &#x1f50d;代码实例&#xff1a; &#x1f50d;运行结果&#xff1a; &#x1f60a; set赋值函数&#xf…

Linux——线程的同步与互斥

目录 模拟抢火车票的过程 代码示例 thread.cc Thread.hpp 运行结果 分析原因 tickets减到-2的本质 解决抢票出错的方案 临界资源的概念 原子性的概念 加锁 定义 初始化 销毁 代码形式如下 代码示例1&#xff1a; 代码示例2&#xff1a; 总结 如何看待锁 申…

【C++】STL中stack的用法及模拟实现

目录 一、stack的简介二、stack的使用三、stack的模拟实现 一、stack的简介 stack是一种容器适配器&#xff0c;专门用在后进先出操作的上下文中环境中&#xff0c;其中的元素只允许从容器固定的一端进行插入和删除操作。stack是作为容器适配器来实现的&#xff0c;容器适配器…

信息安全实践1.3(HTTPS)

前言 做这个实验对Tomcat的版本有要求&#xff0c;最好是使用Tomcat8。因为我之前使用Tomcat10&#xff0c;然后一直做不出来。 要求 部署Web服务器端HTTPS功能&#xff0c;通过网络嗅探分析HTTPS通过SSL实施安全保护的效果 关键步骤 首先要给tomcat配置https&#xff0c;也…

Unity3D安装:离线安装 Unity

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D工具链 3D工具集&#xff1a; NSDT简石数字孪生 在没有 Hub 的情况下离线安装 Unity Unity 下载助手 (Download Assistant) 支持离线部署。在这种部署方式中&#xff0c;可下载用于安装 Unity 的所有文件&#xff0c;然后生成脚本…

采购申请审批测试

采购申请审批的配置并不难&#xff0c;但是总会有原因导致业务无审批策略&#xff0c;而且这个配置也比较脆弱&#xff0c;有时同步也会出现问题&#xff0c;小编利用这篇操作记录下测试结果。 1、项目类别的审批策略分类 下图是审批策略分类-项目类别不给值&#xff0c;测试…

(浙大陈越版)数据结构 第三章 树(上) 3.4 小白专场:树的同构(PTA编程题讲解)

题意理解和二叉树表示 给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换变成T2&#xff0c;则称两棵树是“同构”的。 eg1&#xff1a;现请你判断如下两棵树&#xff08;左侧为T1&#xff0c;右侧为T2&#xff09;是否为同构树&#xff1f; 显然T1可以通过有限次左右孩子…

如何利用IDEA将Git分支代码回退到指定历史版本

一、背景 作为一名后端开发&#xff0c;相信大家一定遇到过这样的情景&#xff0c;代码开发人员过多&#xff0c;并且开发分支过多&#xff0c;导致代码版本管理困难&#xff0c;这样就难免遇到一些代码合并出错&#xff0c;比如&#xff0c;当我提交了本次修改到本地和远程分…

jsp页面调试

现象: 访问jsp页面, 页面为空, 网络请求显示失败, 控制台打印错误net::ERR_INCOMPLETE_CHUNKED_ENCODING 200 分析: 错误描述&#xff1a;编码模块不完整&#xff0c;返回浏览器的流不完整 可能得原因: 1、网络是否稳定 2、服务器端是否有对响应数据做限制&#xff0c;比如…

photoshop矫正扫描图片的倾斜问题以及修改图片内容

由于工程原因&#xff0c;资料需要重新梳理 1.扫描工程表格到电脑中 2.在ps中导入表格内容&#xff08;表格有时候是倾斜的&#xff09; 需要修正为正常状态&#xff0c;即垂直状态 设置步骤&#xff1a; 1.调整ps的背景颜色与所在图片的背景颜色一致 用吸管工具&#xff…

【thingsboard+NodeRed+chirpstack】实现Lora节点设备的数据上下行通讯

本文主要实现基于 thingsboard+NodeRed+chirpstack 实现 lora设备的数据上下行通讯。 NodeRed作为mqtt桥接器,在开源的社区版 thingsboard上实现 这里写目录标题 LoRa 设备上下行通讯方案数据上行数据下行Device 层面创建设备时,要添加 relation规则链层面灯控模块规则链规则…

Sentinel降级规则

1.降级规则简介 官方文档 熔断降级概述 除了流量控制以外&#xff0c;对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块&#xff0c;可能是另外的一个远程服务、数据库&#xff0c;或者第三方 API 等。例如&#xff0c;支付的…