您的位置:首页 > 编程语言 > Java开发

Spring cloud实战-Zuul如何动态负载和服务发现扩容

2017-08-15 19:30 567 查看

Zuul、Fegin、Rebbion、Eureka一条龙

很多人都自然而然把zuul当成nginx那样来在配置写死节点配置来。实际上zuul和eureka的是可以完美配合,完全可以基于
服务名
的注册和发现,来动态的实现服务的
动态负载
动态注册
,从而达到
不需要重启zuul即可达到动态扩容的
。下文将介绍
静态配置路由表
和从
Eureka发现服务
的两种方式来加强Zuul的使用。

项目地址:

AG-Admin:http://git.oschina.net/geek_qi/ace-security

GateWay搭建



Maven依赖

<dpendency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session</artifactId>
<version>1.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>


基于Eureka的application.yml(关键)

spring:
application:
name: ace-gate
thymeleaf:
mode: LEGACYHTML5
cache: false
redis:
database: 1
host: 127.0.0.1
pool:
max-active: 20
server:
port: 8765 #启动端口

#开启动态网关服务发现
ribbon:
eureka:
enabled: true

#配置zuul路由表,静态路由
#zuul:
#  #prefix: /techouse #为zuul设置一个公共的前缀
#  #ignoredServices: '*'
#  routes:
#    ace-admin: #随便定义,当不存在serviceId时,默认该值为serviceId(就是注册服务的名称,属性spring.application.name)
#      path: /test/** #匹配/test/** 均路由到cloud-client

#基于静态路由节点的ribbon负载均衡配置
#ace-admin:
#  ribbon:
#    listOfServers: 127.0.0.1:8767

eureka:
instance:
statusPageUrlPath: ${management.context-path}/info
healthCheckUrlPath: ${management.context-path}/health
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/ security:
user:
name: admin
password: admin
role: USER
#避免第一次调用失败
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000

#请求和响应GZIP压缩支持
feign:
compression:
request:
enabled: true
mime-types: text/xml,application/xml,application/json
min-request-size: 2048
response:
enabled: true


启用Zuul、Fegin、Eureka注解

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
@EnableZuulProxy
@EnableRedisHttpSession(redisFlushMode = RedisFlushMode.IMMEDIATE)
public class GateBootstrap {
public static void main(String[] args) {
SpringApplication.run(GateBootstrap.class, args);
}
}


Zuul filter拦截示例代码

@Component
public class SessionAccessFilter extends ZuulFilter {
private final Logger log = LoggerFactory.getLogger(SessionAccessFilter.class);

@Autowired
private SessionRepository<?> repository;
@Autowired
private IUserService userService;

@Override
public String filterType() {
return "pre";
}

@Override
public int filterOrder() {
return 1;
}

@Override
public boolean shouldFilter() {
return true;
}

@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpSession httpSession = ctx.getRequest().getSession();
if (不符合权限){
setFailedRequest("<h1>Forbidden!</h1>",403);
}
return null;
}

/**
* 路由重定向
*
* @param body
* @param code
*/
private void setFailedRequest(String body, int code) {
log.debug("Reporting error ({}): {}", code, body);
RequestContext ctx = RequestContext.getCurrentContext();
ctx.setResponseStatusCode(code);
if (ctx.getResponseBody() == null) {
ctx.setResponseBody(body);
ctx.setSendZuulResponse(false);
throw new RuntimeException("Code: " + code + ", " + body); //optional
}
}
}


访问网关地址示例

[ip]:[zuul port]/[Eureak 注册服务]/[资源路径]


Zuul兼容动态注册和静态路由表

核心思路

基于Eureka上注册另一个zuul,通过主的zuul gate way来分流到另外一个zuul,从而兼容静态路由的情况。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring spring-cloud