服务开发技术2022
一、简答题(8个*5分,共40分)
- 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服务、微服务架构中广泛采用。
- RPC (Remote Procedure Call) - 远程过程调用
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. 演进式设计
二、收银员通过咖啡杯和咖啡师交流的案例
-
体现了什么设计思想(5分) RESTful 服务设计思想。微服务设计思想、解耦合、异步处理
-
对服务开发有什么启示(10分)
- 咖啡师忙不过来了——通过缓存提升可伸缩性
- 无状态性
- 异常处理
- 善用状态码
- 提升效率的关键是解耦,用户不与咖啡师见面,任何咖啡师可以服务任何顾客,这也是软件服务化的出发点。
- 系统灵活的关键是无状态,本案例通过咖啡师缓存提升了可伸缩性,服务系统中通过横向扩展服务实例实现了系统的弹性。
- 运转的关键是表述性状态转移,通过咖啡订单表述传递顾客需求到完成咖啡的各个状态。
- 善用链接,这就是“链接”成为引擎(HATEOAS)的意义。
三、查询机场航班列表,航班有起飞/降落、延误、取消等状态
- 要设计什么资源(5分)
- 机场资源 (Airport):表示机场的信息,包括机场名称、机场代码等。
- 航班资源 (Flight):表示航班的信息,包括航班号、起飞时间、降落时间、起飞机场、降落机场、状态等。
- 航班状态资源 (FlightStatus):表示航班的状态信息,包括延误时间、取消原因等。
- 资源有哪些操作(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”。