《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框架剖析(接下来主要去看这块)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值