实战SpringCloud响应式微服务系列教程(第八章)构建响应式RESTful服务

简介: 实战SpringCloud响应式微服务系列教程(第八章)构建响应式RESTful服务

1.使用springboot2.1.4构建RESTful风格服务

Springboot的设计是用来简化Spring应用程序的初始搭建和开发过程,为了实现这种简化效果,Springboot继承了众多第三方库,并大量使用约定优于配置的设计理念,通过特定的方式使得开发人员不再需要定义繁杂而且多余的配置内容。

1.1基于Springboot的第一个RESTful服务

微服务架构推崇采用RESTful风格实现服务之间的交互。关于RESTful,很多开发人员在知识体系上的一些误解和不足。我们先对RESTful风格做一个简单的介绍,然后详细阐述使用 SpringBoot构建单个RESTful服务的过程。

(1)RESTful风格简介

REST提出了一组建构约束条件和原则,满足这些约束条件和原则的设计风格就是RESTful。

现实世界中的事物都可以被认为一种资源,我们可以根据这些约束条件和原则设计以资源为中心的服务。REST中最重要的一条原则就是客户端和服务器之间的交互无状态性。

从客户端到服务器的每个请求都必须包含理解该请求所必需的信息,无状态请求可以由任何可用服务实现响应,十分适合微服务架构的运行环境。所以RESTful代表的实际上是一种风格,而不是一种设计和架构模式,更不是一种具体的技术体系。

关于RESTful另一个比较容易忽视的核心概念是HATEOAS(Hypermedia as the Engine of Application State,基于超媒体的应用状态引擎)。要解释HATEOAS的概念,先要解释什么是超媒体。

我们已经知道什么是超链接以及什么是超文本,其中超文本的特有优势是拥有超链接。如果把超链接映入到多媒体中,就得到了超媒体。因此关键要素还是超链接。使用过超媒体作为应用引擎状态,意思就是应用引擎的状态变更由客户端访问不同的超媒体资源来驱动。

使用HATEOAS表现服务请求响应的风格如下,可以看到这里多了_links属性,其中有一个self.href链接指向当前user资源。

GET http://api.example.com/users/tianyalan
Content-type:application/json
{
   _links:{
      self:{
         href:"/users/tianyalan"
       }
   }
  "id":"tianyalan",
   "name":"tianyalan",
   "email":"tianyalan@email.com"
}

HATEOAS在spring boot和spring cloud中应用也非常广泛,例如springboot提供了应用监控组件Actuator,通过Actuator可以获取springboot应用程序当前的运行状态,我们将在后续章节中详细介绍Actuator组件。

Actuator组件对外暴露的也是一些http端点,访问这些端点返回的数据跟常见的RESTful风格有所不同,这就是HATEOAS风格,所以可以参考相关资料进一步了解。

(2)引入spring-boot-starter-web工程

spring boot提供了一系列starter工程来简化各组件之间的依赖关系。

例如在springboot中开发基于RESTful风格的端点时,通常会引入spring-boot-starter-web这个工程,而打开这个工程会发现里面实际上只定义了如下所示的一些pom依赖,其中包括所有我们能够预见到的组件,例如非常经典的spring-web,spring-webmvc组件,可以看到spring-boot-starter-web还是基于这两个组件构建web请求响应流程的。

另外还包含了基于JSON序列化和反序列化的jackson-databind组件,以及启动内置tomcat服务器的spring-boot-starter-tomcat组件。

  • org.springframework.boot:spring-boot-starter
  • org.springframework.boot:spring-boot-starter-tomcat
  • org.springframework.boot:spring-boot-starter-validation
  • org.springframework.boot:spring-web
  • org.springframework.boot:spring-webmvc
  • org.fasterxml.jackson.core:jackson-databind

引入spring-boot-starter-web就像引入一个普通的maven依赖一样,代码如下:

   org.springframework.boot

   spring-boot-starter-web

一旦spring-boot-starter-web组件引入完毕,我们就可以充分利用springboot的自动装配机制开发单个服务。

(3)Application类

使用springboot的首要条件是构建一个Application启动类。代码如下:

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

结构比较固化。

显然以上代码关键的是@SpringBootApplication注解。springboot使用@SpringBootApplication注解来告诉spring容器具备该注解的类是整个spring容器中所有 javaBean对象的入口,而具备该注解的类在springboot中就是Application类。

在上面代码中,SoulApplication类就是整个容器的Application类。

@SpringBootApplication注解在指定Application类的同时,还会自动扫描与当前类同级以及子包下的@Component、@Service、@Repository、@Controller、@Entity等注解,并把这些注解对应的类转换为Bean对象全部加载到Spring容器中管理起来。
@SpringBootApplication注解的定义如下,我们可以看到该注解实际上由三个注解组合而成,分别是@Configuration、@EnableAutoConfigguration和@ComponentScan。
@Target(ElementType.TYPE)
@Retenation(RetentionPolicy.PUNTIME)
@Documented
@Inherited
@Configuration
@EnableAutoConfigguration
@ComponentScan
public @interface SpringBootApplication

在Spring 中@Configuration比较常见,提供javaConfig配置类实现。而@ComponentScan则扫描@Component等注解,帮相关的javaBean定义批量加载到IOC容器中。@EnableAutoConfigguration最终会使用JDK提供的SPI机制来实现类的动态加载。

关于@EnableAutoConfigguration注解更多的可以参考相关的资料。

我们还注意到在上面的代码示例中包含一个main函数并执行了ApplicationContext对象,我们可以根据需求对该ApplicationContext对象做响应处理。

(4)Controller类

