springcloud之zuul小栗子

写在前面

  • 源码
    这里
  • 阅读本文准备
    本文在这篇博文基础上继续分析。
    本文会创建一个zuul的网关服务,调用之前博文中创建的服务。

1:创建my-service-zuul

new->module,后续按照提示录入gav等信息,选择maven
,java8等后finish即可,finish当前项目模块结构如下图:
在这里插入图片描述

2:设置parent

<parent>
    <groupId>dongshi.daddy</groupId>
    <artifactId>my-eureka</artifactId>
    <version>1.0-SNAPSHOT</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

3:引入依赖

<dependencies>
    <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-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
    </dependency>
</dependencies>

4:完整pom

<?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>dongshi.daddy</groupId>
    <artifactId>my-service-zuul</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>my-service-zuul</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>dongshi.daddy</groupId>
        <artifactId>my-eureka</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <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-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
    </dependencies>
</project>

5:配置文件

server:
  port: 8769

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

spring:
  application:
    name: service-zuul
zuul:
  routes:
    api-a:
      path: /api-a/**
      serviceId: dongshidaddy-first-ribbon
    api-b:
      path: /api-b/**
      serviceId: dongshidaddy-first-feign-client

通过zuul.routes.{api-name}.path设置要路由的API的路径,通过zuul.routes.{api-name}.serviceId设置具体处理API路径的的服务id(在eureka服务端注册的id),这里存在如下的映射关系:

/api-a/** -> dongshidaddy-first-ribbon
/api-b/** -> dongshidaddy-first-feign-client

6:启用相关注解

@SpringBootApplication
@EnableZuulProxy
@EnableEurekaClient
@EnableDiscoveryClient

作用都是启用相关的功能。

7:测试

7.1:启动my-enreka-server

该服务作为注册中心使用。
在这里插入图片描述
可以看到此时No instances available

7.2:启动myeureka-client

该服务作为最终对外提供的服务的应用。注意这个不是咱们在my-service-zuulapplication.yml中配置的serviceId
在这里插入图片描述
此时服务idDONGSHIDADDY-FIRST-EUREKA-CLIENT就已经注册上来了。

7.3:启动my-service-feign

该服务就是我们在my-service-zuul中配置:

api-b:
      path: /api-b/**
      serviceId: dongshidaddy-first-feign-client

其中的serviceId: dongshidaddy-first-feign-client对应的具体服务。启动后注册信息下图:
在这里插入图片描述

7.4:启动my-service-ribbon

该服务就是我们在my-service-zuul配置的

api-a:
      path: /api-a/**
      serviceId: dongshidaddy-first-ribbon

中的dongshidaddy-first-ribbon对应的具体服务,启动后eureka服务端如下图:
在这里插入图片描述

7.5:启动my-service-zuul

启动后:
在这里插入图片描述

7.6:访问/api-a/**

xbdeMacBook-Air:~ xb$ curl http://localhost:8769/api-a/hi?name=dongshidaddy
hi dongshidaddy ,i am from port:8763

7.7:访问/api-b/**

xbdeMacBook-Air:~ xb$ curl http://localhost:8769/api-b/hi?name=dongshidaddy
hi dongshidaddy ,i am from port:8763

8:增加过滤功能

zuul除了路由的功能外,还支持过滤拦截功能,只需要实现com.netflix.zuul.ZuulFilter抽象类就可以了,如下定义:

@Component
public class MyFilter extends ZuulFilter {
    
    

    private static Logger log = LoggerFactory.getLogger(MyFilter.class);
    @Override
    public String filterType() {
    
    
        return "pre";
    }

    @Override
    public int filterOrder() {
    
    
        return 0;
    }

    @Override
    public boolean shouldFilter() {
    
    
        return true;
    }

    @Override
    public Object run() {
    
    
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
        Object accessToken = request.getParameter("token");
        if(accessToken == null) {
    
    
            log.warn("token is empty");
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(401);
            try {
    
    
                ctx.getResponse().getWriter().write("token is empty");
            }catch (Exception e){
    
    }

            return null;
        }
        log.info("ok");
        return null;
    }
}

8.1:测试

注意重新启动my-service-zuul

xbdeMacBook-Air:~ xb$ curl http://localhost:8769/api-b/hi?name=dongshidaddy
token is empty
xbdeMacBook-Air:~ xb$ curl "http://localhost:8769/api-b/hi?name=dongshidaddy&token=111"
hi dongshidaddy ,i am from port:8763

最后:都让开,我要喝瑞幸

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/wang0907/article/details/109256769