小白入门微服务(3) - 什么是 API gateway

本文介绍了API网关的概念及其在微服务架构中的重要性。通过实例说明了API网关如何解决客户端与多个微服务交互时的问题,包括协议不统一、数据整合及服务地址变动等挑战。

概述

  • 前言
  • 什么是 API gateway
  • 为什么要用 API gateway
  • 后记

前言

一开始吧,感觉我也描述不好什么是 API gateway,在看了这篇文章https://microservices.io/patterns/apigateway.html)之后,感觉豁然开朗,那么我这边就用我的语言来描述一遍。

什么是 API gateway

API gateway 处于客户端与各个微服务之间,它担任了反向代理的角色,将不同的请求路由到相对应的微服务中去。与此同时,它还有以下功能:安全,限流,缓存,日志,监控,重试,熔断等。

为什么要用 API gateway

首先我们来大胆想想一下,你是一个公司的 CTO,你公司的产品是要做一个类似于当当的卖书产品,叫【叮叮当当】。那么你的产品可能有以下三端:

  • 网页版
  • Android/iOS 客户端
  • 小程序
    当然你的产品做得足够大的话,你有必要开放一些给第三方调用的 REST API 接口。
    那么现在来讨论一下产品的一些功能:
  • 登录注册(登录注册、用户基础信息的存取)
  • 价格服务(记录价格、双十一特价、秒杀价、优惠券价等价格的计算)
  • 产品服务(产品信息、名称、单价、图片展示)
  • 库存服务(记录产品库存)
  • 评价服务(购买商品后的客户评价、讨论区)
  • 第三方开放接口(例如:微信开放平台,提供给第三个调用的接口)

那么问题来了:
问题来了:
来了:

  • 客户端与众多微服务交互,协议不统一,有些协议是对客户端不友好的。
  • 数据不统一,可能在一个操作中,需要多个微服务的数据组装起来,才是我们一次请求想要的数据。
  • 微服务 ip 和 port 改变,客户端无法感知。
  • 不同的终端需要不同的数据,移动端可能仅仅 json 数据就能解决问题,网页端可能需要更多的数据展示。

解决方案 – API gateway(如图)
使用 API gateway,那么众多问题都得到解决:

  • 各个微服务先与 API gateway 交互,转换成客户端友好的 REST API。
  • 在 API gateway 中组装好数据再返回给客户端。
  • 在 API gateway 中修改 ip 与 port 客户端无感知,正常使用。
  • 采用多个 API gateway ,不同 API gateway 响应不同的数据给不同终端。

产品架构

多 API gateway 架构
如此修改之后,众多问题都迎刃而解,客户端对众多微服务是无感知的。

后记

真正的微服务架构还远不止这些东西,还有服务注册、服务发现等等。这里只是带领你入个门,后面会循序渐进,逐步走向完整。很高兴你能看到这里,又进一步学习了微服务。
个人的知识储备总是有限的,如有错误的地方,还请大佬斧正。点击阅读原文,链接到我的知乎,我会在知乎上对文章错误的地方进行修改。

本篇文章首发于公众号「zone7」,关注公众号获取最新推文,后台回复【小白微服务】获取源码。

