在微服務架構下,服務是分散的,怎麼把全部服務接口整合到一塊兒是咱們須要關注的。html
下面舉例用zuul做爲分佈式系統的網關,同時使用swagger生成文檔,想把整個系統的文檔整合在同一個頁面上來講明。spring
eureka-server:eureka服務註冊中心,端口8761,api
eureka-server2:eureka服務註冊中心,端口8762, springboot
eureka-server3:eureka服務註冊中心,端口8763, 架構
zuul-swagger2:zuul網關,端口8090, app
management-device:外接設備系統,端口8083, 分佈式
management-equip:設備管理系統,端口8082, ide
eureka註冊中心的搭建這裏再也不講述,直接來看zuul-swagger2項目裏怎麼集成swaggerspring-boot
pom.xml文件中引入依賴:微服務
<!-- 必需要引入 springboot parent ,幫咱們實現了不少jar包的依賴管理 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.2.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencyManagement> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Finchley.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <!-- 版本集中配置 --> <properties> <swagger2.version>2.9.0</swagger2.version> </properties> <dependencies> <!-- eureka client --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- zuul --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> </dependency> <!-- swagger2 依賴 --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>${swagger2.version}</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>${swagger2.version}</version> </dependency> </dependencies>
在配置文件application.yml中添加配置(這裏只作了eureka註冊,沒有作路由映射):
#端口 server: port: 8090 #應用名稱 spring: application: name: zuul-swagger2 #服務註冊 eureka: instance: hostname: zuul-swagger2 client: serviceUrl: defaultZone: http://skyworth:skyworth1@eureka-server:8761/eureka/,http://skyworth:skyworth2@eureka-server2:8762/eureka/,http://skyworth:skyworth3@eureka-server3:8763/eureka/ # 路由配置方式一 #zuul: # routes: #全部請求management-equip的請求,都會被攔截,而且轉發到equip上 # management-equip: /equip/** # 路由配置方式二 #zuul: # routes: # # 其中equip是路由名稱,能夠隨便定義,可是path和service-id須要一一對應 # equip: # path: /equip/** # # management-equip爲註冊到Eureka上的服務名 # service-id: management-equip
Swagger2配置類:
這裏比較重要的是2個配置類。第一個:SwaggerConfig.class是swagger的配置類,DocumentationConfig,用於整合配置接口文檔
SwaggerConfig.class
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket buildDocket() { return new Docket(DocumentationType.SWAGGER_2) .apiInfo(buildApiInf()) // .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.basePackage(""))// 須要生成文檔的包的位置 .paths(PathSelectors.any()) .build(); } private ApiInfo buildApiInf() { return new ApiInfoBuilder() .title("海外智能雲平臺系統接口詳情") .description("Zuul+Swagger2構建RESTful APIs") .termsOfServiceUrl("http://www.skyworth.com") .contact(new Contact("skyworth", "http://www.skyworth.com", "")) .version("1.0") .build(); } }
DocumentationConfig.class(注意紅色部分,經過遍歷eureka路由方式自動添加全部微服務 API 文檔,SwaggerResourcesProvider 是資源提供者,咱們重寫他,把各個微服務的API文檔資源路徑返回,註釋部分爲手動添加的方式)
@Component @Primary public class DocumentationConfig implements SwaggerResourcesProvider { private final RouteLocator routeLocator; public DocumentationConfig(RouteLocator routeLocator) { this.routeLocator = routeLocator; } @Override public List<SwaggerResource> get() { List<SwaggerResource> resources = new ArrayList<>(); List<Route> routes = routeLocator.getRoutes(); routes.forEach(route -> { resources.add(swaggerResource(route.getId(), route.getFullPath().replace("**", "v2/api-docs"), "1.0")); }); return resources; } // @Override // public List<SwaggerResource> get() { // List resources = new ArrayList<>(); // resources.add(swaggerResource("外接設備系統", "/management-device/v2/api-docs", "1.0")); // resources.add(swaggerResource("設備管理系統", "/management-equip/v2/api-docs", "1.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
@SpringBootApplication @EnableZuulProxy public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
運行相關服務和zuul-swagger網關,輸入:http://localhost:8090/swagger-ui.html
另外談談遇到的一個坑,以前沒有加eureka.instance.prefer-ip-address=true,致使zuul一直訪問不到其餘服務(多是eureka.instance.prefer-ip-address = true
就能夠將IP註冊到Eureka Server上,而若是不配置就是機器的主機名,而主機名沒有作ip映射致使訪問不大,具體緣由須要探究)。
#服務註冊 eureka: instance: hostname: device prefer-ip-address: true