当前位置: 首页> 汽车> 新车 > 淘客推广代理_沃尔玛跨境电商平台_爱站seo工具包官网_网站 推广

淘客推广代理_沃尔玛跨境电商平台_爱站seo工具包官网_网站 推广

时间:2025/7/12 6:51:58来源:https://blog.csdn.net/2401_85217463/article/details/144806035 浏览次数: 0次
淘客推广代理_沃尔玛跨境电商平台_爱站seo工具包官网_网站 推广

Nacos官网| Nacos 配置中心 | Nacos 下载| Nacos 官方社区 | Nacos 官网是阿里巴巴的产品,现在是Spring Cloud中的一个组件。相比https://github.com/Netflix/eureka能更加
丰富,在国内受欢迎程度较高。

Nacos是 Dynamic Naming and Configuration Service的首字母简称,一个更易于
构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性
集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos官网地址:Redirecting to: https://nacos.io/

下载安装包
在GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:

GitHub主页:https://github.com/alibaba/nacos

GitHub的Release下载页:https://github.com/alibaba/nacos/releases

        解压
解压到任意非中文目录下,如图:

bin:启动脚本
conf:配置文件

        端口配置
        Nacos的默认端口是8848,如果你电脑上的其它进程占用了8848端口,请先尝
        试关闭该进程。
如果无法关闭占用8848端口的进程,也可以进入nacos的conf目录,修改配置文件中
的端口:

        *启动
启动非常简单,进入bin目录,结构如下:

然后执行命令即可,windows命令:

startup.cmd -m standalone

执行后的效果如图:

访问

在浏览器输入地址:http://127.0.0.1:8848/nacos即可:

默认的账号和密码都是nacos,进入后:

6.2 服务注册到nacos

Nacos是SpringCloudAlibaba的组件,而SpringCloudAlibaba也遵循SpringCloud中
定义的服务注册、服务发现规范。因此使用Nacos和使用Eureka对于微服务来说,并
没有太大区别。

6.2.1 引入依赖

        在父工程的pom文件中的
中引入SpringCloudAlibaba的依赖:

<!--spring cloud alibaba-->
        <dependency>
                groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2021.0.4.0</version>
                <type>pom</type>
        <scope>import</scope>
</dependency>

在dept-service和emp-service中的pom文件中引入nacos-discovery依赖:

<dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

注意:不要忘了注释掉eureka的依赖。

6.2.2 配置nacos地址
在dept-service和emp-service的application.yml中添加nacos地址:

spring:
        cloud:
                nacos:
                        server-addr: localhost:8848

注意:不要忘了注释掉eureka的地址

6.2.4 负载均衡

在SpringCloud2020.0.1.0之后版本不使用netflix了,所以我们不用Ribbon来实现负
载均衡。 因此需要在消费者服务端添加如下依赖:

        <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
 

6.2.4 重启

重启微服务后,登录nacos管理页面,可以看到微服务信息:

注意:不需要启动eureka server

6.3 服务分级存储模型

一个服务可以有多个实例,例如我们的dept-service,可以有:
        127.0.0.1:8081
        127.0.0.1:8082
        127.0.0.1:8083
假如这些实例分布于全国各地的不同机房,例如:
        127.0.0.1:8081,在上海机房
        127.0.0.1:8082,在上海机房
        127.0.0.1:8083,在杭州机房
Nacos就将同一机房内的实例 划分为一个集群


也就是说,dept-service是服务,一个服务可以包含多个集群,如杭州、上海,每个
集群下可以有多个实例,形成分级模型,如图:

微服务互相访问时,应该尽可能访问同集群实例,因为本地访问速度更快。当本集群
内不可用时,才访问其它集群。例如:

6.3.1 给dept-service配置集群


修改dept-service的application.yml文件,添加集群配置:

spring:
        cloud:
                nacos:
                        server-addr: localhost:8848
                        discovery:
                                cluster-name: SH #配置集群名称,也就是机房位置,例如:HZ,杭州