<think>好的,用户想在10天内完成一个微服务基本项目,但他是计算机小白。首先,我需要考虑他的现有知识水平。作为小白,可能对编程、网络、数据库等基础概念了解有限。所以,必须设计一个适合他的学习路径,既不能太复杂让他放弃,又要在短时间内完成项目。 接下来,分解目标。微服务涉及多个方面,比如服务拆分、API设计、服务通信、数据库、部署等。要在10天内完成,必须简化某些部分,使用现成的工具和框架来减少编码量。比如,推荐Spring Boot和Spring Cloud,因为它们有丰富的文档和社区支持,而且有很多快速生成的工具。 然后,时间安排。需要将10天分成几个阶段,每个阶段完成特定任务。前三天可能需要学习基础,比如Java语法、Spring Boot创建简单API,Docker的基本使用。中间几天实现核心微服务功能,如服务注册、API网关、配置中心。最后几天集成和部署。 还要考虑用户可能遇到的困难。例如,环境配置、依赖管理、错误调试。这时候需要推荐一些自动化工具,比如Spring Initializr生成项目结构,Docker简化环境配置,Postman测试API,这些工具能减少手动操作的复杂度。 另外,项目示例的选择也很重要。应该选择一个简单的业务场景,比如用户管理和订单管理,这样不需要复杂的业务逻辑,重点放在微服务架构的实现上。每个服务只做基本的CRUD操作,通过RestTemplate或Feign进行通信。 文档和社区资源是关键。用户可能需要查阅官方文档或视频教程,比如Spring的官方指南、B站上的入门教程。同时,加入社区如Stack Overflow或掘金,遇到问题可以快速寻求帮助。 最后,部署部分可能需要使用现成的云服务,比如阿里云或腾讯云,或者本地使用Docker Compose来编排容器。这比手动配置服务器更简单,适合新手。 总结下来,需要将学习内容模块化,每天有明确的目标,利用现有工具和框架降低难度,重点放在实践上,通过做项目来学习,而不是先学完所有理论。同时,鼓励用户遇到问题时积极查找资料和求助,保持动力,逐步完成每个小任务,最终在10天内搭建起一个基本的微服务项目。</think>让我们用「搭建在线商城的用户+订单服务」为案例,分10天攻克微服务核心技能: --- **📅 第1-2天:基础搭建** 1. 安装工具包:JDK17 + IntelliJ IDEA + Docker Desktop + Postman 2. 用Spring Initializr创建两个服务: ```bash # 用户服务 Dependencies: Web, Data JPA, Lombok, MySQL Driver # 订单服务 Dependencies: Web, Data JPA, Lombok, MySQL Driver, OpenFeign ``` 3. 编写第一个接口: ```java // UserController.java @GetMapping("/hello") public String hello() { return "用户服务已启动!"; } ``` --- **📅 第3天:服务通信** 1. 在订单服务添加Feign客户端: ```java @FeignClient(name = "user-service") public interface UserClient { @GetMapping("/users/{id}") User getUser(@PathVariable Long id); } ``` 2. 实现订单查询时获取用户信息: ```java // OrderService.java public Order getOrderWithUser(Long orderId) { Order order = orderRepository.findById(orderId); User user = userClient.getUser(order.getUserId()); order.setUser(user); return order; } ``` --- **📅 第4天:服务注册发现** 1. 新增Nacos注册中心(Docker一键启动): ```bash docker run --name nacos -p 8848:8848 -e MODE=standalone nacos/nacos-server ``` 2. 所有服务添加配置: ```yaml spring: cloud: nacos: discovery: server-addr: localhost:8848 ``` --- **📅 第5天:API网关** 1. 创建网关服务,添加路由配置: ```yaml spring: cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path=/api/users/** - id: order-service uri: lb://order-service predicates: - Path=/api/orders/** ``` --- **📅 第6天:配置中心** 1. 在Nacos创建公共配置: ```yaml # common-config.yaml logging: level: root: INFO spring: datasource: url: jdbc:mysql://localhost:3306/microservice username: root password: 123456 ``` 2. 服务端通过bootstrap.yaml加载配置: ```yaml spring: cloud: nacos: config: server-addr: localhost:8848 file-extension: yaml shared-configs[0]: data-id: common-config.yaml refresh: true ``` --- **📅 第7天:数据库隔离** ```sql -- 用户库 CREATE DATABASE user_db; CREATE TABLE users ( id BIGINT PRIMARY KEY, name VARCHAR(50), email VARCHAR(100) ); -- 订单库 CREATE DATABASE order_db; CREATE TABLE orders ( id BIGINT PRIMARY KEY, user_id BIGINT, product_name VARCHAR(100) ); ``` --- **📅 第8天:容器化部署** 1. 为每个服务编写Dockerfile: ```dockerfile FROM openjdk:17-jdk-slim COPY target/*.jar app.jar ENTRYPOINT ["java","-jar","/app.jar"] ``` 2. 使用docker-compose编排: ```yaml version: &#39;3&#39; services: nacos: image: nacos/nacos-server ports: - "8848:8848" user-service: build: ./user-service depends_on: - nacos order-service: build: ./order-service depends_on: - nacos ``` --- **📅 第9天:熔断降级** 1. 在Feign客户端添加降级逻辑: ```java @FeignClient(name = "user-service", fallback = UserFallback.class) public interface UserClient { //... } @Component public class UserFallback implements UserClient { public User getUser(Long id) { return new User(0L, "默认用户", "service@unavailable"); } } ``` --- **📅 第10天:全链路测试** 1. 使用Postman验证核心流程: ``` [POST] /api/users → 创建用户 [POST] /api/orders → 创建订单(需用户ID) [GET] /api/orders/{id} → 查看带用户信息的订单 ``` 2. 模拟服务宕机测试熔断机制 --- 💡 **学习建议**: 1. 遇到报错时先看控制台日志(90%的问题都有提示) 2. 善用Spring官方文档:https://spring.io/projects/spring-cloud 3. 代码每天备份到GitHub(防止意外丢失) 4. 完成基础版后可扩展:JWT认证、ELK日志收集、Prometheus监控 通过这个实战流程,你将掌握微服务的核心架构模式,后续可快速扩展到更复杂的业务场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值