Spring Cloud Netflix 使用路由网关统一访问接口(二)
      
      
    
   
  
  
    Zuul 简介
Zuul 的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如 /api/user 转发到到 User 服务,/api/shop 转发到到 Shop 服务。Zuul 默认和 Ribbon 结合实现了负载均衡的功能。
创建路由网关
完整pom文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
   | <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">     <modelVersion>4.0.0</modelVersion>     <parent>         <groupId>org.springframework.boot</groupId>         <artifactId>spring-boot-starter-parent</artifactId>         <version>2.2.2.RELEASE</version>         <relativePath/>      </parent>     <groupId>com.xzt</groupId>     <artifactId>spring-cloud-zuul</artifactId>     <version>0.0.1-SNAPSHOT</version>     <name>spring-cloud-zuul</name>     <description>Demo project for Spring Boot</description>
      <properties>         <java.version>1.8</java.version>         <spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>     </properties>
      <dependencies>         <dependency>             <groupId>org.springframework.cloud</groupId>             <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>         </dependency>         <dependency>             <groupId>org.springframework.cloud</groupId>             <artifactId>spring-cloud-starter-netflix-zuul</artifactId>         </dependency>
          <dependency>             <groupId>org.springframework.boot</groupId>             <artifactId>spring-boot-starter-test</artifactId>             <scope>test</scope>             <exclusions>                 <exclusion>                     <groupId>org.junit.vintage</groupId>                     <artifactId>junit-vintage-engine</artifactId>                 </exclusion>             </exclusions>         </dependency>     </dependencies>
      <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>
      <build>         <plugins>             <plugin>                 <groupId>org.springframework.boot</groupId>                 <artifactId>spring-boot-maven-plugin</artifactId>             </plugin>         </plugins>     </build>
  </project>
   | 
 
application.yml配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | spring:   application:     name: spring-cloud-zuul
  server:   port: 8769
  eureka:   client:     serviceUrl:       defaultZone: http://localhost:8761/eureka/
  zuul:   routes:     api-1:       path: /admin/**       serviceId: cloud-admin-service
   | 
 
路由说明:
- 以 
/cloud-admin-client/ 开头的请求都转发给 cloud-admin-client 服务 
Application启动类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
   | package com.xzt.zuul;
  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;
  @SpringBootApplication @EnableEurekaClient @EnableZuulProxy public class SpringCloudZuulApplication {
      public static void main(String[] args) {         SpringApplication.run(SpringCloudZuulApplication.class, args);     }
  }
   | 
 
启动工程,打开浏览器访问:http://127.0.0.1:8769/cloud-admin-client/hi?message=HelloSpring浏览器显示:
1
   | Hi,your message is : HelloSpring i am from port : 8762
   | 
 
配置网关路由失败时的回调
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
   | package com.xzt.zuul;
  import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component;
  import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map;
  @Component public class WebAdminFeignFallbackProvider implements FallbackProvider {     @Override     public String getRoute() {                  return null;     }
      @Override     public ClientHttpResponse fallbackResponse(String route, Throwable cause) {         return new ClientHttpResponse() {             
 
 
 
 
 
              @Override             public HttpStatus getStatusCode() throws IOException {                 return HttpStatus.OK;             }
              @Override             public int getRawStatusCode() throws IOException {                 return HttpStatus.OK.value();             }
              @Override             public String getStatusText() throws IOException {                 return HttpStatus.OK.getReasonPhrase();             }
              @Override             public void close() {
              }
              @Override             public InputStream getBody() throws IOException {                 ObjectMapper objectMapper = new ObjectMapper();                 Map<String, Object> map = new HashMap<>();                 map.put("status", 200);                 map.put("message", "无法连接,请检查您的网络");                 return new ByteArrayInputStream(objectMapper.writeValueAsString(map).getBytes("UTF-8"));             }
              @Override             public HttpHeaders getHeaders() {                 HttpHeaders headers = new HttpHeaders();                                  headers.setContentType(MediaType.APPLICATION_JSON_UTF8);                 return headers;             }         };     } }
   | 
 
如果访问http://127.0.0.1:8769/cloud-admin-client/hi?message=HelloSpring失败,则显示:
1
   | {"message":"无法连接,请检查您的网络","status":200}
  |