重启两个dept-service实例后,我们可以在nacos控制台看到下面结果:

6.3.2 同集群优先的负载均衡

Nacos中提供了一个NacosRule的实现,可以优先从同集群中挑选实例
        修改emp-service的application.yml文件,添加集群配置:

spring:
        cloud:
                nacos:
                        server-addr: localhost:8848
                        discovery:
                                cluster-name: SH # 集群名称

修改emp-service的application.yml文件,修改负载均衡规则:

spring:
        # 配置nacos注册中心的地址
        cloud:
                loadbalancer:
                        nacos: # 集成nacos的负载均衡算法
                                enabled: true
 

注意:注释掉之前的负载均衡规则

6.4 权重配置

服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好
的机器承担更多的用户请求。


默认情况下Nacos的负载均衡算法是同集群内随机挑选,不会考虑机器的性能问题。


因此,Nacos提供了权重配置来控制访问频率,权重越大则访问频率越高。


在nacos控制台,找到dept-service的实例列表,点击详情,即可修改权重:

spring:
        cloud:
                nacos:
                        discovery:
                                weight: 0.1        

权重取值范围:0~1;如果权重修改为0,则该实例永远不会被访问

6.5 环境隔离:

在开发过程中,可能会存在很多个软件环境:开发环境、测试环境、生产环境。


Nacos中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外
层隔离,实现多环境的隔离。
        nacos中可以有多个namespace
        namespace下可以有group、service等
        不同namespace之间相互隔离,例如不同namespace的服务互相不可见

namespace + group 才可以确定具体的微服务实例。默认情况下,所有service、
group都在同一个namespace,名为public。如下所示:

6.5.1 创建namespace

点击页面新增按钮,添加一个namespace:

填写表单:

就能在页面看到一个新的namespace:

6.5.2 给微服务配置namespace

例如,修改emp-service的application.yml文件:

spring:
        cloud:
                nacos:
                        server-addr: localhost:8848
                        discovery:
                                cluster-name: SH
                                namespace: 492a7d5d-237b-46a1-a99a-fa8e98e4b0f9 # 命名空间,填ID
 

重启emp-service后,访问控制台,可以看到下面的结果:

此时访问emp-service,因为namespace不同,会导致找不到deptservice,控制台
会报错:

6.6 实例类型

Nacos中的服务实例存在两种类型:
临时实例:如果实例宕机超过一定时间,会从服务列表剔除,并且实例会定时上报自
身的健康状态给Nacos注册中心,默认的类型。
非临时实例:如果实例宕机,不会从服务列表剔除,Nacos注册中心会主动询问实例
的健康状态,也可以叫永久实例。
配置一个服务实例为永久实例:

spring:
        cloud:
                nacos:
                        discovery:
                                ephemeral: false # 配置该实例为非临时实例
 

Nacos和Eureka整体结构类似,服务注册、服务拉取、心跳等待,但是也存在一些差
异:

Nacos与eureka的共同点

        都支持服务注册和服务拉取
        都支持服务提供者心跳方式做健康检测
Nacos与Eureka的区别
        Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实
        例采用主动检测模式
        临时实例心跳不正常会被剔除,非临时实例则不会被剔除
        Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
        Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;
        Eureka采用AP方式

一.Nacos配置中心

Nacos除了可以做注册中心,同样可以做配置管理来使用。

2.1 统一配置管理

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就显得十分
的不方便,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实
例的配置。
nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实
现配置的热更新。

2.2 Nacos入门


2.2.1 在nacos中添加配置文件

pattern:
        dateformat: yyyy-MM-dd HH:mm:ss

注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变
更的一些配置还是保存在微服务本地比较好。

2.2.2 微服务拉取配置

在dept-service服务中,引入nacos-config的客户端依赖:

<!--nacos配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>

在dept-service的application.yml中添加内容如下:

server:
        port: 8081
