问题还原
在启动服务的时候,注册中心配置的三个服务(用户服务、商品服务、个公共基础服务)都能进行一个正常的启动,但是无法通过swagger进行一个访问,于是前台页面无法进行一个访问。
起初的排错思路是,新增了一个商品显示属性,于是寻找一通,还是没有找到…
最后发现,通过postman来对商品的服务的数据进行一个测试,这此时居然能获取商品的信息。于是分析了一下,服务能够正常启动,说明服务模块内没有出现问题,而Swagger需要通过网关中心进行数据的访问,但postman则不需要通过网关进行一个数据的访问。因为在postman中是直接数据的父服务器的路径地址,比如:http://localhost:8002/productType/treeData 因为服务没有出现问题,数据当然能够进行数据的访问。问题肯定是出现在网关上面。于是去排查网关的配置信息,
- 文档信息配置:
package cn.lzj.aigou.config;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import springfox.documentation.swagger.web.SwaggerResource;
import springfox.documentation.swagger.web.SwaggerResourcesProvider;
import java.util.ArrayList;
import java.util.List;
@Component
@Primary
public class DocumentationConfig implements SwaggerResourcesProvider {
@Override
public List<SwaggerResource> get() {
List resources = new ArrayList<>();
//aigou网关前缀,employee网关路径 ;swagger的路径 ,以后增加了接口就在这配置就ok
resources.add(swaggerResource("用户系统", "/aigou/user/v2/api-docs", "2.0"));
resources.add(swaggerResource("商品系统", "/aigou/product/v2/api-docs", "2.0"));
resources.add(swaggerResource("基础系统", "/aigou/common/v2/api-docs", "2.0"));
return resources;
}
private SwaggerResource swaggerResource(String name, String location, String version) {
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion(version);
return swaggerResource;
}
}
- application.yml配置
server:
port: 9527
spring:
application:
name: AIGOU-ZUUL-GATEWAY
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka
instance:
instance-id: gateway-9527.com
prefer-ip-address: true
# 一定要注意层级的缩进
zuul:
host:
connect-timeout-millis: 15000 #HTTP连接超时大于Hystrix的超时时间------自己新增的------》
socket-timeout-millis: 60000 #socket超时
routes:
aigouUser.serviceId: user-provider
aigouUser.path: /user/**
aigouProduct.serviceId: aigou-product
aigouProduct.path: /product/**
aigouCommon.serviceId: common-provider
aigouCommon.path: /common/**
ignored-services: "*"
prefix: / aigou
#ribbon: #设置ribbon的超时时间小于zuul的超时时间
# ReadTimeout: 60000
# ConnectTimeout: 60000
# MaxAutoRetries:0
# MaxAutoRetriesNextServer:1
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 10000
ribbon:
ReadTimeout: 15000
ConnectTimeout: 60000
MaxAutoRetries: 0
MaxAutoRetriesNextServer: 1
最后发现,在路径上面多了一个空格
将空格删掉,swagger便可以进行正常的访问
总结
还是对整个思路没有理解透彻,不清楚网关配置的流程和原理,以及对postman和swagger的原理不清晰,无法立马反应出是网关配置上面出现的问题,在排错上面思路不清晰。
以后不要只是单纯的拷贝代码,需要进行一个结构原理的分析,对哪个模块的处理流程清楚,不要只知道应该这样用,还要知道为什么应该这样用,如果不这样用回出现什么情况,这样用来之后会出现什么情况。