1,由於整個微服務會有好多服務,好比會員服務,支付服務,訂單服務,每一個服務都集成了swaggerhtml
咱們在訪問的時候,不可能每一個服務輸入一個url 去訪問,看起來很麻煩,因此咱們須要在一個頁面上集成整個微服務項目中全部的 swaggerjava
效果圖:能夠選擇不一樣的應用,出來的是不一樣的swagger 接口文檔web
2,實現思路:spring
zuul 網關 + swagger api
客戶端訪問一個應用,zuul 網關轉發到相應的界面,看起來是在一個服務上的效果 服務器
3,eureka :註冊中心app
springcloud-config:註冊中心:路由轉發用配置中心作的,沒有寫在本地。能夠參考springcloud-config 動態網關路由maven
springcloud-api-member-impl-service:在eureka 註冊的服務是:app-aiyuesheng-memberide
springcloud-api-order-impl-service:在eureka 註冊的服務是:app-aiyuesheng-orderspring-boot
springcloud-swagger2:swagger 服務
springcloud-zuul :zuul 網關服務
4,
第一步:
member 服務 和 order ,zuul 須要添加maven 依賴:
<dependency> <groupId>com.spring4all</groupId> <artifactId>swagger-spring-boot-starter</artifactId> <version>1.7.0.RELEASE</version> </dependency>
第二步:
member ,order 配置文件添加:
##swagger掃包 swagger: base-package: com.aiyuesheng.api.impl
第三步:
swagger 的接口類的寫法仍是同樣:
package com.aiyuesheng.api.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.aiyuesheng.entity.Order; import com.aiyuesheng.feign.OrderServiceFeign; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @RestController @Api("會員接口文檔") public class MemberServiceImpl { @Autowired private OrderServiceFeign orderServiceFeign; @ApiOperation("方法描述用例") @PostMapping("/swaggerIndex") public String swaggerMember() { return "swaggerIndex"; } @ApiOperation("參數描述用例") @ApiImplicitParam(name = "name", value = "用戶名", required = true, dataTypeClass = String.class) @GetMapping("/getAge") public String swaggerMemberParam(String userName) { return "chris"; } @RequestMapping("/") public String index() { return "app-aiyuesheng-member"; } // @HystrixCommand 默認開啓服務隔離,是以線程池方式 // @HystrixCommand 默認開啓服務降級,fallbackMethod 方法名就是服務的降級名稱 // @HystrixCommand 默認開啓服務熔斷機制 // @Hystrix 要禁止超時時間,默認1 秒,若是沒有即便響應,會走業務邏輯,可是也會走服務降級方法,因此要禁止超時時間 @HystrixCommand(fallbackMethod = "orderServiceFallback") @RequestMapping("/getOrder") public Order getOrder(String orderId) { System.out.println("orderToUserInfo:" + "當前線程池名稱:" + Thread.currentThread().getName()); return orderServiceFeign.getOrder(orderId); } @RequestMapping("/getOrder2") public Order getOrder2(String orderId) { System.out.println("orderToUserInfo:" + "當前線程池名稱:" + Thread.currentThread().getName()); return orderServiceFeign.getOrder(orderId); } @RequestMapping("/orderServiceFallback") public String orderServiceFallback() { return "服務器繁忙,請稍後重試"; } }
order 由於以前由feign 客戶端調用,因此在父類裏面也要加@Api()註解:
package com.aiyuesheng.api.impl; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.aiyuesheng.api.IOrderService; import com.aiyuesheng.entity.Order; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiOperation; @RestController @Api("訂單接口文檔") public class OrderServiceImpl implements IOrderService { @ApiOperation("方法描述用例") @PostMapping("/swaggerIndex") public String swaggerOrder() { return "swaggerIndex"; } @ApiOperation("參數描述用例") @ApiImplicitParam(name = "name", value = "用戶名", required = true, dataTypeClass = String.class) @GetMapping("/getAge") public String swaggerOrderrParam(String userName) { return "chris"; } @RequestMapping("/") public String index() { return "app-aiyuesheng-order"; } @RequestMapping("/getOrder") public Order getOrder(String orderId) { Order order = new Order(); order.setOrderId(orderId); order.setOrderName("訂單名稱"); return order; } }
父類:
@Api("訂單接口文檔") public interface IOrderService { @RequestMapping("/getOrder") public Order getOrder(String orderId); }
第四步:
啓動類加上註解@EnableSwagger2Doc
@SpringBootApplication @EnableEurekaClient @EnableFeignClients @EnableSwagger2Doc //生成swagger文檔 public class OrderApp { public static void main(String[] args) { SpringApplication.run(OrderApp.class, args); } }
第五步:配置zuul:
package com.aiyuesheng; import java.util.ArrayList; import java.util.List; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; import com.spring4all.swagger.EnableSwagger2Doc; import springfox.documentation.swagger.web.SwaggerResource; import springfox.documentation.swagger.web.SwaggerResourcesProvider; @EnableZuulProxy @SpringBootApplication @EnableDiscoveryClient @EnableSwagger2Doc public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } // @Bean // public TokenFilter accessFilter() { // return new TokenFilter(); // } @RefreshScope @ConfigurationProperties("zuul") public ZuulProperties zuulProperties() { return new ZuulProperties(); } } @Component @Primary class DocumentationConfig implements SwaggerResourcesProvider { @Override public List<SwaggerResource> get() { List resources = new ArrayList<>(); resources.add(swaggerResource("app-aiyuesheng-member", "/api-member/v2/api-docs", "2.0")); resources.add(swaggerResource("app-aiyuesheng-order", "/api-order/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; } }
zuul 的配置文件,回顧下,
spring: application: ####註冊中心應用名稱 name: service-zuul cloud: config: ####讀取後綴 profile: dev ####讀取config-server註冊地址 discovery: service-id: config-server enabled: true #####eureka服務註冊地址 eureka: client: service-url: defaultZone: http://localhost:8100/eureka server: port: 80 #配置手動實時刷新 #managementendpoints.web.exposure.include=* management: endpoints: web: exposure: include: "*"
配置中心上的路由轉發,回顧下:
### 配置網關反向代理 zuul: routes: api-member: ### 以 /api-member/訪問轉發到會員服務 path: /api-member/** serviceId: app-aiyuesheng-member api-order: ### 以 /api-order/訪問轉發到訂單服務 path: /api-order/** serviceId: app-aiyuesheng-order
配置成功:訪問http://127.0.0.1/swagger-ui.html#/
由於網關是80,而後再轉發到對應的服務地址的