zoukankan      html  css  js  c++  java
  • Greenwich.SR2版本的Spring Cloud Zuul实例

      网关作为对外服务,在微服务架构中是一个很重要的组件,主要体现在动态路由和接入鉴权这两个功能上。现在我们通过Spring Cloud Zuul来实现对之前a-feign-client(参见Greenwich.SR2版本的Spring Cloud Feign实例)调用的路由映射,并对外部请求做一个简单的鉴权。三板斧祭出:

      1、pom里引入spring-cloud-starter-netflix-zuul:

    <?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>
    
      <groupId>com.example</groupId>
      <artifactId>gateway</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>jar</packaging>
    
      <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
      </parent>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>org.springframework.cloud</groupId>
          <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <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-web</artifactId>
        </dependency>
        
        <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
        </dependency>
     
      <dependencyManagement>
        <dependencies>
          <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Greenwich.SR2</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>

      2、application:

    #本机端口
    server.port=8765
    
    #服务名
    spring.application.name=api-gateway
    
    #注册中心地址
    eureka.client.service-url.defaultZone=http://localhost:8888/eureka/
    
    #路由规则
    zuul.routes.hello.path=/hello/**
    
    #路由映射
    zuul.routes.hello.service-id=a-feign-client

      3、主类通过@EnableZuulProxy启动网关服务,新增一个过滤器SimpleFilter:

    package hello;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
    import org.springframework.context.annotation.Bean;
    import hello.filters.pre.SimpleFilter;
    
    @EnableZuulProxy
    @SpringBootApplication
    public class GatewayApplication {
    
      public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
      }
    
      @Bean
      public SimpleFilter simpleFilter() {
        return new SimpleFilter();
      }
    
    }
    package hello.filters.pre;
    
    import javax.servlet.http.HttpServletRequest;
    
    import com.netflix.zuul.context.RequestContext;
    import com.netflix.zuul.ZuulFilter;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    public class SimpleFilter extends ZuulFilter {
    
        private static Logger log = LoggerFactory.getLogger(SimpleFilter.class);
    
        @Override
        public String filterType() {
            return "pre";
        }
    
        @Override
        public int filterOrder() {
            return 1;
        }
    
        @Override
        public boolean shouldFilter() {
            return true;
        }
    
        @Override
        public Object run() {
            RequestContext ctx = RequestContext.getCurrentContext();
            HttpServletRequest request = ctx.getRequest();
    
            log.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
    
            Object accessToken = request.getParameter("accessToken");
            if (accessToken == null) {
                log.warn("access token is empty");
                ctx.setSendZuulResponse(false);
                ctx.setResponseStatusCode(401);
                ctx.setResponseBody("{"result":"accessToken为空!"}");
                ctx.getResponse().setContentType("text/html;charset=UTF-8");
                return null;
            }
            log.info("access token ok");
    
            return null;
        }
    
    }

      OK,我们在浏览器请求http://localhost:8765/hello/consumer/sayHi?name=world看看:

      加上accessToken参数(参数值随便填一个)再请求一次:

      我们看到路由和鉴权都实现了。

  • 相关阅读:
    DelphiXE下的字符串变化
    FastMM配置文件详解
    [转] FastMM、FastCode、FastMove的使用
    FastMM 定位内存泄露的代码位置
    转 Delphi中使用FastMM4结合View CPU避免内存泄漏
    [转] FastMM使用详解
    salesforce 零基础开发入门学习(九)Approval Process 介绍
    salesforce 零基础开发入门学习(八)数据分页简单制作
    salesforce 零基础开发入门学习(七)PickList的value值获取
    salesforce 零基础开发入门学习(六)简单的数据增删改查页面的构建
  • 原文地址:https://www.cnblogs.com/wuxun1997/p/11217823.html
Copyright © 2011-2022 走看看