视频加载失败

每日一记(8/28):Nacos、OpenFeign 与网关构建微服务调用链

802 字
4 分钟
每日一记(8/28):Nacos、OpenFeign 与网关构建微服务调用链

服务发现:接入 Nacos 四步#

  • 引入依赖:spring-cloud-starter-alibaba-nacos-discovery
  • 配置 Nacos 地址:spring.cloud.nacos.discovery.server-addr 指向注册中心实例
  • 服务发现:借助 Spring Cloud 的 DiscoveryClient 拉取目标服务的实例列表
  • 手写负载均衡:从实例列表里轮询或随机挑一个实例,拼出 uri,发起远程调用
@Autowired
private DiscoveryClient discoveryClient;
public String callOrderService() {
List<ServiceInstance> instances = discoveryClient.getInstances("order-service");
if (instances == null || instances.isEmpty()) {
throw new RuntimeException("服务暂无可用实例");
}
// 手写负载均衡:简单轮询
ServiceInstance instance = instances.get(counter.getAndIncrement() % instances.size());
String uri = instance.getUri().toString(); // 如 http://192.168.1.10:8081
return restTemplate.getForObject(uri + "/hello", String.class);
}

手写方案的缺点很明显:每个调用方都要自己写一遍「查列表 + 选实例 + 拼地址」,代码重复且耦合。生产环境更常用 OpenFeign 把这一步完全收编。

OpenFeign:声明式远程调用#

接入分四步:

  1. 引入依赖:OpenFeign 本体 + 负载均衡组件 spring-cloud-starter-loadbalancer
  2. 启动:启动类上加 @EnableFeignClients,开启 Feign 客户端扫描
  3. 编写 FeignClient:写一个接口,加 @FeignClient(name = "服务名") 注解——Feign 会拿着服务名去注册中心发现实例列表,并自动完成负载均衡
  4. 使用:注入接口,像调本地方法一样调用
@FeignClient(name = "order-service")
public interface OrderClient {
@GetMapping("/hello")
String hello();
}

对比一下两条路:DiscoveryClient 手写适合极小场景或教学演示;OpenFeign 是声明式开发,自带负载均衡,后续接熔断、重试等扩展也方便,是微服务调用的主流姿势。

HTTP 连接池#

Feign 默认底层走 JDK 的 HttpURLConnection,每次请求都新建 TCP 连接,高并发下开销明显。生产建议换成 Apache HttpClient 5 或 OKHttp:

  • 引入依赖:feign-hc5 或 feign-okhttp
  • 开启连接池:spring.cloud.openfeign.httpclient.enabled=true(或对应 okhttp.enabled=true)

开启后底层连接复用,避免反复三次握手,显著降低延迟与资源开销。

网关:Spring Cloud Gateway#

网关负责请求的路由、转发、身份校验——把鉴权、限流、日志这类横切关注点收敛到网关一层,业务服务专注自身逻辑。

搭建四步:

  1. 创建新模块:独立网关服务,引入网关依赖 spring-cloud-starter-gateway,再配上注册中心依赖(如 Nacos discovery)
  2. 编写启动类:@SpringBootApplication 启动即可,注册进 Nacos 后可用服务名路由
  3. 配置路由规则:在 application.yml 声明路由——id、predicates(匹配条件)、filters(转发前处理器)
spring:
cloud:
gateway:
routes:
- id: order-service-route
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- StripPrefix=1
  1. 登录校验 GlobalFilter:实现 GlobalFilter + Ordered,在过滤器里校验 Authorization 头的 JWT Token,,白名单路径(如 /auth/login、/auth/register)直接放行,校验失败返回 401 JSON,通过则继续放行到下游服务
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 白名单直接放行
// 校验 Authorization 头里的 JWT
// 失败返回 401 JSON;成功则 chain.filter(exchange)
}
}

小结#

微服务调用链串联起来就是:注册中心(Nacos)做服务发现 → LoadBalancer / OpenFeign 做负载均衡与声明式调用 → HTTP 连接池做底层复用 → 网关统一收口路由与鉴权。至于生态另一块基石——消息中间件(RabbitMQ)的场景与可靠性机制,已经在《每日一记(8/27)》里单独复盘过,这里不再展开。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!

打赏
每日一记(8/28):Nacos、OpenFeign 与网关构建微服务调用链
https://ryuki.icu/posts/daily-note-2026-08-28-spring-cloud/
作者
RK
发布于
2026-08-28
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
RK
Long may the sunshine
公告
Long may the sunshine
分类
标签
最新动态
站点天气
天气加载中…
站点统计
文章
27
分类
6
标签
59
总字数
39,139
篝火已燃
0 天
最后活动
0 天前
每日一签