Swagger一般只在测试环境中搭建,可以在描述中写上不同环境中的接口地址,正式环境中一般不允许做接口测试。
网关一般只对外网访问生效,内网访问一般直接进行访问,不需要通过网关,系统安全要求较高的可以通过类似/public/...代表f访问来源于外网,/private/...代表访问来源于内网
一、单体应用中使用SwaggerApi生成API文档
1.引入Swagger依赖包
<!-- swagger-spring-boot -->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.7.0.RELEASE</version>
</dependency>
2.配置文件
####swagger相关配置
swagger:
base-package: com.tx.servicemember.impl
title: SpringCloud2.x构建微服务电商项目-微信服务接口
description: 该项目“基于SpringCloud2.x构建微服务电商项目”未经过允许的情况下,私自分享视频和源码属于违法行为。
version: 1.1
terms-of-service-url: www.tx.com
contact:
name: sunny
email: 860074898@qq.com
3.启动类加注解,开启Swagger功能
@EnableSwagger2Doc
4.在实现类中进行接口说明@ApiOperation @Api
@Api(tags = "会员服务接口")
public interface MemberService {
/**
* 功能说明: 会员服务接口调用微信接口
*/
@ApiOperation(value = "会员服务调用微信服务")
@GetMapping("/memberInvokeWeixin")
public AppEntity memberInvokeWeixin();
}
5.查看SwaggerApi效果
http://127.0.0.1:8300/swagger-ui.html
链接:https://pan.baidu.com/s/1zLQO2Ix3oNwHSc0tSv8fXg
提取码:jqes
二、使用网关统一管理apiSwagger
如果不使用网关统一管理ApiSwagger,那访问服务接口API的地址就有多个,N个服务就有N个地址,例如
http://127.0.0.1:8200/swagger-ui.html#/
http://127.0.0.1:8300/swagger-ui.html#/
这样管理API文档会非常繁琐,增加网关后就只需要在一个主页面可以对所有的API文档进行查看和管理。
http://127.0.0.1:8000/swagger-ui.html#/
1.新建Zuul网关子项目,添加依赖
<!-- zuul-网关 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<!--管理依赖-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.在zuul启动类中增加相关扫描接口的代码
package com.tx.zuul;
import com.spring4all.swagger.EnableSwagger2Doc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
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;
/***
* @Author Sunny
* @Description //TODO Zuul微服务网关服务
* @Date 11:14 2019/9/17
* @Param
* @return
*/
@SpringBootApplication
@EnableSwagger2Doc
@EnableEurekaClient
@EnableZuulProxy
public class DhccShopBasicsSpringcloudZuulApplication {
public static void main(String[] args) {
SpringApplication.run(DhccShopBasicsSpringcloudZuulApplication.class, args);
}
// 添加文档来源
@Component
@Primary
class DocumentationConfig implements SwaggerResourcesProvider {
@Override
public List<SwaggerResource> get() {
List resources = new ArrayList();
// app-itmayiedu-order
// 网关使用服务别名获取远程服务的SwaggerApi
resources.add(swaggerResource("app-tx-member", "/app-tx-member/v2/api-docs", "2.0"));
resources.add(swaggerResource("app-tx-weixin", "/app-tx-weixin/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;
}
}
}
3.新增配置文件内容
###服务启动端口号,网关端口号一般都是80,但是为了保持项目统一使用8000
server:
port: 8000
###服务名称(服务注册到eureka名称)
spring:
application:
name: app-tx-zuul
###服务注册到eureka地址
eureka:
client:
service-url:
defaultZone: http://localhost:8100/eureka
### 配置网关反向代理
zuul:
routes:
api-a:
### 以 /api-weixin/访问转发到会员服务
path: /api-weixin/**
serviceId: app-tx-weixin
api-b:
### 以 /api-member/访问转发到订单服务
path: /api-member/**
serviceId: app-tx-member
4.启动服务查看SwaggerAPI效果
5.通过网关进行统一访问
http://127.0.0.1:8300/memberInvokeWeixin
http://127.0.0.1:8000/api-member/memberInvokeWeixin
IP+网关端口+访问服务路径+接口
链接:https://pan.baidu.com/s/1t1DFfA5mm1FtlACI0INJFg
提取码:nj9j
三.Swagger2异常:java.lang.NumberFormatException:For input string:""
2019-01-07 18:23:03.830 WARN 21940 --- [nio-8080-exec-6] i.s.m.p.AbstractSerializableParameter : Illegal DefaultValue for parameter type integer
java.lang.NumberFormatException: For input string: ""
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) ~[na:1.8.0_171]
at java.lang.Long.parseLong(Long.java:601) ~[na:1.8.0_171]
at java.lang.Long.valueOf(Long.java:803) ~[na:1.8.0_171]
at io.swagger.models.parameters.AbstractSerializableParameter.getExample(AbstractSerializableParameter.java:412) ~[swagger-models-1.5.20.jar:1.5.20]
at sun.reflect.GeneratedMethodAccessor87.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_171]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_171]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:654) [jackson-databind-2.6.5.jar:2.6.5]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675) [jackson-databind-2.6.5.jar:2.6.5]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157) [jackson-databind-2.6.5.jar:2.6.5]
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serializeContents(IndexedListSerializer.java:119) [jackson-databind-2.6.5.jar:2.6.5]
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:79) [jackson-databind-2.6.5.jar:2.6.5]
at com.fasterxml.jackson.databind.ser.impl.IndexedListSerializer.serialize(IndexedListSerializer.java:18) [jackson-databind-2.6.5.jar:2.6.5]
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693) [jackson-databind-2.6.5.jar:2.6.5]
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:675) [jackson-databind-2.6.5.jar:2.6.5]
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157) [jackson-databind-2.6.5.jar:2.6.5]
解决方法:pom.xml中引入包
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.21</version>
</dependency>