spring cloud zuul 配置

时间:2023-03-09 19:28:50
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服务,如下图:

spring cloud 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