每日一记(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,发起远程调用
@Autowiredprivate 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:声明式远程调用
接入分四步:
- 引入依赖:OpenFeign 本体 + 负载均衡组件
spring-cloud-starter-loadbalancer - 启动:启动类上加
@EnableFeignClients,开启 Feign 客户端扫描 - 编写 FeignClient:写一个接口,加
@FeignClient(name = "服务名")注解——Feign 会拿着服务名去注册中心发现实例列表,并自动完成负载均衡 - 使用:注入接口,像调本地方法一样调用
@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
网关负责请求的路由、转发、身份校验——把鉴权、限流、日志这类横切关注点收敛到网关一层,业务服务专注自身逻辑。
搭建四步:
- 创建新模块:独立网关服务,引入网关依赖
spring-cloud-starter-gateway,再配上注册中心依赖(如 Nacos discovery) - 编写启动类:
@SpringBootApplication启动即可,注册进 Nacos 后可用服务名路由 - 配置路由规则:在
application.yml声明路由——id、predicates(匹配条件)、filters(转发前处理器)
spring: cloud: gateway: routes: - id: order-service-route uri: lb://order-service predicates: - Path=/api/order/** filters: - StripPrefix=1- 登录校验 GlobalFilter:实现
GlobalFilter+Ordered,在过滤器里校验Authorization头的 JWT Token,,白名单路径(如/auth/login、/auth/register)直接放行,校验失败返回 401 JSON,通过则继续放行到下游服务
@Componentpublic 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/相关文章智能推荐
1
每日一记(8/27):Spring 核心原理与 RabbitMQ 可靠性复盘
Java单例 Bean 线程安全、事务失效三场景、AOP、Bean 生命周期与循环依赖、SpringMVC/Boot/Cloud 原理,以及 RabbitMQ 消息不丢失、重复消费、延迟队列与消息堆积一站式复盘。
2
ArrayList、线程池与 JVM:一次 Java 底层复盘
JavaArrayList 懒加载与 1.5 倍扩容、asList 与 toArray 的镜像坑、线程池核心线程数怎么定、JVM 运行时数据区、双亲委派、垃圾判定与三大回收算法,以及调优参数和排查工具速查。
3
Java 进阶 Day05:反射注解与动态代理
JavaJava 反射获取 Class 与操作类成分、泛型擦除证据、自定义注解与元注解解析、JDK 动态代理
4
Java 进阶 Day04:线程进阶与网络编程入门
Java线程创建方式二三、线程安全与 synchronized/Lock、线程池七参数、UDP/TCP 网络编程与 JUnit 单元测试
5
Java 进阶 Day03:集合、Stream、IO 流与线程入门
JavaList/Set/Map 深入、Stream 流、字节流与字符流、缓冲流、递归和线程创建的基础。
随机文章随机推荐





















