spring cloud zuul 配置
参考:http://www.ityouknow.com/springcloud/2017/06/01/gateway-service-zuul.html
spring boot版本:2.0.3.RELEASE
pom.xml
<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-client</artifactId> </dependency>
application.properties
可以手动配置固定地址调用,也可以通过注册中心调用,二选一
spring.application.name=gateway-service-zuul-wly
server.port=8088
#1.显式将所有/wly/**请求转发给http://localhost:8081处理,例如/wly/a等同于http://localhost:8081/a
#zuul.routes.wly.path=/wly/**
#zuul.routes.wly.url=http://localhost:8081
#2.配置注册中心地址,默认通过注册中心调用,规则“/注册中心serviceId/xxx”
eureka.client.serviceUrl.defaultZone=http://localhost:8765/eureka/
启动类
package com.wang.springcloudzuul; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication @EnableZuulProxy public class SpringcloudzuulApplication { public static void main(String[] args) { SpringApplication.run(SpringcloudzuulApplication.class, args); } }
启动一个注册中心、1个生产者、2个消费者、1个zuul服务,如下图:
单独访问消费者服务
http://localhost:8081/a/c?name=sb
页面
Hello World!sb
使用zuul通过eureka多次访问消费者服务
http://localhost:8088/spring-cloud-consumer/a/c?name=sb
页面
Hello World!sb
查看控制台日志
多次请求zuul的服务,请求会被分发到不同的消费者服务里
zuul服务熔断机制
新增一个类
package com.wang.springcloudzuul.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; /** * @Author wly * @Date 2018/7/3 15:53 */ @Component public class ProducerFallBack implements FallbackProvider { private final Logger logger = LoggerFactory.getLogger(FallbackProvider.class); /** * 定义对那个服务做熔断 * @return */ @Override public String getRoute() { return "spring-cloud-provider"; } /** * 提供者路由熔断返回值 * * @return */ public ClientHttpResponse fallbackResponse() { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.OK; } @Override public int getRawStatusCode() throws IOException { return 200; } @Override public String getStatusText() throws IOException { return "OK"; } @Override public void close() { } @Override public InputStream getBody() throws IOException { return new ByteArrayInputStream("The service is unavailable.".getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } }; } @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { if (cause != null && cause.getCause() != null) { String reason = cause.getCause().getMessage(); logger.info("Excption {}", reason); } return fallbackResponse(); } }
当服务调用失败,会返回
The service is unavailable.
zuul服务重连机制
pom.xml新增配置
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
applicaiton.yml新增配置
#服务重试功能
zuul.retryable=true
#重试次数
ribbon.MaxAutoRetries=2
#重试其他实例的最大次数
ribbon.MaxAutoRetriesNextServer=0
提供者controller
package com.wang.eurekaprovider.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author wly
* @Date 2018/6/27 16:15
*/
@RestController
@RequestMapping("/a")
public class HelloController {
@RequestMapping("/b")
public String hello(String name) throws InterruptedException {
System.out.println("11111111111111111");
Thread.sleep(100000L);
return "Hello World!" + name;
}
}
服务调用失败后自动重试
通过zuul访问http://localhost:8088/spring-cloud-provider/a/b?name=sb
控制台输出3次:11111111111111111