1, 启动基础工程
1.1, 启动 [服务注册中心] , 工程名称: springcloud-eureka-server
参考 SpringCloud2.0 Eureka Server 服务中心 基础教程 (二) https://www.cnblogs.com/songlu/p/9921786.html
1.2, 启动 [服务提供者] , 工程名称: springcloud-eureka-client
参考 SpringCloud2.0 Eureka Client 服务注册 基础教程 (三) https://www.cnblogs.com/songlu/p/9962702.html
1.3, 启动 [服务消费者] , 工程名称: springcloud-eureka-ribbon
参考 SpringCloud2.0 Hystrix Ribbon 基于 Ribbon 实现断路器 基础教程 (六) https://www.cnblogs.com/songlu/p/9949203.html
1.4, 启动 [服务消费者] , 工程名称: springcloud-eureka-feign
参考 SpringCloud2.0 Hystrix Feign 基于 Feign 实现断路器 基础教程 (七) https://www.cnblogs.com/songlu/p/9968953.html
2, 创建 [网关路由] , 即 Eureka Zuul
2.1, 新建 Spring Boot 工程, 工程名称: springcloud-eureka-zuul
2.2, 工程 pom.xml 文件添加如下依赖:
- <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>
2.3, 在工程启动类中, 添加注解 @EnableZuulProxy
- package com.miniooc.eurekazuul;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
- /**
- * EurekaZuulApplication
- *
- * @author 宋陆
- * @version 1.0.0
- */
- @EnableZuulProxy
- @SpringBootApplication
- public class EurekaZuulApplication {
- public static void main(String[] args) {
- SpringApplication.run(EurekaZuulApplication.class, args);
- }
- }
2.4, 创建工程配置文件 application.YAML, 添加如下配置:
- server:
- port: 8080
- spring:
- application:
- name: eureka-gateway
- eureka:
- instance:
- hostname: localhost
- # 表示 eureka client 间隔多久去拉取服务注册信息, 默认为 30 秒, 如果要迅速获取服务注册状态, 可以缩小该值
- lease-renewal-interval-in-seconds: 5
- # 表示 eureka server 至上一次收到 client 的心跳之后, 等待下一次心跳的超时时间, 在这个时间内若没收到下一次心跳, 则将移除该 instance.
- # 默认为 90 秒
- # 如果该值太大, 则很可能将流量转发过去的时候, 该 instance 已经不存活了.
- # 如果该值设置太小了, 则 instance 则很可能因为临时的网络抖动而被摘除掉.
- # 该值至少应该大于 leaseRenewalIntervalInSeconds
- lease-expiration-duration-in-seconds: 10
- client:
- serviceUrl:
- defaultZone: http://localhost:9527/eureka/,http://localhost:9528/eureka/,http://localhost:9529/eureka/
- zuul:
- routes:
- API-ribbon:
- path: /ribbon/*
- serviceId: eureka-discovery-ribbon
- API-feign:
- path: /feign/*
- serviceId: eureka-discovery-feign
2.5, 启动工程
2.6, 打开浏览器, 分别访问 http://localhost:8080/ribbon/ribbonInfo , http://localhost:8080/feign/feignInfo
[路由网关] 按照路由转发规则, 把 /ribbon/* 的请求, 转发到了 eureka-discovery-ribbon 服务, 把 /feign/* 的请求, 转发到了 eureka-discovery-feign
3, 为 [网关路由] 添加自定义过滤器
zuul 过滤器有四种类型分别是: pre 路由前, route 路由时, post 路由完毕, error 发生错误时.
3.1, 创建自定义过滤器 AuthFilter
- package com.miniooc.eurekazuul.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;
- import javax.servlet.http.HttpServletResponse;
- /**
- * EurekaZuulApplication
- *
- * @author 宋陆
- * @version 1.0.0
- */
- public class AuthFilter extends ZuulFilter {
- @Override
- public String filterType() {
- return "pre"; // 在请求被路由之前调用
- }
- @Override
- public int filterOrder() {
- return 0; // filter 执行顺序, 通过数字指定 , 优先级为 0, 数字越大, 优先级越低
- }
- @Override
- public boolean shouldFilter() {
- return true; // 是否执行该过滤器, 此处为 true, 说明需要过滤
- }
- @Override
- public Object run() throws ZuulException {
- RequestContext ctx = RequestContext.getCurrentContext();
- HttpServletRequest request = ctx.getRequest();
- String token = request.getParameter("token");// 获取请求的参数
- // 如果有 token 参数并且 token 值为 miniooc, 才进行路由
- if (StringUtils.isNotBlank(token) && token.equals("miniooc")) {
- ctx.setSendZuulResponse(true); // 对请求进行路由
- ctx.setResponseStatusCode(200);
- ctx.set("code", 1);
- } else {
- ctx.setSendZuulResponse(false); // 不对其进行路由
- ctx.setResponseStatusCode(401);
- HttpServletResponse response = ctx.getResponse();
- response.setHeader("content-type", "text/html;charset=utf8");
- ctx.setResponseBody("网关认证失败, 停止路由");
- ctx.set("code", 0);
- }
- return null;
- }
- }
3.2, 创建应用配置类 EurekaRibbonConfig
- package com.miniooc.eurekazuul.config;
- import com.miniooc.eurekazuul.filter.AuthFilter;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- /**
- * EurekaZuulConfig
- * 应用配置类, 初始化 Bean 和配置信息
- *
- * @author 宋陆
- * @version 1.0.0
- */
- @Configuration
- public class EurekaZuulConfig {
- @Bean
- public AuthFilter authFilter(){
- return new AuthFilter();
- }
- }
3.3, 重新启动工程
3.4, 打开浏览器, 分别访问 http://localhost:8080/ribbon/ribbonInfo , http://localhost:8080/feign/feignInfo
没有通过校验, zuul 过滤器停止路由转发
3.5, 打开浏览器, 分别访问 http://localhost:8080/ribbon/ribbonInfo?token=miniooc,http://localhost:8080/feign/feignInfo?token=miniooc
通过校验, zuul 过滤器正常路由转发
至此, 一个简单的 [网关路由] 搭建完成.
来源: http://www.bubuko.com/infodetail-2861048.html