Good in study, attitude and health

服务开发技术2022

一、简答题(8个*5分,共40分)

  1. ROA和RPC的区别 “ROA” 和 “RPC” 指的是两种不同的 API(应用程序编程接口)调用风格
    • RPC (Remote Procedure Call) - 远程过程调用
      • 定义: RPC是一种通信协议,允许程序在不显式了解远程通信细节的情况下调用另一个地址空间(通常是网络上的另一台计算机)中的过程或函数。它就像在本地调用函数一样简单。
      • 特点:
        • 通常是面向操作的,即关注要执行的动作
        • 请求通常包含要调用的函数名和参数。
        • 没有强制的资源概念。
        • 例如:CreateInstance(parameters...)DeleteUser(parameters...)
      • 应用: 传统上很多Web服务和内部系统集成使用RPC风格。
    • ROA (Resource-Oriented Architecture) - 资源导向架构
      • 定义: ROA是一种API设计风格,它将系统中的所有可操作实体视为资源。这些资源通过URI(统一资源标识符)进行识别,并通过标准HTTP方法(GET, POST, PUT, DELETE等)进行操作。RESTful API就是ROA的一种流行实现。
      • 特点:
        • 面向资源的,即关注要操作的数据实体
        • 使用标准HTTP方法(GET, POST, PUT, DELETE)对资源进行CRUD(创建、读取、更新、删除)操作。
        • URI代表资源,例如:/users/{id}/products/{id}
        • 更符合Web的语义和架构。
      • 应用: 现代Web服务、微服务架构中广泛采用。

2.资源、资源的表述、资源表述状态转移的关系 资源是一个很宽泛的概念,任何寄宿于Web可供操作的事物均可视为资源,就其本质而言,任何足够重要并被引用的事物都可以是资源.(URI的都可以为资源) 所以资源的表述实际是一段对于资源(在某个特定时刻的)状态的描述;客户端请求资源。往往也是想得到资源的当前状态 在RESTful架构中,资源是核心概念之一,资源的表述和状态转移也是RESTful架构的基本特征,它们之间的关系如下: 1. 资源:在RESTful架构中,资源是指网络上的任何信息实体,可以是一个文件、一张图片,一段文字、一个对象或者任何可以命名的事物,每个资源都有一个唯一的标识符(URI)来表示它在网络上的位置。 2. 资源的表述:资源的表述是资源的具体内容,可以是XML、JSON、HTML或任何其他格式的文本,在RESTful架构中,客户端通过请求资源的URI来获取资源的表述。 3. 状态转移:在RESTful架构中,客户端与服务器之间的交互是通过HTTP协议完成的,其中包括GET、POST、PUT和DELETE等请求方法,这些请求方法用于对资源进行状态转够,即客户端通过请求方法来操作资源的表述,使资源的状态发生变化 4. 资源表述状态转移的关系:在RESTful架构中,客户端通过请求资源的URI来获取资源的表述,然后使用HTTP请求方法对资源进行状态转移。客户端发送的请求中包含了资源的表述和请求方法,服务器根据请求方法对资源进行操作,并将操作结果返回给客户端。因此,资源、资源的表述和状态转移之间是密切相关的,它们共同构成了RESTful架构的基本特征。

3.HTTP中HEAD的作用(HTTP相关的内容) 获取服务器发送过来的报头信息,这些报头信息是在服务器发送资源的表述的时候被一起发送过来的。

4.常见HTTP中安全的操作 GET和HEAD

5.服务开发设计的基本步骤 1.资源分析与设计 2.暴露资源可执行接口 3.设计客户端表述 4.设计发给客户端的表述 5.多种资源整合到一起 6.规划服务交互的响应

6.如何开发前后端分离项目 基于 API 进行开发: 后端:选择技术栈、编写 API 接口、数据持久化和业务逻辑实现 前端:选择框架、API 调用和数据展示 数据库:设计数据库

7.OpenAPI有何作用 1. 开发者通过 API 来开放服务的访问和使用,可以帮助使用者更快、更可扩展地实现服务获取和调用,促进合作伙伴之间的协作与整合。 2. 引入 API 后,实现了前后端分离的开发, 3. 使得前后端工程师可以各司其职,各自开发,相对独立,前后端通过 API 进行交互,后端提供接口给前端,前端去调用该接口。

8.微服务设计中的微服务有何特点(至少2个) 1. 服务组件化 2. 按业务组织团队 3. 做产品的态度 4. 轻量化通信机制 5. 去中心化治理 6. 去中心化管理数据 7. 基础设施自动化 8. 容错设计 9. 演进式设计