spring:
        datasource:
                url: jdbc:mysql://localhost:3306/dept-service?
                allowPublicKeyRetrieval=true&useSSL=false
                username: root
                password: 123456
                driver-class-name: com.mysql.cj.jdbc.Driver
        application:
                name: deptserver
        cloud:
                nacos:
                        server-addr: localhost:8848
        config:
                import:
                        - nacos:deptserver-dev.yaml
# discovery:
# cluster-name: SH
# ephemeral: false
#eureka:
# client:
# service-url:
# defaultZone: http://127.0.0.1:10086/eureka
mybatis:
        type-aliases-package: com.lzw.pojo
        configuration:
                map-underscore-to-camel-case: true
logging:
        level:
                cn.lzw: debug
        pattern:
                dateformat: MM-dd HH:mm:ss:SSS

根据spring.cloud.nacos.server-addr获取nacos地址,再根据
${spring.application.name}-${spring.profiles.active}.${spring.clou
d.nacos.config.file-extension}
作为文件id,来读取配置。

注意:报错之服务实例类型不允许改变

【Nacos】报错之服务实例类型不允许改变_nacos serialize for class-CSDN博客

2.2.3 读取nacos配置

在dept-service中的DeptController中中读取pattern.dateformat配置:

@RestController
@RequestMapping("/dept")
public class DeptController {@Autowiredprivate DeptService deptService;@GetMapping("/{id}")public Dept findById(@PathVariable("id") Integer id){Dept dept = deptService.findById(id);return dept;}@Value("${pattern.dateformat}")private String pattern;@GetMapping("/getDateNow")public String getDateNow(){return LocalDateTime.now().format(DateTimeFormatter.ofPattern(pattern));}
}
2.3 配置热更新


我们最终的目的,是修改nacos中的配置后,微服务中无需重启即可让配置生效,也
就是配置热更新。
要实现配置热更新,可以使用两种方式:

2.3.1 方式一

在@Value注入的变量所在类上添加注解@RefreshScope:

@RestController
@RequestMapping("/dept")
@RefreshScope
public class DeptController {@Autowiredprivate DeptService deptService;@GetMapping("/{id}")public Dept findById(@PathVariable("id") Integer id){Dept dept = deptService.findById(id);return dept;}@Value("${pattern.dateformat}")private String pattern;@GetMapping("/getDateNow")public String getDateNow(){return LocalDateTime.now().format(DateTimeFormatter.ofPattern(pattern));
}
}

2.3.2 方式二

使用@ConfigurationProperties注解代替@Value注解。
在dept-service服务中,添加一个类,读取patterrn.dateformat属性:

@Data
@Component
@ConfigurationProperties(prefix = "pattern")public class PatternProperties {private String dateformat;
}

在DeptController中使用这个类代替@Value:

@RestController
@RequestMapping("/dept")
//@RefreshScope
public class DeptController {@Autowiredprivate DeptService deptService;@GetMapping("/{id}")public Dept findById(@PathVariable("id") Integer id){Dept dept = deptService.findById(id);return dept;}
// @Value("${pattern.dateformat}")
// private String pattern;@Autowiredprivate PatternProperties patternProperties;@GetMapping("/getDateNow")public String getDateNow(){return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));}
}
2.4 配置优先级

思考问题:如果在application.yml文件中和Nacos配置中心中都定义了相同的配置内
容,那么哪一个配置的优先级较高呢?


优先级顺序:Nacos配置中心的配置(后导入的配置 > 先导入的配置) >
application.yml

二.Feign远程调用

先来看我们以前利用RestTemplate发起远程调用的代码:

存在下面的问题:
        代码可读性差,编程体验不统一
        参数复杂URL难以维护
Feign是一个声明式的http客户端 官方地址:https://github.com/OpenFeign/feign

其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。

2.1 Feign替代RestTemplate

引入依赖:在emp-service服务的pom文件中引入feign的依赖:

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

添加注解:在emp-service的启动类添加注解开启Feign的功能:

