要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。
接着上篇看过的guide65,接着往下看。
guide66、Spring Cloud Circuit Breaker Guide
首先了解下Spring Cloud Circuit Breaker是Spring Cloud提供的一组用于实现断路器模式的组件,其中包括Hystrix和Resilience4J两种实现方式。
在了解下断路器模式:
断路器模式(Circuit Breaker Pattern)是一种用于处理分布式系统中故障的设计模式。在分布式系统中,各个服务之间的网络通信容易受到网络故障、超时、延迟、资源不足等问题的影响,如果不进行有效处理,可能会导致系统崩溃或无法正常工作。断路器模式通过在服务之间插入一个断路器组件,监控服务调用的状态,并在出现故障时自动切换到备用方案,避免了故障的传递和系统的崩溃。
断路器模式通常包含以下几个组件:
- 断路器状态:断路器可以处于开启、关闭或半开状态。开启状态表示服务调用失败,在一定时间内不会再次尝试调用服务;关闭状态表示服务调用正常,可以尝试调用服务;半开状态表示断路器正在尝试重新调用服务,如果调用成功,则切换到关闭状态,否则切换到开启状态。
- 断路器监控器:用于监控服务调用的状态,根据状态切换断路器状态。
- 服务调用:需要进行断路器保护的服务调用。
- 备用方案:当服务调用失败时,切换到的备用方案,通常是返回缓存数据、调用备用服务、返回默认值等。
断路器模式可以有效提高分布式系统的稳定性和可靠性,防止故障的传递和系统的崩溃,从而提高用户体验和业务效率。
这篇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框架剖析(接下来主要去看这块)。