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

Zuul、Fegin、Rebbion、Eureka一条龙

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

项目地址:

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

GateWay搭建

Spring cloud实战-Zuul如何动态负载和服务发现扩容_第1张图片
img

Maven依赖


    org.springframework.cloud
    spring-cloud-starter-zuul


    org.springframework.cloud
    spring-cloud-starter-feign


    org.springframework.cloud
    spring-cloud-starter-eureka


    org.springframework.session
    spring-session
    1.2.2.RELEASE


    org.springframework.boot
    spring-boot-starter-redis

基于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("

Forbidden!

",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 cloud实战-Zuul如何动态负载和服务发现扩容_第2张图片
img

你可能感兴趣的:(Spring cloud实战-Zuul如何动态负载和服务发现扩容)