@MapperScan("com.lzw.mapper")
@SpringBootApplication
@EnableFeignClients
public class EmpApplication {
public static void main(String[] args) {SpringApplication.run(EmpApplication.class, args);}@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}
// @Bean
// public IRule randomRule(){
// return new RandomRule();
// }
}

编写Feign的客户端

/**
* @author lzw
* @create 2024-12-23 12:56
* Feign底层通过jdk动态代理为指定接口生成代理对象,并维护到IOC容器中
*/
@FeignClient("deptserver")public interface DeptClient {@GetMapping("/dept/{id}")public Dept findById(@PathVariable("id") Integer id);
}

这个客户端主要是基于SpringMVC的注解来声明远程调用的信息,比如:
        服务名称:empserver
        请求方式:GET
        请求路径:/dept/{id}
        请求参数:Long id
        返回值类型:Dept

这样,Feign就可以帮助我们发送http请求,无需自己使用RestTemplate来发送了。

测试
修改EmpService中的远程调用代码,使用Feign客户端代替RestTemplate:

 

@Service
public class EmpServiceImpl implements EmpService {@Autowiredprivate EmpMapper empMapper;// @Autowired// private RestTemplate restTemplate;@Autowiredprivate DeptClient deptClient;@Overridepublic Emp findById(Integer id) {Emp emp = empMapper.findById(id);Integer deptId = emp.getDeptId();//部门编号Dept dept = deptClient.findById(deptId);//把Dept封装到emp对象中emp.setDept(dept);return emp;
}
}

2.2 自定义配置

Feign可以支持很多的自定义配置,如下表所示:

一般情况下,默认值就能满足我们使用,如果要自定义时,只需要创建自定义的
@Bean覆盖默认Bean即可。
配置Feign日志有两种方式:

2.2.1 配置文件方式


全局生效

feign:
    client:
        config:
            default: # 这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置
                loggerLevel: FULL # 日志级别

局部生效

feign:
        client:
                config:
                        deptserver: # 针对某个微服务的配置
                                loggerLevel: FULL # 日志级别

 

而日志的级别分为四种:
        NONE:不记录任何日志信息,这是默认值。
        BASIC:仅记录请求的方法,URL以及响应状态码和执行时间
        HEADERS:在BASIC的基础上,额外记录了请求和响应的头信息
        FULL:记录所有请求和响应的明细,包括头信息、请求体、元数据。

2.2.2 Java代码方式

        先声明一个类,然后声明一个Logger.Level的对象:

public class DefaultFeignConfiguration {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.BASIC; // 日志级别为BASIC}
}

如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中

@EnableFeignClients(defaultConfiguration =
DefaultFeignConfiguration .class)

如果是局部生效,则把它放到对应的@FeignClient这个注解中:

@FeignClient(value = "deptserver",configuration =
DefaultFeignConfiguration.class)

2.3 Feign基于抽取的最佳实践

将FeignClient抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这
个模块中,提供给所有消费者使用。

首先创建一个module,命名为feign-api:

在feign-api中然后引入feign的starter依赖

    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

emp-service中编写的DeptClient、Dept、DefaultFeignConfiguration都复制到
feign-api项目中

        在emp-service中使用feign-api
首先,删除order-service中的DeptClient、Dept、DefaultFeignConfiguration等类
或接口。
在emp-service的pom文件中中引入feign-api的依赖
修改emp-service中的所有与上述三个组件有关的导包部分,改成导入feign-api中的

<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-openfeign</artifactId>-->
<!-- </dependency>--><dependency><groupId>com.lzw</groupId><artifactId>Feign-api</artifactId><version>1.0-SNAPSHOT</version></dependency>

        解决扫描包问题
当定义的FeignClient不在SpringBootApplication的扫描包范围时,这些FeignClient
无法使用。有两种方式解决:

方式一:指定Feign应该扫描的包

@EnableFeignClients(basePackages = "com.lzw.clients")

方式二:指定需要加载的Client接口

@EnableFeignClients(clients = {DeptClient.class})

