SpringCloud学习-3

SpringCloud学习第三天

使用zuul实现路由代理

在父工程下新家gateway(网关)子项目,使用zuul后,以后路由的访问都要经过zuul,想要访问localhost:8081/user/1的服务,需要如下配置

<dependencies>
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
  </dependency>
</dependencies>

启动类

@EnableZuulProxy	// 使用zuul
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class);
    }
}

yml

server:
  port: 10010
zuul:
  routes:
    user-service:	# key:可随意取
      path: /user-service/**	# 匹配的路径
      url: http://127.0.0.1:8081	# 代理的url

启动user-service、gateway项目,访问zuul的服务 localhost:10010/user-service/user/1,可以返回user信息。问题:zuul中配置的服务匹配路径url写死了,也无法实现负载均衡,优化:zull向Eureka动态拉取服务。

将zuul加入注册中心
<dependencies>
   <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  </dependency>
  <!-- 注意不要导错包,否则会找不到Eureka中的服务。自己也不会显示在服务列表中 -->
</dependencies>

yml

server:
  port: 10010
spring:
  application:
    name: gateway
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10001/eureka
zuul:
  routes:
    user-service:	# key:可随意取
      path: /user-service/**	# 匹配的路径
      serviceId: user-service	# 这里改成serviceId,实现负载均衡
# 简化配置  
zuul:
  routes:
    user-service:	/user-service/** # 服务名称:匹配路径
  

访问 localhost:10010/user-service/user/1可以获取到user-service提供的 user信息。

没有配置consumer-client路径,直接访问localhost:10010/consumer-client/consumer/1也可以访问到接口数据,原因是zuul会拉取Eureka所有的服务,默认配置好。

忽略部分服务,不对外暴露,使用如下配置

zuul:
    ignored-services:
    - consumer-client	# 是个集合,可配多个

再次访问localhost:10010/consumer-client/consumer/1就会报错;

不去除路由匹配的前缀的配置:

zuul:
  routes:
    user-service:	# key:可随意取
      path: /user/**	# 匹配的路径
      serviceId: user-service	# 这里改成serviceId,实现负载均衡
      strip-prefix: false # 不去除路由匹配的前缀,局部
  prefix: /api	# 添加全局前缀
  strip-prefix: true	# 全局去除/api 

不加strip-prefix,需要访问localhost:10010/user/user/1,加上访问localhost:10010/user/1即可。

过滤器

filerType 四种过滤类型

pre:前置过滤器,请求在进入路由之前执行

routing:路由过滤器,在路由请求时调用

post:后置过滤器

error:错误过滤器

自定义拦截器需要继承ZuulFilter,复写四个方法,如下一个简单的登录拦截过滤器

/**
 * 实现登录过滤器
 */
@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 {
        // 获取request
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        // 获取参数
        String token = request.getParameter("token");

        // 判断是否存在
        if(StringUtils.isBlank(token)){
            // 拦截
            ctx.setSendZuulResponse(false);
            ctx.setResponseStatusCode(HttpStatus.FORBIDDEN.value());
        }
        return null;
    }
}

重启zuul服务,请求localhost:10010/user-service/user/1,访问被拒绝,返回403,请求路径上带上token,localhost:10010/user-service/user/1?token="1"即可访问。

zuul中默认集成了Ribbon和Hystix,可修改默认配置

hystrix:
  command:
    default:  #全局配置服务降级处理超时时长
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000
ribbon:
  ReadTimeout: 5000 # 读取数据超时
  ConnectTimeout: 5000  # 连接超时
posted @   Meer_zyh  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示