1.新建模块spring boot工程
2.引入依赖:
<!-- eureka-client依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.1.5.RELEASE</version>
</dependency>
<!--zuul依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
在启动类添加注解:
@EnableEurekaClient 服务提供者
@EnableZuulProxy //开启zuul
配置yml文件:
spring:
application:
name: service-zuul
server:
port: 5000
eureka:
client:
register-with-eureka: true
fetch-registry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
zuul:
routes: #下面目录的个数应该对应项目模块数吧
providerAPI: #该词是自定义的,对应自己的某一个工程
#可以使以“/provapi”开头的RTL路由到eureka-client
path: /provapi/** #自定义的路径
serviceID: eureka-client #对应服务提供者的工程名
ribbonAPI:
path: /ribbonapi/**
serviceID: eureka-ribbon-client
feignAPI:
path: /feignapi/**
serviceID: eureka-feign-client
#stripPrefix: false
访问:
再次访问;
2.在zuul添加熔断器
实现接口:
package com.wxz.eurekazuulclient.netflixHystrix;
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 java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* @author Wangxingze
* @date 2019-08-24 01:11
*/
/**
* 路由到eureka-client服务的熔断器
*/
public class EurekaClientHystrix implements FallbackProvider {
/**
* 指定熔断器作用与哪一个服务
* @return
*/
@Override
public String getRoute() {
return "eureka-client";
}
/**
* 快速失败的执行逻辑板
* @param route
* @param cause
* @return 必须返回一个 clientresponse
*/
@Override
public ClientHttpResponse fallbackResponse(String route, Throwable cause) {
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("oh! 我是fallback".getBytes());
}
@Override
public HttpHeaders getHeaders() {
HttpHeaders headers=new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return headers;
}
};
}
}
正常访问:
关闭服务提供者:eureke-client的所有实例再次访问
可是这里还是显示的是在服务消费者里面配置的快速失败返回的数据啊。。。
oh上面应该直接访问服务提供者啊啊啊啊啊啊啊啊,所以我们正常访问一下服务提供者,而不在通过消费者去调用
成功,并且有了负载均衡。
关闭服务提供者,再次访问
ok.
所以上面访问消费者时,因为在消费者服务上加了熔断器,所以直接在快速失败函数返回了。