三.Gateway组件

3.1 Gateway概述

        Gateway是在spring生态系统之上构建的API网关服务,基于Spring5,
        SpringBoot2和Project Reactor等技术。Gateway旨在提供一种简单而有效的方
        式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重
        试等
        SpringCloud Gateway是SpringCloud的一个全新项目,基于
        Spring5.X+SpringBoot2.X和Project Reactor等技术开发的网关,它旨在为微服
        务架构提供一种简单有效的统一的API路由管理方式。
        为了提升网关的性能,SpringCloud Gatway是基于WebFlux框架实现的,而
        WebFlux框架底层则使用了高性能的Reactor模式通讯框架Netty。
        SpringCloud Gateway的目标提供统一的路由方式且基于Filter链的方式提供了网
        关基本的功能,例如:安全、监控/指标、和限流。

权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行
拦截。

路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某
种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个
时,还需要做负载均衡。

限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,
避免服务压力过大。
在SpringCloud中网关的实现包括两种:
        gateway
        zuul
Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于
Spring5中提供的WebFlux,属于响应式编程的实现,具备更好的性能。

3.2 Gateway快速入门

        创建新的module,引入SpringCloudGateway的依赖和nacos的服务发现依赖

    <dependencies><!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!--nacos服务发现依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 负载均衡组件 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency></dependencies>

编写路由配置及nacos地址

server:
    port: 10010 # 网关端口
spring:
    application:
        name: gatewayserver # 服务名称
cloud:
    nacos:
        server-addr: localhost:8848 # nacos地址
    gateway:
        routes: # 网关路由配置
            - id: dept-service # 路由id,自定义,只要唯一即可
                # uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
                uri: lb://deptserver # 路由的目标地址 lb就是负载均衡,后面跟服务名称
                predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
                    - Path=/dept/** # 这个是按照路径匹配,只要以/dept/开头就符合要求

我们将符合Path规则的一切请求,都代理到uri参数指定的地址。

本例中,我们将/dept/**开头的请求,代理到 lb://deptserver,lb是负载均衡,根据
服务名拉取服务列表,实现负载均衡。
        编写启动类

@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);
}

重启测试

重启网关,访问http://localhost:10010/dept/1时,符合/dept/**规则,请求转发到
uri:http://userservice/user/1得到了结果:

3.3.断言工厂

我们在配置文件中写的断言规则只是字符串,这些字符串会被Predicate Factory读取
并处理,转变为路由判断的条件。


例如Path=/dept/**是按照路径匹配,这个规则是由

org.springframework.cloud.gateway.handler.predicate.PathRoutePredica
teFactory 类来处理的,像这样的断言工厂在SpringCloudGateway还有十几个:

我们只需要掌握Path这种路由工厂就可以了。

3.4 过滤器工厂


GatewayFilter是网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的
响应做处理:

3.4.1 路由过滤器的种类


Spring提供了31种不同的路由过滤器工厂。例如:

3.4.2 请求头过滤器

下面我们以AddRequestHeader 为例来讲解。
需求:给所有进入deptservice的请求添加一个请求头:message=helloworld
只需要修改gateway服务的application.yml文件,添加路由过滤即可:
 

spring:
        cloud:
                gateway:
                        routes:
                        - id: dept-service
                                uri: lb://deptserver
                                predicates:
                                - Path=/dept/**
                                filters: # 过滤器
                                - AddRequestHeader=message,helloworld # 添加请求头

当前过滤器写在deptserver路由下,因此仅仅对访问deptserver的请求有效。
可以在DeptController方法中 注入请求头信息,进行测试

@GetMapping("/getNowDate")public String getNowDate(@RequestHeader(value = "message",required = false)String message){System.out.println(message);return LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
}

3.4.3 默认过滤器

如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:

spring:
        cloud:
                gateway:
                        routes:
                        - id: dept-service
                        uri: lb://deptserver
                        predicates:
                        - Path=/dept/**
                default-filters: # 默认过滤项
                - AddRequestHeader=message,helloworld # 添加请求头
 

3.5 全局过滤器

网关提供了31种,但每一种过滤器的作用都是固定的。如果我们希望拦截请求,做自
己的业务逻辑则没办法实现。

3.5.1 全局过滤器作用

全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的
作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而
GlobalFilter的逻辑需要自己写代码实现。
定义方式是实现GlobalFilter接口。

public interface GlobalFilter {
/**
* 处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给
下一个过滤器处理
*
* @param exchange 请求上下文,里面可以获取Request、Response等信息
* @param chain 用来把请求委托给下一个过滤器
* @return {@code Mono<Void>} 返回标示当前过滤器业务结束
*/Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain);
}

