摘自:螞蟻課堂:http://www.mayikt.com/course/video/2424
1、搭建Nginx+Zuul實現高性能網關
Zginx + Zuul (多個網關),實現一主一備或者輪詢。在微服務中,所有服務請求都會統一請求到Zuul網關上。
原理:客戶端發送請求,統一到nginx上,再使用nginx實現反響代理和負載均衡,採用輪詢算法轉發到網關上,最後由網關再次進行本地負載均衡把請求分發到具體的服務上去。如下圖:
2、基於Nginx實現Zuul集羣環境
(1)Nginx配置服務器集羣實現負載均衡這裏就不說了(用upstream聲明Zuul網關服務器組),默認是輪詢策略。
可參考:https://mp.csdn.net/postedit/79537976
(2)爲什麼不用nginx實現網關呢?(nginx採用的是c語言,lua寫腳本)
因爲微服務網關是針對與整個微服務實現統一請求攔截,網關基本上都採用自己熟悉的語言開發,目的是方便易學。
3、使用Swagger自動生成API文檔
爲了前後端能夠更好的集成與對接,同時爲了項目的方便交付,每個項目都需要提供相應的api文檔。
Swagger優點:
(1)功能豐富:支持多種註解,自動生成接口文檔界面,支持在界面測試api接口功能。
(2)及時更新:開發過程中花一點寫註釋的時間,就可以及時的更新api文檔。
(3)整合簡單:通過添加pom依賴和簡單配置,內嵌於應用中就可同時發佈api接口文檔界面,不需要部署獨立服務。
4、Zuul整合Swagger管理整個微服務API文檔
(1)SpringBoot整合Swagger
pom.xml引入依賴:
<!-- springboot整合web組件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<!-- swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
properties或yml配置服務端口及名稱:
##服務端口
server.port=6086
##服務名稱
spring.application.name=springboot-swagger
建立swagger配置類:
@Configuration
@EnableSwagger2
public class SwaggerConfig {
public Docket createRestApi(){
//生成api掃描包
return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select()
.apis(RequestHandlerSelectors.basePackage("com.gonghua.controller")).paths(PathSelectors.any()).build();
}
private ApiInfo apiInfo(){
return new ApiInfoBuilder()
.title("XXXX管理系統")
.description("xxxx系統|xxxx業務")
.termsOfServiceUrl("鏈接地址")
.version("1.0").build();
}
}
建立controller並加入註釋:加入@RequestMapping如下效果。所以根據需要添加指定的@GetMapping和@PostMapping。
如何傳遞參數呢?代碼如下getmember方法的代碼:
@Api("swagger服務層")
@RestController
public class SwaggerController {
@ApiOperation("swagger測試接口")
@GetMapping("/index")
public String index(){
return "welcome to my swagger";
}
//如何傳遞參數
@ApiOperation("獲取member接口")
@ApiImplicitParam(name="username",value="用戶請求參數",required=true,dataType="String")
@PostMapping("/getMember")
public String getMember(String username){
return "getmember";
}
}
(2)Zuul網關集羣集成Swagger
(將整個微服務中的Swagger進行合成到統一服務器上,使用Zuul + Swagger實現管理整個微服務API文檔)
SpringBoot支持對Swagger管理,只需要zuul網關添加對應服務Swagger文檔即可。
操作步驟:
1、服務提供者和服務消費者添加pom依賴:
<!-- Swagger-spring-boot springboot對swagger的支持-->
<dependency>
<groupId>com.spring4all</groupId>
<artifactId>swagger-spring-boot-starter</artifactId>
<version>1.7.0.RELEASE</version>
</dependency>
yml或properties配置掃描包範圍:
swagger.base-package=com.gonghua.controller
啓動類添加@EnableSwagger2Doc註解,表示生成swagger文檔;
對應的controller添加@Api註解,方法上添加@ApiOperation和@PostMapping註解
2、網關服務裏需要進行的操作:
2.1、添加同上一樣的springboot對swagger支持的依賴jar包。
2.2、啓動類裏添加如下代碼:
/**
* 添加文檔來源
*/
@Component
@Primary
class DocumentActionConfig implements SwaggerResourcesProvider{
@Override
public List<SwaggerResource> get() {
List<SwaggerResource> resourcesList = new ArrayList<>();
resourcesList.add(swaggerResource("app-memeber","/app-member/v1/api-docs","v1.0"));
resourcesList.add(swaggerResource("app-order","/app-order/v1/api-docs","v1.0"));
return resourcesList;
}
/**
*
* @param name 訪問對應swagger api文檔的名稱
* @param location 訪問對應controller的地址
* @param version 版本
* @return
*/
private SwaggerResource swaggerResource(String name,String location,String version){
SwaggerResource swaggerResource = new SwaggerResource();
swaggerResource.setName(name);
swaggerResource.setLocation(location);
swaggerResource.setSwaggerVersion(version);
return swaggerResource;
}
}
啓動服務提供者、消費者、網關,訪問網關,即可看到集成好的網關的swagger。