diff --git a/note/springCloudNetflix-7-31.md b/note/springCloudNetflix-7-31.md
new file mode 100644
index 0000000000000000000000000000000000000000..3d40e7c8c8231c0e131865a6346252bf31b14b2d
--- /dev/null
+++ b/note/springCloudNetflix-7-31.md
@@ -0,0 +1,55 @@
+[toc]
+
+# SpringCloudNetflix-day03
+
+## 1.Zuul服务网关
+
+- Zuul 是netflix开源的一个API Gateway 服务器, 本质上是一个web servlet(filter)应用。Zuul 在云平台上提供动态路由(请求分发),监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门,也要注册入Eureka。zuul本身是一个独立的服务,默认集成了Ribbon,zuul通过Ribbon将客户端的请求分发到下游的微服务,所以zuul需要通过Eureka做服务发行,同时zuul也集成了Hystrix。
+- 建立独立的工程去搭建Zuul服务,同时需要把Zuul注册到EurekaServer,因为当请求过来时,zuul需要通过EurekaServer获取下游的微服务通信地址,使用Ribbon发起调用。
+
+### 1.zuul工作原理
+
+- zuul的底层是通过各种Filter来实现的,zuul中的filter按照执行顺序分为了“pre”前置(”custom”自定义一般是前置),“routing”路由,“post”后置,以及“error”异常Filter组成,当各种Filter出现了异常,请求会跳转到“error filter”,然后再经过“post filter” 最后返回结果
+- 正常流程:
+ - 请求到达首先会经过pre类型过滤器,而后到达routing类型,进行路由,请求就到达真正的服务提供者,执行请求,返回结果后,会到达post过滤器。而后返回响应。
+- 异常流程:
+ - 整个过程中,pre或者routing过滤器出现异常,都会直接进入error过滤器,再error处理完毕后,会将请求交给POST过滤器,最后返回给用户。
+ - 如果是error过滤器自己出现异常,最终也会进入POST过滤器,而后返回。
+ - 如果是POST过滤器出现异常,会跳转到error过滤器,但是与pre和routing不同的时,请求不会再到达POST过滤器了。
+
+## 2.SpringCloudGateway服务网关
+
+### 1.Zuul与Gateway
+
+- Zuul是Netflix的开源项目,Spring Cloud将其收纳成为自己的一个子组件。zuul用的是多线程阻塞模型,它本质上就是一个同步 Servlet,这样的模型比较简单,他都问题是多线程之间上下文切换是有开销的,线程越多开销就越大。线程池数量固定意味着能力接受的请求数固定,当后台请求变慢,面对大量的请求,线程池中的线程容易被耗尽,后续的请求会被拒绝。
+- 在Zuul 2.0中它采用了 Netty 实现异步非阻塞编程模型,异步非阻塞模式对线程的消耗比较少,对线程上线文切换的消耗也比较小,并且可以接受更多的请求。它的问题就是线程模型比较复杂。
+- Spring Cloud Gateway是Spring Cloud自己的产物,基于Spring 5 和Spring Boot 2.0 开发,Spring Cloud Gateway的出现是为了代替zuul,在Spring Cloud 高版本中没有对zuul 2.0进行集成,SpringCloud Gateway使用了高性能的Reactor模式通信框架Netty。
+- Spring Cloud Gateway 的目标,不仅提供统一的`路由`方式,并且基于 Filter 链的方式提供了`网关基本的功能`
+
+### 2.Spring Cloud Gataway的特点
+
+- 基于 Spring 5,Project Reactor , Spring Boot 2.0
+- 默认集成 Hystrix 断路器
+- 默认集成 Spring Cloud DiscoveryClient
+- Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
+- 支持动态路由、限流、路径重写
+
+### 3.Spring Cloud Gataway的核心概念
+
+- Filter(过滤器):
+ - pring Cloud `Gateway的Filter和Zuul的过滤器类似`,可以在请求发出前后进行一些业务上的处理 ,这里分为`两种类型的Filter,分别是Gateway Filter网关filter和Global Filter全局Filter
+- Route(路由):
+ - 网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配,目标URI会被访问。说白了就是把url请求路由到对应的资源(服务),或者说是一个请求过来Gateway应该怎么把这个请求转发给下游的微服务,转发给谁。
+- Predicate(断言):
+ - 这是一个 Java 8 的 Predicate,可以使用它来`匹配来自 HTTP 请求的任何内容`,例如 headers 或参数。断言的输入类型是一个 ServerWebExchange。简单理解就是处理HTTP请求的匹配规则,在什么样的请情况下才能命中资源继续访问。
+
+### 4.Spring Cloud Gateway的工作方式
+
+- 客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序通过特定于请求的过滤器链来运行请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前和之后运行逻辑。所有“前置”过滤器逻辑均被执行。然后发出代理请求。发出代理请求后,将运行“后”过滤器逻辑。
+
+### 5.Predicate断言工厂
+
+- 其实断言工厂就是用来判断http请求的匹配方式。比如我们再上面案例中配置的:“`Path=/user/**`” ,就是使用的是 “`Path Route Predicate Factory`” 路径匹配工厂,意思是http请求的资源地址必须是 /user 才会被匹配到对应的路由,然后继续执行对应的服务获取资源。
+
+
+
diff --git a/pom.xml b/pom.xml
index 861af0596d52b72e119544d88875848a6c5b3341..8d9f65395a6c6f7004318524a41d16eef70a0a76 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,6 +13,8 @@
spring-cloud-order-server
spring-cloud-common
spring-cloud-pay-server
+ spring-cloud-netflix-zuul
+ spring-cloud-netflix-gateway
pom
@@ -60,6 +62,11 @@
lombok
1.18.12
+
+ com.alibaba
+ fastjson
+ 1.2.76
+
\ No newline at end of file
diff --git a/spring-cloud-netflix-gateway/pom.xml b/spring-cloud-netflix-gateway/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..15fce9d71bdec08bc34c2164eb7a3035b5fee02d
--- /dev/null
+++ b/spring-cloud-netflix-gateway/pom.xml
@@ -0,0 +1,29 @@
+
+
+
+ springcloud-parent
+ cn.mobius
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ spring-cloud-netflix-gateway
+
+
+ 8
+ 8
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-eureka-client
+
+
+ org.springframework.cloud
+ spring-cloud-starter-gateway
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-netflix-gateway/src/main/java/cn/mobius/GateWayApplication.java b/spring-cloud-netflix-gateway/src/main/java/cn/mobius/GateWayApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..2c2f743a0865b17944ae7dabe24411d062f55fd4
--- /dev/null
+++ b/spring-cloud-netflix-gateway/src/main/java/cn/mobius/GateWayApplication.java
@@ -0,0 +1,13 @@
+package cn.mobius;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+
+@SpringBootApplication
+@EnableDiscoveryClient // 服务注册和发现
+public class GateWayApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(GateWayApplication.class,args);
+ }
+}
diff --git a/spring-cloud-netflix-gateway/src/main/java/cn/mobius/config/FilterConfig.java b/spring-cloud-netflix-gateway/src/main/java/cn/mobius/config/FilterConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..5e787ed97ef7d9b1db2a548dff66b054cf89ca64
--- /dev/null
+++ b/spring-cloud-netflix-gateway/src/main/java/cn/mobius/config/FilterConfig.java
@@ -0,0 +1,29 @@
+package cn.mobius.config;
+
+import cn.mobius.filter.RequestTimeFilter;
+import org.springframework.cloud.gateway.route.RouteLocator;
+import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 将自定义过滤器配置在对应的路由上
+ */
+@Configuration
+public class FilterConfig {
+
+ //配置Filter作用于那个访问规则上
+ @Bean
+ public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
+
+ return builder.routes().route(r -> r.path("/services/user/**")
+ //去掉2个前缀
+ .filters(f -> f.stripPrefix(2)
+ .filter(new RequestTimeFilter())
+ .addResponseHeader("X-Response-test", "test"))
+ .uri("lb://service-user")
+ .order(0)
+ .id("test-RequestTimeFilter")
+ ).build();
+ }
+}
diff --git a/spring-cloud-netflix-gateway/src/main/java/cn/mobius/filter/RequestTimeFilter.java b/spring-cloud-netflix-gateway/src/main/java/cn/mobius/filter/RequestTimeFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..7f9a022266d88e384943c7a194597323f813413f
--- /dev/null
+++ b/spring-cloud-netflix-gateway/src/main/java/cn/mobius/filter/RequestTimeFilter.java
@@ -0,0 +1,41 @@
+package cn.mobius.filter;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.cloud.gateway.filter.GatewayFilter;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.core.Ordered;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+/**
+ * 自定义gateway 过滤器
+ */
+public class RequestTimeFilter implements GatewayFilter, Ordered {
+
+ private static final Log log = LogFactory.getLog(GatewayFilter.class);
+ private static final String COUNT_Start_TIME = "countStartTime";
+
+ @Override
+ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+ //开始时间
+ exchange.getAttributes().put(COUNT_Start_TIME, System.currentTimeMillis());
+ //执行完成之后
+ return chain.filter(exchange).then(
+ Mono.fromRunnable(() -> {
+ //开始时间
+ Long startTime = exchange.getAttribute(COUNT_Start_TIME);
+ //结束时间
+ Long endTime=(System.currentTimeMillis() - startTime);
+ if (startTime != null) {
+ log.info(exchange.getRequest().getURI().getRawPath() + ": " + endTime + "ms");
+ }
+ })
+ );
+ }
+
+ @Override
+ public int getOrder() {
+ return Ordered.LOWEST_PRECEDENCE;
+ }
+}
diff --git a/spring-cloud-netflix-gateway/src/main/java/cn/mobius/filter/TimeGlobleFilter.java b/spring-cloud-netflix-gateway/src/main/java/cn/mobius/filter/TimeGlobleFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..4693c30537b4f68e0faa3c3d8a5b47704deeafa5
--- /dev/null
+++ b/spring-cloud-netflix-gateway/src/main/java/cn/mobius/filter/TimeGlobleFilter.java
@@ -0,0 +1,65 @@
+package cn.mobius.filter;
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.core.io.buffer.DataBuffer;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.server.reactive.ServerHttpResponse;
+import org.springframework.stereotype.Component;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.io.UnsupportedEncodingException;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 自定义全局过滤器
+ */
+@Component
+@Slf4j
+public class TimeGlobleFilter implements GlobalFilter, Ordered {
+
+ @Override
+ public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
+
+ List token = exchange.getRequest().getHeaders().get("token");
+
+ log.info("检查 TOKEN = {}" ,token);
+ if(token == null || token.isEmpty()){
+ //响应对象
+ ServerHttpResponse response = exchange.getResponse();
+ //构建错误结果
+ HashMap data = new HashMap<>();
+ data.put("code",401);
+ data.put("message","未登录");
+
+ DataBuffer buffer = null;
+ try {
+ byte[] bytes = JSON.toJSONString(data).getBytes("utf-8");
+ buffer = response.bufferFactory().wrap(bytes);
+
+ //设置完成相应,不会继续执行后面的filter
+ //response.setComplete();
+ response.setStatusCode(HttpStatus.UNAUTHORIZED);
+ response.getHeaders().add("Content-Type","application/json;charset=UTF-8");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+
+ //把结果写给客户端
+ return response.writeWith(Mono.just(buffer));
+ }
+
+ log.info("Token不为空 ,放行");
+ return chain.filter(exchange);
+ }
+
+ @Override
+ public int getOrder() {
+ return 0;
+ }
+}
\ No newline at end of file
diff --git a/spring-cloud-netflix-gateway/src/main/resources/application.yml b/spring-cloud-netflix-gateway/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..63643566f3adf3d6e311699b8749720723763432
--- /dev/null
+++ b/spring-cloud-netflix-gateway/src/main/resources/application.yml
@@ -0,0 +1,25 @@
+eureka:
+ client:
+ serviceUrl:
+ defaultZone: http://localhost:1010/eureka/
+ instance:
+ prefer-ip-address: true #使用ip注册到Eureka
+ instance-id: gateway-server:1060 #指定客户端实例的ID
+spring:
+ application:
+ name: gateway-server
+ cloud:
+ gateway:
+ discovery:
+ locator:
+ enabled: false #开放服务名访问方式
+ lower-case-service-id: true #服务名小写
+ routes:
+ - id : application-user #指定服务名
+ uri: lb://user-server #去注册中心找这个服务名
+ predicates: #断言,匹配访问的路径
+ - Path=/user/** #服务访问路径
+ filters:
+ - StripPrefix=1 #请求转发的时候会去掉 /user访问路径
+server:
+ port: 1060
diff --git a/spring-cloud-netflix-gateway/target/classes/application.yml b/spring-cloud-netflix-gateway/target/classes/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..63643566f3adf3d6e311699b8749720723763432
--- /dev/null
+++ b/spring-cloud-netflix-gateway/target/classes/application.yml
@@ -0,0 +1,25 @@
+eureka:
+ client:
+ serviceUrl:
+ defaultZone: http://localhost:1010/eureka/
+ instance:
+ prefer-ip-address: true #使用ip注册到Eureka
+ instance-id: gateway-server:1060 #指定客户端实例的ID
+spring:
+ application:
+ name: gateway-server
+ cloud:
+ gateway:
+ discovery:
+ locator:
+ enabled: false #开放服务名访问方式
+ lower-case-service-id: true #服务名小写
+ routes:
+ - id : application-user #指定服务名
+ uri: lb://user-server #去注册中心找这个服务名
+ predicates: #断言,匹配访问的路径
+ - Path=/user/** #服务访问路径
+ filters:
+ - StripPrefix=1 #请求转发的时候会去掉 /user访问路径
+server:
+ port: 1060
diff --git a/spring-cloud-netflix-gateway/target/classes/cn/mobius/GateWayApplication.class b/spring-cloud-netflix-gateway/target/classes/cn/mobius/GateWayApplication.class
new file mode 100644
index 0000000000000000000000000000000000000000..20cf912cf480f8b972bc05385ebda388a4440e2f
Binary files /dev/null and b/spring-cloud-netflix-gateway/target/classes/cn/mobius/GateWayApplication.class differ
diff --git a/spring-cloud-netflix-zuul/pom.xml b/spring-cloud-netflix-zuul/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..52fde34a0eab95ab38642a4d47c80a6a546fb1fd
--- /dev/null
+++ b/spring-cloud-netflix-zuul/pom.xml
@@ -0,0 +1,34 @@
+
+
+
+ springcloud-parent
+ cn.mobius
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ spring-cloud-netflix-zuul
+ spring-cloud-netflix-zuul
+
+
+ 8
+ 8
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-zuul
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-eureka-client
+
+
+
\ No newline at end of file
diff --git a/spring-cloud-netflix-zuul/src/main/java/cn/mobius/ZuulApplication.java b/spring-cloud-netflix-zuul/src/main/java/cn/mobius/ZuulApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..81a4a847bdf439238264509f3684918a9f89869a
--- /dev/null
+++ b/spring-cloud-netflix-zuul/src/main/java/cn/mobius/ZuulApplication.java
@@ -0,0 +1,15 @@
+package cn.mobius;
+
+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
+@EnableZuulProxy // 开启zuul
+@EnableEurekaClient // zuul也是一个eureka客户端
+public class ZuulApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(ZuulApplication.class,args);
+ }
+}
diff --git a/spring-cloud-netflix-zuul/src/main/java/cn/mobius/fallback/PayServerFallback.java b/spring-cloud-netflix-zuul/src/main/java/cn/mobius/fallback/PayServerFallback.java
new file mode 100644
index 0000000000000000000000000000000000000000..008b16dfbdefc740c744f6997c169f6a3d3cea47
--- /dev/null
+++ b/spring-cloud-netflix-zuul/src/main/java/cn/mobius/fallback/PayServerFallback.java
@@ -0,0 +1,100 @@
+package cn.mobius.fallback;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+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.nio.charset.StandardCharsets;
+
+/**
+ * zuul熔断器配置
+ */
+@Component // 需要交给spring管理
+public class PayServerFallback implements FallbackProvider {
+
+ private final Logger logger = LoggerFactory.getLogger(FallbackProvider.class);
+
+ /**
+ * 指定需要熔断处理的服务
+ * @return
+ */
+ @Override
+ public String getRoute() {
+ // 如果写"*"代表所有服务
+ return "pay-server";
+ }
+
+ /**
+ * @param route 服务的路由
+ * @param cause 异常
+ * @return ClientHttpResponse 熔断后的返回值(托底数据)
+ */
+ @Override
+ public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
+ return new ClientHttpResponse() {
+ /**
+ * 请求状态
+ * @return
+ * @throws IOException
+ */
+ @Override
+ public HttpStatus getStatusCode() throws IOException {
+ return HttpStatus.OK;
+ }
+
+ /**
+ * 请求状态的值
+ * @return
+ * @throws IOException
+ */
+ @Override
+ public int getRawStatusCode() throws IOException {
+ return 200;
+ }
+
+ /**
+ * 请求状态的文本值
+ * @return
+ * @throws IOException
+ */
+ @Override
+ public String getStatusText() throws IOException {
+ return "OK";
+ }
+
+ @Override
+ public void close() {
+
+ }
+
+ /**
+ * 响应体
+ * @return
+ * @throws IOException
+ */
+ @Override
+ public InputStream getBody() throws IOException {
+ return new ByteArrayInputStream("抱歉服务不可用".getBytes(StandardCharsets.UTF_8));
+ }
+
+ /**
+ * 设置响应头
+ * @return
+ */
+ @Override
+ public HttpHeaders getHeaders() {
+ HttpHeaders httpHeaders = new HttpHeaders();
+ httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+ return httpHeaders;
+ }
+ };
+ }
+}
diff --git a/spring-cloud-netflix-zuul/src/main/java/cn/mobius/fliter/LoginCheckFilter.java b/spring-cloud-netflix-zuul/src/main/java/cn/mobius/fliter/LoginCheckFilter.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7de772cdd2300c54b8784272ef673187787bf71
--- /dev/null
+++ b/spring-cloud-netflix-zuul/src/main/java/cn/mobius/fliter/LoginCheckFilter.java
@@ -0,0 +1,108 @@
+package cn.mobius.fliter;
+
+import com.alibaba.fastjson.JSONArray;
+import com.netflix.zuul.ZuulFilter;
+import com.netflix.zuul.context.RequestContext;
+import com.netflix.zuul.exception.ZuulException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 自定义过滤器
+ */
+@Component // 需要交给spring管理
+public class LoginCheckFilter extends ZuulFilter {
+
+ // 日志
+ private static final Logger log = LoggerFactory.getLogger(LoginCheckFilter.class);
+
+ // 执行顺序
+ private static final int ORDER = 1;
+
+ /**
+ * 指定过滤器类型
+ * @return
+ */
+ @Override
+ public String filterType() {
+ // 前置过滤器
+ return FilterConstants.PRE_TYPE;
+ }
+
+ /**
+ * 过滤器的执行顺序,越小越优先执行
+ * @return
+ */
+ @Override
+ public int filterOrder() {
+ return ORDER;
+ }
+
+ /**
+ * 决定run方法是否要被执行
+ * @return
+ */
+ @Override
+ public boolean shouldFilter() {
+ // 获取request对象
+ HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
+
+ // 获取请求地址uri
+ String requestURI = request.getRequestURI();
+
+ log.info("请求地址:" + requestURI);
+ // 判断是否是公共的接口
+ if (requestURI.endsWith("/login") || requestURI.endsWith("/register") || requestURI.contains("/static/")) {
+ return false; // 不执行run方法
+ }
+
+ // 执行run方法,做登陆业务
+ return true;
+ }
+
+ /**
+ * 过滤器的核心业务方法
+ * @return
+ * @throws ZuulException
+ */
+ @Override
+ public Object run() throws ZuulException {
+ HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
+ HttpServletResponse response = RequestContext.getCurrentContext().getResponse();
+
+ // 获取token
+ String token = request.getHeader("token");
+
+ // 判断是否登录
+ if (!StringUtils.hasLength(token)) { // 字符序列不为 null 值,并且字符序列的长度大于 0
+ Map map = new HashMap<>();
+ map.put("success",false);
+ map.put("message","未登录,请前往登录!");
+
+ // 编码
+ response.setContentType("application/json;charset=utf-8");
+ String s = JSONArray.toJSONString(map);
+ response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 返回没有权限状态
+
+ try {
+ response.getWriter().print(s);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ // 阻止filter继续往后执行
+ RequestContext.getCurrentContext().setSendZuulResponse(false);
+ }
+
+ return null;
+ }
+}
diff --git a/spring-cloud-netflix-zuul/src/main/resources/application.yml b/spring-cloud-netflix-zuul/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0f8616339dea467805676196cf5cb9db11f5dcab
--- /dev/null
+++ b/spring-cloud-netflix-zuul/src/main/resources/application.yml
@@ -0,0 +1,39 @@
+#注册到EurekaServer
+eureka:
+ client:
+ serviceUrl:
+ defaultZone: http://localhost:1010/eureka/
+ #使用ip地址进行注册
+ instance:
+ prefer-ip-address: true
+ #要指定服务的实例ID
+ instance-id: zuul-server:1050
+server:
+ port: 1050
+spring:
+ application:
+ name: zuul-server #服务名
+
+zuul:
+ prefix: "/servers" #统一访问前缀
+ ignoredServices: "*" #禁用掉使用浏览器通过服务名的方式访问服务
+ routes:
+ pay-server: "/pay/**" #指定pay-server这个服务使用 /pay路径来访问 - 别名
+ order-server: "/order/**" #指定order-server这个服务使用 /order路径来访问
+ user-server: "/user/**" #指定user-server这个服务使用/user路径来访问
+ retryable: true #是否开启重试功能
+ ribbon:
+ eager-load.enabled: true # 饥饿加载
+ribbon:
+ MaxAutoRetries: 1 #对当前服务的重试次数
+ MaxAutoRetriesNextServer: 1 #切换相同Server的次数
+ OkToRetryOnAllOperations: false # 对所有的操作请求都进行重试,如post就不能重试,如果没做幂等处理,重试多次post会造成数据的多次添加或修改
+ ConnectTimeout: 3000 #请求连接的超时时间
+ ReadTimeout: 5000 #请求处理的超时时间
+hystrix:
+ command:
+ default:
+ execution:
+ isolation:
+ thread:
+ timeoutInMilliseconds: 10000 #如果配置ribbon的重试,hystrix的超时时间要大于ribbon的超时时间
diff --git a/spring-cloud-netflix-zuul/target/classes/application.yml b/spring-cloud-netflix-zuul/target/classes/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0f8616339dea467805676196cf5cb9db11f5dcab
--- /dev/null
+++ b/spring-cloud-netflix-zuul/target/classes/application.yml
@@ -0,0 +1,39 @@
+#注册到EurekaServer
+eureka:
+ client:
+ serviceUrl:
+ defaultZone: http://localhost:1010/eureka/
+ #使用ip地址进行注册
+ instance:
+ prefer-ip-address: true
+ #要指定服务的实例ID
+ instance-id: zuul-server:1050
+server:
+ port: 1050
+spring:
+ application:
+ name: zuul-server #服务名
+
+zuul:
+ prefix: "/servers" #统一访问前缀
+ ignoredServices: "*" #禁用掉使用浏览器通过服务名的方式访问服务
+ routes:
+ pay-server: "/pay/**" #指定pay-server这个服务使用 /pay路径来访问 - 别名
+ order-server: "/order/**" #指定order-server这个服务使用 /order路径来访问
+ user-server: "/user/**" #指定user-server这个服务使用/user路径来访问
+ retryable: true #是否开启重试功能
+ ribbon:
+ eager-load.enabled: true # 饥饿加载
+ribbon:
+ MaxAutoRetries: 1 #对当前服务的重试次数
+ MaxAutoRetriesNextServer: 1 #切换相同Server的次数
+ OkToRetryOnAllOperations: false # 对所有的操作请求都进行重试,如post就不能重试,如果没做幂等处理,重试多次post会造成数据的多次添加或修改
+ ConnectTimeout: 3000 #请求连接的超时时间
+ ReadTimeout: 5000 #请求处理的超时时间
+hystrix:
+ command:
+ default:
+ execution:
+ isolation:
+ thread:
+ timeoutInMilliseconds: 10000 #如果配置ribbon的重试,hystrix的超时时间要大于ribbon的超时时间
diff --git a/spring-cloud-netflix-zuul/target/classes/cn/mobius/ZuulApplication.class b/spring-cloud-netflix-zuul/target/classes/cn/mobius/ZuulApplication.class
new file mode 100644
index 0000000000000000000000000000000000000000..39a6ab1550336e26cffeb399f080d771afd26c5a
Binary files /dev/null and b/spring-cloud-netflix-zuul/target/classes/cn/mobius/ZuulApplication.class differ
diff --git a/spring-cloud-netflix-zuul/target/classes/cn/mobius/fallback/PayServerFallback$1.class b/spring-cloud-netflix-zuul/target/classes/cn/mobius/fallback/PayServerFallback$1.class
new file mode 100644
index 0000000000000000000000000000000000000000..8ee0de2b7fff9e6a7e2a7662f30e5a98c9dbdfbd
Binary files /dev/null and b/spring-cloud-netflix-zuul/target/classes/cn/mobius/fallback/PayServerFallback$1.class differ
diff --git a/spring-cloud-netflix-zuul/target/classes/cn/mobius/fallback/PayServerFallback.class b/spring-cloud-netflix-zuul/target/classes/cn/mobius/fallback/PayServerFallback.class
new file mode 100644
index 0000000000000000000000000000000000000000..a37e45417f7178980dff878811e4a1a0e3ca4052
Binary files /dev/null and b/spring-cloud-netflix-zuul/target/classes/cn/mobius/fallback/PayServerFallback.class differ
diff --git a/spring-cloud-netflix-zuul/target/classes/cn/mobius/fliter/LoginCheckFilter.class b/spring-cloud-netflix-zuul/target/classes/cn/mobius/fliter/LoginCheckFilter.class
new file mode 100644
index 0000000000000000000000000000000000000000..75e930fd3752d4f970cc2da00d72b6924434f5f7
Binary files /dev/null and b/spring-cloud-netflix-zuul/target/classes/cn/mobius/fliter/LoginCheckFilter.class differ