3.5.2 自定义全局过滤器

需求:定义全局过滤器,拦截请求,判断请求的参数是否满足下面条件:
        参数中是否有authorization,
        authorization参数值是否为admin
如果同时满足则放行,否则拦截

package com.lzw.filter;
import
org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* @author lzw
* @create 2024-12-24 21:02
*/
@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {//获取url地址参数MultiValueMap<String, String> queryParams =exchange.getRequest().getQueryParams();//获取authorization参数String auth = queryParams.getFirst("authorization");//校验if("admin".equals(auth)){//放行return chain.filter(exchange);}//拦截//禁止访问,设置状态码exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);//结束处理return exchange.getResponse().setComplete();
}
}

3.5.3 过滤器执行顺序
请求进入网关会碰到三类过滤器:当前路由的过滤器、DefaultFilter、GlobalFilter
请求路由后,会将当前路由过滤器和DefaultFilter、GlobalFilter,合并到一个过滤器
链(集合)中,排序后依次执行每个过滤器

排序的规则是什么呢?
        每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,
        执行顺序越靠前

        GlobalFilter通过实现Ordered接口,或者添加@Order注解来指定order值,由
        我们自己指定
        路由过滤器和defaultFilter的order由Spring指定,默认是按照声明顺序从1递
        增。
        当过滤器的order值一样时,会按照 defaultFilter > 路由过滤器 > GlobalFilter的
        顺序执行。

3.6 跨域问题


3.6.1 什么是跨域问题

跨域:域名不一致就是跨域,主要包括:
        域名不同: 淘宝 和 淘宝和 京东(JD.COM)-正品低价、品质保障、配送及时、轻松购物!和
        miaosha.jd.com
        域名相同,端口不同:localhost:8080和localhost8081
跨域问题:浏览器禁止请求的发起者与服务端发生跨域ajax请求,请求被浏览器拦截
的问题

2.6.2 解决跨域问题

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script>axios.get("http://localhost:10010/dept/1?authorization=admin").then(resp => console.log(resp.data)).catch(err => console.log(err))
</script>
</html>

在gateway服务的application.yml文件中,添加下面的配置:

spring:
        cloud:
                gateway:
                # 。。。
                        globalcors: # 全局的跨域处理
                                add-to-simple-url-handler-mapping: true # 解决options请求被
拦截问题
                                corsConfigurations:
                                        '[/**]':
                                                allowedOrigins: # 允许哪些网站的跨域请求
                                                        - "http://localhost:8090"
                                                        - "http://localhost" //80端口要省略不写
                                                        - "http://127.0.0.1"
                                                        - "http://www.baidu.com"
                                                allowedMethods: # 允许的跨域ajax的请求方式
                                                        - "GET"
                                                        - "POST"
                                                        - "DELETE"
                                                        - "PUT"
                                                        - "OPTIONS"
                                                allowedHeaders: "*" # 允许在请求中携带的头信息
                                                allowCredentials: true # 是否允许携带cookie
                                                maxAge: 360000 # 这次跨域检测的有效期-避免频繁发起跨域检测,服务端返回Access-Control-Max-Age来声明的有效期

关键字:淘客推广代理_沃尔玛跨境电商平台_爱站seo工具包官网_网站 推广

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: