Getaway网关访问微服务:503,Service Unavailable
Getaway网关访问微服务:503,Service Unavailable,提示找不到服务,但服务已启动,路径无问题
·
Getaway网关访问微服务:503,Service Unavailable。请求路径:localhost:1000/user/test,请求响应结果如下
{
"timestamp": "2022-10-10T06:45:35.592+00:00",
"path": "/user/list",
"status": 503,
"error": "Service Unavailable",
"message": "",
"requestId": "4f1bf742-1"
}
导入的依赖为:
<!--getaway网关依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--Nacos注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
yml配置:
server:
port: 1000
spring:
application:
name: service-gateway #服务名
cloud: #注册到Nacos
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: false #开放服务名访问方式
lower-case-service-id: true #服务名小写
routes: #路由配置
- id : service-user #指定服务名
uri: lb://service-user #以负载均衡的方式去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/user/** #服务访问路径
# 断言方式有很多,此处使用常见的URL路径断言,如访问http:localhost:1000/user/list命中
控制器接口:
package cn.cooper.song.controller;
import cn.cooper.song.entity.User;
import cn.cooper.song.entity.req.ReqQueryUser;
import cn.cooper.song.service.IUserService;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* <p>
* 会员登录账号 前端控制器
* </p>
*
* @author cooper
* @since 2022-10-07
*/
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private IUserService userService;
@GetMapping("/list")
public List<User> list(){
return userService.list();
}
@PostMapping("/byId")
public User byId(@RequestBody User user){
return userService.getById(user.getId());
}
@PostMapping("/test")
public List<User> query(@RequestBody ReqQueryUser req){
LambdaQueryChainWrapper<User> wrapper = userService.lambdaQuery()
.eq(req.getPhone() != null, User::getPhone, req.getPhone())
.like(req.getNickName() != null && !req.getNickName().isEmpty(), User::getNickName, req.getNickName())
.gt(req.getBit() != null, User::getBitState, req.getBit());
return wrapper.list();
}
/**
* 流控测试
* @return 测试限流
*/
@GetMapping(value = "/hello")
@SentinelResource(value = "hello",blockHandler = "withBlockHandler")
public String hello() {
return "Hello Sentinel";
}
public String withBlockHandler(BlockException ex){
ex.printStackTrace();
log.info("限流:异常{}",ex.getMessage());
return "手速太快了,过会儿再试试吧!";
}
public String withFallback(){
return "别动 断啦!";
}
}
服务的yml配置:
server:
port: 1010
spring:
application:
name: service-user
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
# 数据库及其他相关配置已省略....
我的排错步骤:
1、根据getaway网关原理,当我们通过网关发起请求的时候,网关根据断言匹配请求路径对应的服务,然后如注册中心找到该服务,并转发请求。所以第一之间检查了配置文件,用户服务、网关配置、断言,服务名一致,请求路径也没有问题,单独访问服务是可以访问的。貌似没有什么问题!
2、登录nacos注册中心,检查服务是否已经注册上了。查看候我的服务是全部注册上去的(图省略)
3、上网查资料,有部分说是缺少两个依赖,分别是Feign和负载均衡的依赖,如下(版本我已省略,在父模块已配置spring cloud版本):
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<!--openFeign依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
导入之后就有新的问题,由于feign依赖导入候就需要配置+注解,尝试候并没有效果,但是getaway的配置中URI还有一种配置写法,那就是直接将服务IP地址写上,如下:
server:
port: 1000
spring:
application:
name: service-gateway #服务名
cloud: #注册到Nacos
nacos:
discovery:
server-addr: 127.0.0.1:8848
gateway:
discovery:
locator:
enabled: false #开放服务名访问方式
lower-case-service-id: true #服务名小写
routes: #路由配置
- id : service-user #指定服务名
uri: http://127.0.0.1:1010 #以负载均衡的方式去注册中心找这个服务名
predicates: #断言,匹配访问的路径
- Path=/user/** #服务访问路径
# 断言方式有很多,此处使用常见的URL路径断言,如访问http:localhost:1000/user/list命中
结果是可以访问的,如下:
[
{
"id": 1,
"createTime": 1493695662249,
"updateTime": 1493695662249,
"thirdUid": null,
"phone": "13330964748",
"email": "111@qq.com",
"nickName": "yhptest",
"bitState": 11,
"secLevel": 0,
"loginId": 3
},
// 结果已省略.........
]
于是就想,为什么不能使用负载均衡的方式找到指定的服务?查阅资料,最终导入一个负载均衡的依赖解决问题。
PS:不知道为什么,getaway依赖中其实是原本就包含负载均衡依赖包的,如下:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter</artifactId>
<version>2.2.5.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-gateway-core</artifactId>
<version>2.2.5.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<version>2.3.2.RELEASE</version>
<scope>compile</scope>
</dependency>
<!--此处为负载均衡依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>2.2.5.RELEASE</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
</dependencies>
也许是刷包问题,或者其他原因这个目前暂不得知,不过在找到这个解决方案之前,我已尝试过多次刷包、重新编译、重启等等常规操作,但最终都以失败告终。
最终完整的getaway依赖如下:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--Nacos注册发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
</dependencies>
希望这篇文章能帮助正好遇到此问题的你
更多推荐
所有评论(0)
您需要登录才能发言
加载更多