首页 > 其他分享 >SpringCloud学习-3

SpringCloud学习-3

时间:2023-06-28 21:34:06浏览次数:47  
标签:zuul service SpringCloud 学习 user 过滤器 10010 localhost

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  # 连接超时

标签:zuul,service,SpringCloud,学习,user,过滤器,10010,localhost
From: https://www.cnblogs.com/meer/p/17512611.html

相关文章

  • 1、MySQL操作命令学习1
    一、对数据库及表的基础操作1、连接数据库服务器                   mysql-hlocalhost-uroot-p1234562、2.退出服务器                           exit3、查看所有的数据库                  ......
  • linux D-Bus学习第一天:一次简单的信号通讯
    由于blelinux开发需要,所现在开始学习D-Bus,看到了这篇博客,收获颇丰并对其有了大概的了解博客1:这里现在对之前D-Bus安装时的测试程序进行分析,了解各个函数的含义以及为何使用//服务端代码#include<stdio.h>#include<stdlib.h>#include<string.h>#include<dbus/dbus.h......
  • std::quoted试用学习
    std::quoted是干啥用的,有啥作用?看是c++14和17中加入的。quoted这个单词似乎在计算机里面就有着特殊的意思,可惜没记住。英文原版资料看的少。  在cppreference网站中的示例如下:(https://en.cppreference.com/w/cpp/io/manip/quoted)voiddefault_delimiter(){conststd......
  • Markdown学习
    Markdown学习标题字体黑体黑体斜体斜体斜黑体斜黑体删除删除引用随心所欲地活着,努力并热爱着图片![截图](D:\新建文件夹\1-edit(1).jpg)超链接B站链接列表ABCDABCD表格名字性别生日张三男1979.1.2李四......
  • JMeter使用学习记录
    一、安装1.下载JMeterhttps://jmeter.apache.org/download_jmeter.cgi下载安装文件到本地2.安装JDKhttps://www.oracle.com/java/technologies/downloads/3.切换中文进入bin文件夹打开jmeter.properties#language=en下增加#language=zh_CN二、使用1.进入安装文件夹......
  • JavaScript学习 -- 内置函数(Math和Date)
    一、Date函数letdate=newDate()console.log("当前日期和时间:"+date)console.log("当前日期和时间:"+date.toLocaleString())console.log("年份:"+date.getFullYear())console.log("月份:"+(parseInt(date.getMonth())+1))console.log("日:"......
  • dsu on tree 学习笔记
    dsuontree学习笔记引入dsu是并查集的缩写,然鹅本算法和并查集没啥关系。当然,dsuontree也有中文名字:树上启发式合并。也就是说,这个算法是用于处理一些树上信息的合并的。dsuontree和莫队一样,都是优雅的暴力。优雅是因为思想很优雅,暴力是因为所有修改都是暴力做的——没......
  • 二维数组的学习
    二维数组的拷贝这里介绍两种拷贝的方式:1.一种是通过指针的方式进行拷贝,另外一种是通过一维数组的方式进行拷贝。2.copy_arr函数实现的是指针方式的拷贝,copy_arr1实现的是一维数组方式的拷贝。两种拷贝的运行结果一样```////2023/6/28.//#include<stdio.h>#defineROW......
  • Azure学习
    https://learn.microsoft.com/zh-cn/azure/?product=popular AzureSamples(github.com)......
  • CUDA学习详细教程之指针篇
    近期,我在写深度学习相关的C++部署时候,往往想更好的提速,将更多类似矩阵相关的运算交给CUDA处理,以此提高推理速度。然,cuda编程入门较为复杂,想简单对图像预处理,通过指针指向减少host到device时间,或模型预测后device上处理完后,数据在device到host输出结果等,这些将会涉及很多知识。......