二、收银员通过咖啡杯和咖啡师交流的案例

  1. 体现了什么设计思想(5分) RESTful 服务设计思想。微服务设计思想、解耦合、异步处理

  2. 对服务开发有什么启示(10分)

    1. 咖啡师忙不过来了——通过缓存提升可伸缩性
    2. 无状态性
    3. 异常处理
    4. 善用状态码
      1. 提升效率的关键是解耦,用户不与咖啡师见面,任何咖啡师可以服务任何顾客,这也是软件服务化的出发点。
      2. 系统灵活的关键是无状态,本案例通过咖啡师缓存提升了可伸缩性,服务系统中通过横向扩展服务实例实现了系统的弹性。
      3. 运转的关键是表述性状态转移,通过咖啡订单表述传递顾客需求到完成咖啡的各个状态。
      4. 善用链接,这就是“链接”成为引擎(HATEOAS)的意义。

三、查询机场航班列表,航班有起飞/降落、延误、取消等状态

  1. 要设计什么资源(5分)
    • 机场资源 (Airport):表示机场的信息,包括机场名称、机场代码等。
    • 航班资源 (Flight):表示航班的信息,包括航班号、起飞时间、降落时间、起飞机场、降落机场、状态等。
    • 航班状态资源 (FlightStatus):表示航班的状态信息,包括延误时间、取消原因等。
  2. 资源有哪些操作(10分)
    • 查询机场列表 (GET /airports):获取机场列表信息。
    • 查询航班列表 (GET /flights):根据起飞/降落时间、航班状态等条件查询航班列表信息。
    • 查询航班详情 (GET /flights/{flight_id}):根据航班号或航班ID获取航班的详细信息。
    • 更新航班状态 (PUT /flights/{flight_id}/status):更新航班的状态信息,例如延误时间、取消原因等。
    • 创建新航班 (POST /flights):创建新的航班信息。
    • 删除航班 (DELETE /flights/{flight_id}):删除指定的航班信息。

四、DDD(领域驱动设计,PPT中SPU和SKU的那个例子) 问:如何设计服务(15分) 1. 电商创建商品SPU,SPU (Standard Product Unit) 标准化产品单元,是商品信息聚合的最小单位 2. 电商创建商品SKU,SKU(StockKeeping Unit)是最小的库存单位,商品的进货、销售、售价、库存等最终都是以SKU为准。 3. 电商网站按照SKU增加商品库存 4. 顾客创建订单,电商网站锁定库存 5. 顾客支付订单,电商网站扣减库存 6. 顾客取消订单,电商网站恢复库存 7. 电商仓储发货 8. 顾客评价、投诉等

五、考jersey框架的一段代码,是用注解构成的一个简单的服务实现

@GET
@Path(/{username})
@Produces(text/plain;UTF-8)
public String hello2User(@PathParam("username") String username){
	return Hello +username;
}

(1) 该服务实现了什么功能? 该服务实现了一个简单的 RESTful Web 服务,其功能是: 当客户端向 /hello/{username} 路径(其中 {username} 是一个占位符,代表实际的用户名)发起一个 HTTP GET 请求时,服务会返回一个包含 “Hello “ 和该用户名字符串的响应。

(2) 四个注解的作用? 1. @GET - 作用: 这个注解是 JAX-RS (Java API for RESTful Web Services) 规范中的一个标准注解,用于指示被注解的方法处理 HTTP GET 请求。当客户端发送一个GET请求到对应的资源路径时,这个方法会被调用。 - 在代码中的体现: 声明 hello2User 方法将响应针对该资源路径的GET请求。 2. @Path("/{username}") - 作用: 这个注解用于定义资源或资源方法的相对URI路径。它可以应用于类(作为资源的根路径)或方法(作为相对于类路径的子路径)。花括号 {} 表示这是一个URI模板参数,它的值将从请求URI中提取。 - 在代码中的体现: 定义了 hello2User 方法的访问路径为 /hello/{username} (假设其所在的类有 @Path("/hello") 注解,或者这就是根路径)。{username} 是一个动态路径参数,会匹配URI中该位置的任何值。 3. @Produces("text/plain;UTF-8") - 作用: 这个注解用于指定资源方法能够生成的媒体类型(MIME类型)。它告诉客户端,此方法将以何种格式返回响应数据。它对应HTTP响应头中的 Content-Type 字段。 - 在代码中的体现: 指示 hello2User 方法将以纯文本格式 (text/plain) 返回响应,并且文本编码是UTF-8。这意味着客户端接收到的响应正文将是纯字符串,不包含HTML、JSON或XML等结构。 4. @PathParam("username") - 作用: 这个注解用于将URI路径模板中定义的路径参数(由 @Path 注解中的 {} 定义)的值注入到方法参数中。JAX-RS运行时会自动从请求URI中解析出对应的路径参数值,并将其绑定到被 @PathParam 注解的方法参数上。 - 在代码中的体现: 将URI路径 /hello/{username}{username} 位置的值提取出来,并将其作为 String 类型赋值给 hello2User 方法的 username 参数。这样,如果请求是 /hello/Alice,那么 username 参数的值就是 “Alice”。