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