1.搭建工程引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
</dependencies>
2.配置启动项
package cn.itcast;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
@EnableZuulProxy
@SpringBootApplication
public class GetwayApplication {
public static void main(String[] args) {
SpringApplication.run(GetwayApplication.class);
System.out.println("getWay 启动成功");
}
}
3.配置文件application.yml
server:
port: 10010
zuul:
routes:
hehe:
path: /user-service/**
url: http://127.0.0.1:8081
这样我们就可以访问http://localhost:10010/user-service/user/1去访问我们再user-service的方法了。但是路径写死了,没用做到负载均衡
所有这里的做法是不合理的我们不能去访问这个,我们应该去访问eureka的服务,去达到负载均衡。
1.引入pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
1.引入eureka配置
- 这里是没有去除前缀的配置
我们的访问路径:http://localhost:10010/user/user/1
server:
port: 10010
#注册到服务中心
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka
zuul:
routes:
# key 是服务的id wvlue 是服务的路径
#这样的配置太常见了服务的id正好等于映射路径,默认的服务回去eureka服务器上把这个配置成这样的
#如果这样我们就可以不用配置了
#user-service: /user-service/**
#但是我们一帮自定义配置
user-service: /user/**
#要忽略的配置
ignored-services:
- consumer-service
- 我们去除前缀的配置
访问路径:http://localhost:10010/user/1
server:
port: 10010
#注册到服务中心
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka
zuul:
routes:
# key 是服务的id wvlue 是服务的路径
#这样的配置太常见了服务的id正好等于映射路径,默认的服务回去eureka服务器上把这个配置成这样的
#如果这样我们就可以不用配置了
#user-service: /user-service/**
#但是我们一帮自定义配置
user-service:
path: /user/**
serviceId: user-service
strip-prefix: false
#要忽略的配置
ignored-services:
- consumer-service
server:
port: 10010
#注册到服务中心
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka
zuul:
prefix: /api
routes:
# key 是服务的id wvlue 是服务的路径
#这样的配置太常见了服务的id正好等于映射路径,默认的服务回去eureka服务器上把这个配置成这样的
#如果这样我们就可以不用配置了
#user-service: /user-service/**
#但是我们一帮自定义配置
user-service: /user/**
#要忽略的配置
ignored-services:
- consumer-service
配置一个网关的拦截器
1.使用之前的配置
server:
port: 10010
#注册到服务中心
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka
zuul:
prefix: /api
routes:
# key 是服务的id wvlue 是服务的路径
#这样的配置太常见了服务的id正好等于映射路径,默认的服务回去eureka服务器上把这个配置成这样的
#如果这样我们就可以不用配置了
#user-service: /user-service/**
#但是我们一帮自定义配置
user-service:
path: /user/**
serviceId: user-service
strip-prefix: false
#要忽略的配置
ignored-services:
- consumer-service
- 写一拦截器继承ZuulFilter实现方法,每当你访问的时候拦截判断。
- 我们这判断有没有access-token
package cn.itcast.filter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component
public class LoginFilter extends ZuulFilter {
//过滤器类型 - 前置
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
//过滤器的顺序
@Override
public int filterOrder() {
return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
}
//是否启动过滤器
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
//获取请求上下文
RequestContext ctx = RequestContext.getCurrentContext();
//获取request
HttpServletRequest request = ctx.getRequest();
//获取请求的参数 access-token
String token = request.getParameter("access-token");
//判断是否存在
//这个方法是判断字符串是否存在的,这个是lang3包里面的工具我们没有写trim这个方法去判断,
// 应为这个方法的底层是截取形成新的字符串,容易找出内存溢出,效率很差
if(StringUtils.isBlank(token)){
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
}
//不存在,未登录,则拦截
return null;
}
}
当我们访问http://localhost:10010/api/user/1?access-token=123 可以成功
配置负载均衡和熔断
server:
port: 10010
#注册到服务中心
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:10086/eureka,http://127.0.0.1:10087/eureka
zuul:
prefix: /api
routes:
# key 是服务的id wvlue 是服务的路径
#这样的配置太常见了服务的id正好等于映射路径,默认的服务回去eureka服务器上把这个配置成这样的
#如果这样我们就可以不用配置了
#user-service: /user-service/**
#但是我们一帮自定义配置
user-service:
path: /user/**
serviceId: user-service
strip-prefix: false
#要忽略的配置
ignored-services:
- consumer-service
#############################负载均衡熔断
#配置全局超时
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 6000
ribbon:
ConnectionTimeout: 500
ReadTimeout: 1000
MaxAutoRetriesNextServer: 0 #不重试
微服务框架