zoukankan      html  css  js  c++  java
  • SpringCloudZuul

    https://juejin.im/post/6844903966044618759

    代码结构:

     EurekaServer:

    pom.xml

    <?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.3.5.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.work</groupId>
        <artifactId>eurekaserver</artifactId>
        <version>1.0.0</version>
        <name>eurekaserver</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</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

    server:
      port: 8761
    
    spring:
      application:
        name: EUREKASERVER

    EurekaserverApplication:

    package com.work.eurekaserver;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaserverApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaserverApplication.class, args);
        }
    
    }

    运行,通过http://localhost:8761/就可以访问

    Provider

    pom.xml

    <?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.3.5.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.work</groupId>
        <artifactId>provider</artifactId>
        <version>1.0.0</version>
        <name>provider</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</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

    server:
      port: 8083
    
    spring:
      application:
        name: PROVIDER
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:8761/eureka/

    ProviderApplication.java

    package com.work.provider;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class ProviderApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ProviderApplication.class, args);
        }
    
    }

    HelloController.java

    package com.work.provider.controller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class HelloController {
    
        @RequestMapping("/hello")
        @ResponseBody
        public String hello(@RequestParam String name){
            System.out.println("This is success.");
            return "Success, "+name+", this is first messge";
        }
    
    }

    Provider2

    pom.xml

    <?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.3.5.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.huawei</groupId>
        <artifactId>provider2</artifactId>
        <version>1.0.0</version>
        <name>provider2</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</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

    server:
      port: 8084
    
    spring:
      application:
        name: PROVIDER
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:8761/eureka/

    Provider2Application.java

    package com.huawei.provider2;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Provider2Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Provider2Application.class, args);
        }
    
    }

    HelloController.java

    package com.huawei.provider2.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloControler {
        @RequestMapping("/hello")
        public String index(@RequestParam String name){
            System.out.println("request two is "+name);
    //        try{
    //            Thread.sleep(1000000000);
    //        }catch (Exception e){
    //            System.out.println("hello two error");
    //        }
            return "hello, "+name+", this is two message";
        }
    }

    ZuulConsumer

    pom.xml

    <?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.3.5.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.work</groupId>
        <artifactId>zuulconsumer</artifactId>
        <version>1.0.0</version>
        <name>zuulconsumer</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
            <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</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

    #方法一
    #server:
    #  port: 8082
    #spring:
    #  application:
    #    name: ZUULCONSUMER
    #eureka:
    #  client:
    #    service-url:
    #      defaultZone: http://127.0.0.1:8761/eureka/
    ##通过http://localhost:8082/demo/hello访问
    #zuul:
    #  routes:
    #    eureka-application-service:
    #      path: /demo/**
    #      serviceId: PROVIDER
    
    
    #方法二
    #server:
    #  port: 8082
    #spring:
    #  application:
    #    name: ZUULCONSUMER
    #eureka:
    #  client:
    #    service-url:
    #      defaultZone: http://127.0.0.1:8761/eureka/
    ##通过http://localhost:8082/demo/hello访问
    #zuul:
    #  routes:
    #    eureka-application-service:
    #      path: /demo/**
    #      url: PROVIDER
    
    
    #方法三
    #server:
    #  port: 8082
    #spring:
    #  application:
    #    name: ZUULCONSUMER
    #eureka:
    #  client:
    #    service-url:
    #      defaultZone: http://127.0.0.1:8761/eureka/
    ##通过http://localhost:8082/demo/hello访问
    #zuul:
    #  routes:
    #    eureka-application-service:
    #      path: /demo/**
    #      url: http://localhost:8083/
    
    #方法三
    server:
      port: 8082
    spring:
      application:
        name: ZUULCONSUMER
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:8761/eureka/
    #通过http://localhost:8082/provider/hello访问
    #http://localhost:8082/provider/hello?name=chenlou&token=zz
    zuul:
      retryable: true
    ribbon:
      MaxAutoRetries: 2
      MaxAutoRetriesNextServer: 0

    ZuulconsumerApplication.java

    package com.work.zuulconsumer;
    
    import com.work.zuulconsumer.filter.TokenFilter;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
    import org.springframework.context.annotation.Bean;
    
    /**
     * @EnableZuulProxy开启Zuul网关
     * 当前应用是一个Zuul微服务网关,会在Eureka注册中心注册当前服务,并发现其他的服务。
     * Zuul需要的必要依赖是spring-cloud-starter-zuul
     */
    @SpringBootApplication
    @EnableZuulProxy
    public class ZuulconsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ZuulconsumerApplication.class, args);
        }
    
        @Bean
        public TokenFilter tokenFilter(){
            return new TokenFilter();
        }
    
    }

    TokenFilter.java

    package com.work.zuulconsumer.filter;
    
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import com.netflix.zuul.exception.ZuulException;
    import org.apache.commons.lang.StringUtils;
    
    import javax.servlet.http.HttpServletRequest;
    
    public class TokenFilter extends ZuulFilter {
        @Override
        public String filterType() {
            return "pre";
        }
    
        @Override
        public int filterOrder() {
            return 0;
        }
    
        @Override
        public boolean shouldFilter() {
            return true;
        }
    
        @Override
        public Object run() throws ZuulException {
            System.out.println("This is run.");
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
            System.out.println("TokenFilter "+request.getMethod()+" "+request.getRequestURL().toString());
            String token = request.getParameter("token");
            if(StringUtils.isNotBlank(token)){
                ctx.setSendZuulResponse(true);
                ctx.setResponseStatusCode(200);
                ctx.set("isSuccess",true);
                return null;
            }else{
                ctx.setSendZuulResponse(false);
                ctx.setResponseStatusCode(400);
                ctx.setResponseBody("token is empty");
                ctx.set("isSuccess",false);
                return null;
            }
        }
    }

    ProviderFallback.java

    package com.work.zuulconsumer.fallback;
    
    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 java.io.ByteArrayInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    public class ProviderFallback implements FallbackProvider {
        @Override
        public String getRoute() {
            return "PROVIDER";
        }
    
        @Override
        public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
            if(cause != null){
                String reson = cause.getMessage();
                System.out.println("Exception: "+reson);
            }
            return fallbackResponse();
        }
    
        public ClientHttpResponse fallbackResponse() {
            return new ClientHttpResponse() {
                @Override
                public HttpStatus getStatusCode() throws IOException {
                    return HttpStatus.OK;
                }
    
                @Override
                public int getRawStatusCode() throws IOException {
                    return 200;
                }
    
                @Override
                public String getStatusText() throws IOException {
                    return "OK";
                }
    
                @Override
                public void close() {
    
                }
    
                @Override
                public InputStream getBody() throws IOException {
                    return new ByteArrayInputStream("The service is unavailable.".getBytes());
                }
    
                @Override
                public HttpHeaders getHeaders() {
                    HttpHeaders headers = new HttpHeaders();
                    headers.setContentType(MediaType.APPLICATION_JSON);
                    return headers;
                }
            };
        }
    }

    运行起来之后通过http://localhost:8082/provider/hello?name=chenlou&token=zz即可访问页面,name和token的值可以自己随便写。

  • 相关阅读:
    使用uWSGI+Nginx+Supervisor部署管理Django应用程序
    Django REST framework使用ViewSets的自定义路由实现过程
    【转】nginx配置:location配置方法及实例详解
    Python模块的动态加载机制
    【转】Django中的request与response对象
    【转】Django Middleware
    【转】请求处理机制其三:view层与模板解析
    朝花夕拾
    买了台robosense的激光雷达,待开箱
    热力学量微分关系式总结+助记 Lebal:Research
  • 原文地址:https://www.cnblogs.com/LoganChen/p/13932663.html
Copyright © 2011-2022 走看看