JHipster微服务:能否通过API网关统一路径访问所有微服务?
你说的这种通过网关统一入口,用路径里的服务名来区分转发到不同微服务的需求,是API网关非常典型的使用场景,完全能实现。下面我给你分享两个主流网关的配置方案,你可以照着来做:
方案一:Spring Cloud Gateway 配置(Spring生态首选)
如果你的技术栈是Spring相关,Spring Cloud Gateway是个很合适的选择。只需要配置路由规则,让网关根据路径里的microservice1、microservice2这类标识转发请求就行。
在网关的application.yml里添加以下路由配置:
spring: cloud: gateway: routes: - id: microservice1_route uri: http://microservice1:8081 # 微服务1的地址 predicates: - Path=/api/microservice1/** # 匹配包含该前缀的请求 filters: - StripPrefix=2 # 去掉路径前两段(/api/microservice1),剩下的部分转发到目标服务 - id: microservice2_route uri: http://microservice2:8082 # 微服务2的地址 predicates: - Path=/api/microservice2/** filters: - StripPrefix=2
举个例子:当你请求http://gateway:8080/api/microservice1/api/user时,网关会匹配第一条路由,去掉前两段路径后,把/api/user转发到http://microservice1:8081/api/user,完美契合你的需求。
如果你的微服务注册到了服务发现组件(比如Nacos、Eureka),还可以把uri改成lb://microservice1(lb代表负载均衡),不用写死IP和端口,更灵活。
方案二:Nginx 反向代理配置
如果用Nginx作为API网关,也可以通过正则匹配和重写规则实现同样效果。修改Nginx的配置文件(比如nginx.conf)对应的server块:
server { listen 8080; server_name gateway; # 匹配/api/服务名/后续路径的请求 location ~ ^/api/(microservice1|microservice2)/(.*)$ { set $service_name $1; set $target_path $2; # 转发到对应的微服务地址 proxy_pass http://$service_name:808$1/api/$target_path; # 这里808后面的$1对应microservice1是1、microservice2是2,刚好匹配你的端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }
比如请求http://gateway:8080/api/microservice2/api/user2时,Nginx会自动转发到http://microservice2:8082/api/user2,完全符合你的期望。
小提醒
不管用哪种网关,都要确保网关和各个微服务之间网络互通(比如同一局域网、Docker桥接网络),不然会出现转发失败的情况哦。
内容的提问来源于stack exchange,提问作者grusso1981