Application类提供了Springboot程序的入口,相当于应用程序拥有了最基本的骨架。接下来我们就可以添加各种业务相关的访问入口,表现在RESTful风格上也就是一系列的Controller类所代表的的HTTP端点。

这里的Controller和springMvc的Controller在概念上是一致的。最简单的Controller如下:

@RestController
public class HelloController{
     @GetMapping("/")
     public String index(){
          return "Hello Spring Boot";
     }
}

以上代码包含了@RestController@GetMapping("/")两个注解。我们知道在springMvc中包含了@Controller注解用来表示当前类是一个servlet。

@RestController继承了@Controller,它告诉Springboot这是一个基于RESTful风格的HTTP端点,并会自动使用JSON实现HTTP请求和响应的序列化和反序列化操作。至于@GetMapper类似@RequestMapping,指定请求方式为GET。这里不做多余介绍。

以下代码展示了一个典型的Controller,在Controller中通过静态的业务代码完成了根据商品编号,获取商品信息的业务流程。

这里用到了两层Mapping注解,在服务层级定义了服务的版本和路径,分别为v1和products;而在操作级别有定义了HTTP请求方法的具体路径及参数信息。

@RestController
@RequestMapping("/v1/products")
public class Productontroller{
     @GetMapping("/{productCode}")
     public Product getProduct(@PathVariable String productCode){
          Product product = new Product();
          product .setId(1L);
   product .setPrice(100F);
   product .setProductCode("product001");
   product .setProductName("product");
   return product;
     }
}

系列章节目录

实战SpringCloud响应式微服务系列教程(第一章)

实战SpringCloud响应式微服务系列教程(第二章)

实战SpringCloud响应式微服务系列教程(第三章)

实战SpringCloud响应式微服务系列教程(第四章)

实战SpringCloud响应式微服务系列教程(第五章)

实战SpringCloud响应式微服务系列教程(第六章)

实战SpringCloud响应式微服务系列教程(第七章)

相关文章
|
6月前
|
负载均衡 算法 Java
【SpringCloud(4)】OpenFeign客户端:OpenFeign服务绑定;调用服务接口;Feign和OpenFeign
Feign是一个WebService客户端。使用Feign能让编写WebService客户端更加简单。 它的使用方法是定义一个服务接口然后再上面添加注解。Feign也支持可拔插式的编码器和解码器。SpringCloud对Feign进行了封装,十七支持了SpringMVC标准注解和HttpMessageConverters。 Feign可用于Eureka和Ribbon组合使用以支持负载均衡
854 138
|
6月前
|
算法 Java 微服务
【SpringCloud(1)】初识微服务架构:创建一个简单的微服务;java与Spring与微服务;初入RestTemplate
微服务架构是What?? 微服务架构是一种架构模式,它提出将单一应用程序划分为一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。 每个服务允许在其独立的进程中,服务于服务间采用轻量级的通信机制互相协作(通常是Http协议的RESTful API或RPC协议)。 每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。另外应当尽量避免统一的、集中式的服务管理机制,对具体的一个服务而言,应根据上下文,选择合适的语言、工具对其进行构建
616 126
|
6月前
|
负载均衡 算法 Java
【SpringCloud(2)】微服务注册中心:Eureka、Zookeeper;CAP分析;服务注册与服务发现;单机/集群部署Eureka;连接注册中心
1. 什么是服务治理? SpringCloud封装了Netfix开发的Eureka模块来实现服务治理 在传统pc的远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务于服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册
397 0
|
8月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1222 3
|
6月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
7月前
|
监控 安全 Java
Spring Cloud 微服务治理技术详解与实践指南
本文档全面介绍 Spring Cloud 微服务治理框架的核心组件、架构设计和实践应用。作为 Spring 生态系统中构建分布式系统的标准工具箱,Spring Cloud 提供了一套完整的微服务解决方案,涵盖服务发现、配置管理、负载均衡、熔断器等关键功能。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
422 1
|
7月前
|
jenkins Java 持续交付
使用 Jenkins 和 Spring Cloud 自动化微服务部署
随着单体应用逐渐被微服务架构取代,企业对快速发布、可扩展性和高可用性的需求日益增长。Jenkins 作为领先的持续集成与部署工具,结合 Spring Cloud 提供的云原生解决方案,能够有效简化微服务的开发、测试与部署流程。本文介绍了如何通过 Jenkins 实现微服务的自动化构建与部署,并结合 Spring Cloud 的配置管理、服务发现等功能,打造高效、稳定的微服务交付流程。
832 0
使用 Jenkins 和 Spring Cloud 自动化微服务部署
|
7月前
|
Kubernetes Java 微服务
Spring Cloud 微服务架构技术解析与实践指南
本文档全面介绍 Spring Cloud 微服务架构的核心组件、设计理念和实现方案。作为构建分布式系统的综合工具箱,Spring Cloud 为微服务架构提供了服务发现、配置管理、负载均衡、熔断器等关键功能的标准化实现。本文将深入探讨其核心组件的工作原理、集成方式以及在实际项目中的最佳实践,帮助开发者构建高可用、可扩展的分布式系统。
623 0
|
12月前
|
SpringCloudAlibaba Java Nacos
尚硅谷SpringCloud教程 笔记
本文介绍了基于Spring Cloud Alibaba构建的cloud-demo工程创建步骤,包括父模块及子模块的配置。父模块采用pom打包方式,定义了Java 8、Spring Boot 2.4.2、Spring Cloud 2020.0.1及Spring Cloud Alibaba 2021.1版本。包含三个主要模块:services(依赖Nacos)、service-order和service-product(均依赖spring-boot-starter-web)。同时提供了discoveryClient的测试代码,展示服务发现功能的实现与验证过程。
681 12
尚硅谷SpringCloud教程 笔记

热门文章

最新文章