SpringCloudAlibaba技术栈-Higress

news2025/1/2 16:44:35

1、什么是Higress?

云原生网关,干啥的?用通俗易懂的话来说,微服务架构下Higress 就像是一个智能的“交通警察”,它站在你的网络世界里,负责指挥和调度所有进出的“车辆”(也就是数据流量)。它的主要工作包括:
        指挥交通:它告诉数据应该走哪条路,去哪个服务(就像告诉你去某个地方应该走哪条路)。
        保障安全:它检查进出的数据,防止坏人(比如黑客)进来搞破坏,保护你的网络世界安全。
        维护秩序:如果有太多数据同时涌进来(比如网站访问量突然暴增),它会采取措施,比如限制流量,确保系统不会因为太忙而崩溃。
        记录情况:它会记录所有车辆的行驶情况,如果出了问题,可以帮忙查找原因。
        适应各种路况:无论是云上的道路,还是自己家修的路(混合云环境),它都能管理得井井有条。
简而言之,Higress 就是帮助你的网络世界更加顺畅、安全、有序的一个工具。

2、Higress的安装

1、安装DockerCompose

序号软件版本
1Centos7.5
2Linux内核3.8之上

 卸载之前的docker

yum remove docker \
          docker-client \
          docker-client-latest \
          docker-common \
          docker-latest \
          docker-latest-logrotate \
          docker-logrotate \
          docker-selinux \
          docker-engine-selinux \
          docker-engine \
          docker-ce

防火墙关掉

systemctl stop firewalld

设置安装仓库

#安装yum的工具包
yum install -y yum-utils \
      device-mapper-persistent-data \
      lvm2 --skip-broken
# 设置docker镜像源
yum-config-manager \
  --add-repo \
   https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo
#将软件包信息提前在本地索引缓存,用来提高搜索安装软件的速度,建议执行这个命令可以提升yum安装的速度。
yum makecache fast

 安装docker引擎

sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

启动docker

systemctl start docker

设置docker自启动(我不喜欢)

systemctl enable docker

检查是不是启动成功

docker version

2、搭建Higress

#创建Higress工作目录
mkdir higress;  

#进入Hogress文件夹
cd higress

#创建higress-ai容器
docker run -d --name higress-ai -v ${PWD}:/data \
     -p 8001:8001 -p 80:8080 -p 8443:8443  \
     higress-registry.cn-hangzhou.cr.aliyuncs.com/higress/all-in-one:latest

监听端口说明如下:

  • 80 端口:Higress UI 控制台入口
  • 8080 端口:网关 HTTP 协议入口
  • 8443 端口:网关 HTTPS 协议入口

访问Higress控制台

http://192.168.66.100:8001/

自己设置密码即可,进去后创建服务来源为nacos

之后项目启动的时候需要先打开docker服务,然后再开启Higress的容器。 

 3、Higress配置Nacos注册中心

为啥要配置Nacos呢?因为微服务都在nacos上注册着。

nacos的下载安装见博客:

SpringCloudAlibaba技术栈-Nacos-CSDN博客

安装完成之后访问浏览器输入网址192.168.66.100:8848/nacos即可。

3、项目案例

1、创建网关微服务模块

创建完父项目添加依赖

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.zj</groupId>
  <artifactId>testHigress</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>testHigress</name>
  <url>http://maven.apache.org</url>

  <modules>
    <module>order-service</module>
    <module>auth</module>
  </modules>

  <properties>
    <dubbo.version>3.2.4</dubbo.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>17</java.version>
    <spring-boot.version>3.0.2</spring-boot.version>
    <spring-cloud.version>2022.0.0</spring-cloud.version>
    <spring-cloud-alibaba.version>2022.0.0.0</spring-cloud-alibaba.version>
    <lombok.version>1.8.28</lombok.version>
  </properties>


  <dependencyManagement>

  <dependencies>


    <!-- SpringCloud 微服务 -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring-cloud.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>


    <!-- SpringCloud Alibaba 微服务 -->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>${spring-cloud-alibaba.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>


    <!-- SpringBoot 依赖配置 -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>${spring-boot.version}</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>


  </dependencies>

  </dependencyManagement>
</project>

创建子项目order-service并添加依赖。

        <!--   springboot依赖包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--   nacos依赖包  -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

在resources文件夹下面创建application.yml文件。

spring:
  application:
  # 应用名字
   name: order-service
  cloud:
   nacos:
    discovery:
    # Nacos注册中心的地址
     server-addr:  192.168.66.100:8848

server:
  port: 8889

主要是为了将order-service服务注册到Nacos上。

 编写主启动类。

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

编写测试控制器。

package com.zj.controller;

/*控制器*/
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/order")
public class indexController {

    @GetMapping("/index")
    public String index(){
        return "hello higress";
    }
}

启动项目,检查nacos客户端是不是存在该服务。

浏览器访问控制器,检查是不是创建成功。localhost:8888/order/index  出现hi gress表示成功。

2、Higress路由配置

它的作用是根据一定的规则,将访问者的请求正确地发送到对应的服务或者后端服务器上。

安装Switchhosts

Switchhosts:切换hosts与编辑hosts,实现域名和地址的映射。

会出现写数据没权限的情况看这篇文章:

switchHosts应用时,没有写入 Hosts 文件的权限_没有写入 hosts 文件的权限。-CSDN博客

在Higress中创建数据来源:

 在域名管理中创建域名:

配置访问order-service服务的路由:

 如果不存在一级路由的话还需要重写路由(这里存在一级路由):

 这样访问的时候由原来的localhost:8888/order/index  变为  www.zj.com/order/index  为啥呢?因为微服务在nacos上,higress会根据/order/index找到匹配的服务。 

浏览器访问地址:

 3、Higress策略配置-跨域配置

什么是跨域

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域

当前页面url被请求页面url是否跨域原因
http://www.test.com/http://www.test.com/index.html同源(协议、域名、端口号相同)
http://www.test.com/https://www.test.com/index.html跨域协议不同(http/https)
http://www.test.com/百度一下,你就知道跨域主域名不同(test/baidu)
http://www.test.com/http://blog.test.com/跨域子域名不同(www/blog)
http://www.test.com:8080/http://www.test.com:7001/跨域端口号不同(8080/7001)

 常见的报错就是:Access-Control-Allow-Origin。 

Higress配置跨域访问order-service服务:

 4、HTTP认证

Higress HTTP认证是一种保护网页或服务的机制,需要用户输入用户名和密码才能访问。这就像给你的网站或服务加了一把锁,只有知道密码的人才能进入。

常见的验证方案包括

1、Basic Authentication(基本认证)

Basic认证是最常见的HTTP认证方式之一。在Basic认证中,客户端发送请求时,会在请求头中包含一个"Authorization"字段,该字段包含了经过Base64编码的用户名和密码。

2、Digest Authentication(摘要认证)

Digest认证是一种更安全的认证方式。在Digest认证中,服务器会向客户端发送一个随机数(称为"nonce"),客户端根据该随机数和用户密码计算一个摘要,并将其发送给服务器。服务器收到摘要后,会验证其有效性。Digest认证相对于Basic认证而言,更难以被中间人攻击截获密码。

3、Bearer Token Authentication(令牌认证)

Bearer认证是一种使用令牌(Token)进行身份验证的方式。在Bearer认证中,客户端在请求头中添加一个"Authorization"字段,该字段包含了一个令牌信息。服务器在接收到请求后,会验证令牌的有效性,并根据令牌来识别用户身份。

4、OAuth(开放授权)

OAuth认证是一种开放标准的身份验证协议,用于授权第三方应用程序访问用户资源。在OAuth认证中,用户可以通过授权服务器授权第三方应用程序访问自己的资源。这种方式可以避免用户将密码直接提供给第三方应用程序。

(1)Basic 认证

暂略。

(2)JWT认证

啥叫JWT认证?JWT认证是一种通过令牌(token)来验证用户身份的方法。用户登录后,服务器会发一个像密码一样的令牌给用户,用户每次访问网站时都带上这个令牌,服务器检查令牌来确定用户是谁。这种方法不需要服务器记住用户的登录状态,令牌里有用户信息,还能保证安全。

传统的session认证的缺点:

  • 安全性:CSRF攻击因为基于cookie来进行用户识别, cookie如果被截获,用户就会很容易受到跨站请求伪造的攻击。
  • 扩展性:对于分布式应用,需要实现 session 数据共享
  • 性能:每一个用户经过后端应用认证之后,后端应用都要在服务端做一次记录,以方便用户下次请求的鉴别,通常而言session都是保存在内存中,而随着认证用户的增多,服务端的开销会明显增大,与REST风格不匹配。因为它在一个无状态协议里注入了状态。

JWT的认证方式:

业务流程:

  1. 客户端向API网关发起认证请求,请求中一般会携带终端用户的用户名和密码;
  2. 网关将请求直接转发给后端服务也就是auth服务模块;
  3. 后端服务读取请求中的验证信息(比如用户名、密码)进行验证,验证通过后使用私钥生成标准的token,返回给网关;
  4. 网关将携带token的应答返回给客户端,客户端需要将这个token缓存到本地;
  5. 客户端向API网关发送业务请求,请求中携带token;
  6. 网关使用用户设定的公钥对请求中的token进行验证,验证通过后,将请求透传给后端服务;
  7. 后端服务进行业务处理后应答;
  8. 网关将业务应答返回给客户端

JWT 结构

头部 / header

JSON对象,描述 JWT 的元数据。其中 alg 属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ 属性表示这个令牌(token)的类型(type),统一写为 JWT。

    {
       "alg": "HS256",
       "typ": "JWT"
    }
alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT然后将头部进行Base64编码构成了第一部分,Base64是一种用64个字符来表示任意二进制数据的方法,Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。

载荷 / Payload

Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据。JWT 指定七个默认字段供选择。除了默认字段之外,你完全可以添加自己想要的任何字段,一般用户登录成功后,就将用户信息存放在这里

iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID用于标识该JWT

{
 "iss": "xxxxxxx",
 "sub": "xxxxxxx",
 "aud": "xxxxxxx",
 "user": {
     'username': 'itbaizhan',
     'userId': 1
  } 
}

签名 / Signature

  • 签名部分是对上面的 头部、载荷 两部分数据进行的数据签名
  • 为了保证数据不被篡改,则需要指定一个密钥,而这个密钥一般只有你知道,并且存放在服务端

(3)Higress策略配置-创建认证中心微服务

添加依赖

    <dependencies>
        <!--springboot-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--注册中心,当前的认证服务也需要将自己注册到注册中心才能被其他服务调用-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--JWT认证包-->
        <dependency>
            <groupId>org.bitbucket.b_c</groupId>
            <artifactId>jose4j</artifactId>
            <version>0.7.0</version>
        </dependency>
        <!--工具包-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.18</version>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

在resources文件夹下面创建application.yml文件。

#微服务名称
spring:
  application:
    name: auth-service
#    注册中心地址
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.66.100:8848
#端口
server:
  port: 8889


#还能添加数据库的配置信息,从数据库获取用户的信息认证用户的身份

 创建主启动类

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

(4)编写JWT工具类生成JWT

在此之前一定要把Linux的时间设置成北京时间。

生成公钥和私钥,用户也可以在这个站点https://mkjwk.org 生成用于token生成与验证的私钥与公钥。

public static void main(String[] args) {
    RsaJsonWebKey rsaJsonWebKey = RsaJwkGenerator.generateJwk(2048);
    final String publicKeyString = rsaJsonWebKey.toJson(JsonWebKey.OutputControlLevel.PUBLIC_ONLY);
    final String privateKeyString = rsaJsonWebKey.toJson(JsonWebKey.OutputControlLevel.INCLUDE_PRIVATE);
    System.out.println(publicKeyString);
    System.out.println(privateKeyString);
}

 JWT工具类

package com.zj.utils;

import org.jose4j.json.JsonUtil;
import org.jose4j.jwa.AlgorithmConstraints;
import org.jose4j.jwk.JsonWebKey;
import org.jose4j.jwk.RsaJsonWebKey;
import org.jose4j.jws.AlgorithmIdentifiers;
import org.jose4j.jws.JsonWebSignature;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.consumer.InvalidJwtException;
import org.jose4j.jwt.consumer.JwtConsumer;
import org.jose4j.jwt.consumer.JwtConsumerBuilder;
import org.jose4j.lang.JoseException;

import java.security.PrivateKey;
import java.security.PublicKey;

// Jwt工具类,包含生成和验证JWT令牌的方法
public class JwtUtils {

    // 私钥字符串,用于签名JWT令牌,这里存储的是RSA私钥的JSON表示
    public final static String privatejson = "{\"kty\":\"RSA\",\"n\":\"...\",\"e\":\"...\",\"d\":\"...\",\"p\":\"...\",\"q\":\"...\",\"dp\":\"...\",\"dq\":\"...\",\"qi\":\"...\"}";
    // 公钥字符串,用于验证JWT令牌,这里存储的是RSA公钥的JSON表示
    public final static String publicjson = "{\"kty\":\"RSA\",\"n\":\"...\",\"e\":\"...\"}";

    /**
     * 生成JWT令牌
     * @param userId 用户ID,将作为JWT负载的一部分
     * @param username 用户名,将作为JWT负载的一部分
     * @return 返回生成的JWT令牌字符串
     */
    public static String sign(Long userId, String username) throws JoseException {
        // 创建JWT的声明部分,JwtClaims对象包含JWT的有效负载
        JwtClaims claims = new JwtClaims();
        claims.setIssuer("abcd"); // 设置JWT的发行者,通常是创建JWT的应用的名称
        claims.setAudience("audience"); // 设置JWT的接收者,通常是接收JWT的应用的名称
        claims.setExpirationTimeMinutesInTheFuture(10000); // 设置JWT的过期时间,这里设置为10000分钟后过期
        claims.setGeneratedJwtId(); // 自动生成JWT的唯一标识符
        claims.setIssuedAtToNow(); // 设置JWT的发行时间,即当前时间
        claims.setNotBeforeMinutesInThePast(2); // 设置JWT生效时间,即2分钟前
        claims.setSubject("subject"); // 设置JWT的主题,通常是关于JWT的描述信息
        claims.setClaim("userId", userId); // 添加自定义声明,这里是用户ID
        claims.setClaim("username", username); // 添加自定义声明,这里是用户名

        // 创建JWT签名对象,用于生成签名后的JWT令牌
        JsonWebSignature jws = new JsonWebSignature();
        jws.setPayload(claims.toJson()); // 设置JWT的有效负载,即上面的claims对象转换成JSON字符串

        // 使用私钥签名JWT,私钥用于加密签名,确保JWT的完整性和真实性
        PrivateKey privateKey = new RsaJsonWebKey(JsonUtil.parseJson(privatejson)).getPrivateKey();
        jws.setKey(privateKey);

        // 设置密钥ID,可以用于区分不同的密钥对
        jws.setKeyIdHeaderValue("keyId");

        // 设置签名算法,这里使用RSA SHA-256算法
        jws.setAlgorithmHeaderValue(AlgorithmIdentifiers.RSA_USING_SHA256);

        // 生成JWT令牌,即对有效负载进行签名并返回签名后的字符串
        String jwt = jws.getCompactSerialization();

        return jwt;
    }

    /**
     * 验证JWT令牌
     * @param token 要验证的JWT令牌字符串
     */
    public static void checkJwt(String token) throws JoseException {
        // 使用公钥验证JWT,公钥用于解密签名,验证JWT的完整性和真实性
        PublicKey publicKey = new RsaJsonWebKey(JsonUtil.parseJson(publicjson)).getPublicKey();

        // 创建JWT消费者,用于验证和解码JWT令牌
        JwtConsumer jwtConsumer = new JwtConsumerBuilder()
                .setRequireExpirationTime() // 要求JWT包含过期时间字段
                .setAllowedClockSkewInSeconds(30) // 允许时间偏移量,即服务器时间与JWT生成时间之间的差异
                .setRequireSubject() // 要求JWT包含主题字段
                .setExpectedIssuer("abcd") // 预期的发行者,必须与JWT中的发行者匹配
                .setExpectedAudience("audience") // 预期的接收者,必须与JWT中的接收者匹配
                .setVerificationKey(publicKey) // 设置用于验证签名的公钥
                .setJwsAlgorithmConstraints(new AlgorithmConstraints(AlgorithmConstraints.ConstraintType.WHITELIST, AlgorithmIdentifiers.RSA_USING_SHA256))// 设置只允许使用RSA SHA-256算法的JWT
                .build();


                try {
                    // 解析和验证JWT令牌
                    JwtClaims jwtClaims = jwtConsumer.processToClaims(token);
                    System.out.println("JWT验证成功!");
                    // 输出JWT中的声明信息
                    System.out.println("JWT内容: " + jwtClaims);
                } catch (InvalidJwtException e) {
                    // 如果JWT验证失败,打印错误信息
                    System.out.println("JWT验证失败: " + e);
                }
            }

            // 主函数,用于测试JWT的生成和验证
            public static void main(String[] args) throws JoseException {
                // 生成JWT令牌
                String token = sign(123L, "testUser");
                System.out.println("生成的JWT令牌: " + token);

                // 验证JWT令牌
                checkJwt(token);
            }
        }

(5)编写认证中心控制器和服务层

package com.zj.controller;

import com.zj.domain.LoginBodyDTO;
import com.zj.domain.R;
import com.zj.service.LoginService;
import org.jose4j.lang.JoseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * 用户层
 */
@RestController
@RequestMapping("/auth")
public class LoginController {

    @Autowired
    private LoginService loginService;

    /**
     * @RequestBody:将数据转换为java对象
     * @param loginBodyDTO
     * @return
     */
    @PostMapping("/login")
    public R login(@RequestBody LoginBodyDTO loginBodyDTO) throws JoseException {
        System.out.println("啊哈哈哈哈");
        R login = loginService.login(loginBodyDTO);
        return login;
    }
}

编写统一结果返回集

package com.zj.domain;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

/**
 * 统一结果返回集
 */
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class R {
    private Integer code;
    private String msg;
    public Object data;

    public static R fail( String msg) {
        R r = new R();
        r.setCode(500);
        r.setMsg(msg);
        return r;
    }

    public static R success( Object data) {
        R r = new R();
        r.setCode(200);
        r.setMsg("success");
        r.setData(data);
        return r;
    }
}

登录业务层

package com.zj.service;

import com.zj.domain.LoginBodyDTO;
import com.zj.domain.R;
import com.zj.utils.JwtUtils;
import org.jose4j.lang.JoseException;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

@Service
public class LoginService {

    //登录
    public R login(LoginBodyDTO loginBodyDTO) throws JoseException {
        //1.用户名密码数据库校验
        if(StringUtils.isEmpty(loginBodyDTO.getUsername()) || StringUtils.isEmpty(loginBodyDTO.getPassword())){
            return R.fail("用户名或者密码为空");

        }
        //TODO 数据操作验证用户信息
        if(loginBodyDTO.getUsername().equals("admin") && loginBodyDTO.getPassword().equals("123456")){
            //颁发登录token
            String token = JwtUtils.sign(1001L,"admin");
            return R.success(token);

        }else{
            return R.fail("登录信息错误");
        }
    }

}

创建Higess路由

 

启动项目验证授权服务是不是成功了

这就成功了。

(6)Higress策略配置-JWT配置

这个配置主要是针对微服务的这里主要是order-service,不是针对验证模块的,验证模块不需要添加,总不能让用户第一次登录就带着token吧。

因为在JWT认证流程中需要网关对用户的请求进行验证,也就是需要对用户的请求进行解密,解密成功才能访问微服务,否则直接不让访问。

因为访问每个微服务都需要进行身份的验证,因此需要全局配置JWT,在插件市场配置就是全局配置。

参数配置见文档:https://higress.cn/docs/latest/plugins/authentication/jwt-auth/?spm=36971b57.2ef5001f.0.0.2a932c1fXPZUk1

namestring必填-配置该consumer的名称,每个consumer相当于是一个策略。
jwksstring必填-https://www.rfc-editor.org/rfc/rfc7517 指定的json格式字符串,是由验证JWT中签名的公钥(或对称密钥)组成的Json Web Key Set,其实就是公钥。
issuerstring必填-JWT的签发者,需要和payload中的iss字段保持一致

 开启order-service微服务权限认证。

idea上开启auth服务和order-serice服务测试:

先直接访问order-service模块显然没验证成功:

 再登录一下获取token

再次请求order-service这次带上token

 要注意Authorization的参数: Bearer+token

这样最基础的认证就OK 啦!

(7) Higress策略配置-Key 认证

global_authbool选填(仅实例级别配置-只能在实例级别配置,若配置为true,则全局生效认证机制; 若配置为false,则只对做了配置的域名和路由生效认证机制,若不配置则仅当没有域名和路由配置时全局生效(兼容老用户使用习惯)。
consumersarray of object必填-配置服务的调用者,用于对请求进行认证
keysarray of string必填-API Key 的来源字段名称,可以是 URL 参数或者 HTTP 请求头名称
in_queryboolin_query 和 in_header 至少有一个为 truetrue配置 true 时,网关会尝试从 URL 参数中解析 API Key
in_headerboolin_query 和 in_header 至少有一个为 truetrue配置 true 时,网关会尝试从 HTTP 请求头中解析 API Key

在key认证的全局配置添加下面的配置:

credential: 2bda943c-ba2b-11ec-ba07-00163e1250b5  通过UUID生成的。keys就是在请求的时候要携带的参数,in_header就是放在请求的header中,in_query就是携带到请求的参数上。

在order-sevice服务上使用配置的key认证:

 在不携带apikey参数的时候请求登录是不行的。

带上参数就能访问了。

带上参数访问order-service。

 对于in_header式key认证是一样的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

# 光速上手 - JPA 原生 sql DTO 投影

前言 使用 JPA 时&#xff0c;我们一般通过 Entity 进行实体类映射&#xff0c;从数据库中查询出对象。然而&#xff0c;在实际开发中&#xff0c;有时需要自定义查询结果并将其直接映射到 DTO&#xff0c;而不是实体类。这种需求可以通过 JPA 原生 SQL 查询和 DTO 投影 来实现…

智能故障诊断和寿命预测期刊推荐

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 基于FFT CNN - BiGRU-Attention 时域、频域特征注意力融合的轴承故障识别模型-CSDN博客 基于FFT CNN - Transformer 时域、频域特征融合的轴承故障识别模型-CSDN博客 P…

MTK抓log方法log机制以及如何抓取log

目录 离线log抓取&#xff1a; adb命令打开mtklog的方法 &#xff1a; 实时log抓取&#xff1a; 设置log等级和打开平台log: 实时抓取&#xff0c;两种方式&#xff1a; Kernel Log: LOG 优先级 logcat 离线log抓取&#xff1a; 1.手机先进入开发者模式 2.进入拨号页面…

人工智能与云计算的结合:如何释放数据的无限潜力?

引言&#xff1a;数据时代的契机 在当今数字化社会&#xff0c;数据已成为推动经济与技术发展的核心资源&#xff0c;被誉为“21世纪的石油”。从个人消费行为到企业运营决策&#xff0c;再到城市管理与国家治理&#xff0c;每个环节都在生成和积累海量数据。然而&#xff0c;数…

如何在 Ubuntu 22.04 上安装 Varnish HTTP 教程

简介 在本教程中&#xff0c;我们将学习如何在 Ubuntu 22.04 服务器上安装和配置 Varnish HTTP。 Varnish 是一款高性能的 HTTP 加速器&#xff0c;旨在提高内容密集型动态网站的速度。它通过将网页缓存在内存中来工作&#xff0c;从而减少 Web 服务器的负载&#xff0c;并显…

AI辅助编码提高病案首页主要诊断编码正确率数据优化方法(2025增量优化版附python源代码)

一、引言 1.1 研究背景与意义 在医疗信息化进程中,病案首页作为病历信息的核心浓缩,承载着疾病分类、医疗统计、医保结算等关键任务,其主要诊断编码的准确性至关重要。准确的编码不仅是医疗质量评估、科研数据分析的基石,更是合理分配医疗资源、保障医保精准支付的关键依…

CSES-1135 Distance Queries

题目传送门https://vjudge.net/problem/CSES-1135#authorGPT_zh 解题思路 题目让我们求树上两个点的距离。 那么就可以转化为两点到其 LCA 的距离之和。 代码 #include<bits/stdc.h> using namespace std;int n,q; vector<int> g[200001]; int dis[200001],dep…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

001__VMware软件和ubuntu系统安装(镜像)

[ 基本难度系数 ]:★☆☆☆☆ 一、Vmware软件和Ubuntu系统说明&#xff1a; a、Vmware软件的说明&#xff1a; 官网&#xff1a; 历史版本&#xff1a; 如何下载&#xff1f; b、Ubuntu系统的说明&#xff1a; 4、linux系统的其他版本&#xff1a;红旗(redhat)、dibian、cent…

【NebulaGraph】变化的多跳查询

【NebulaGraph】变化的多跳查询 1. 需求2. 解决方案2.1 确定查询结构2.2 构建查询语句 3. 追加需求&#xff1a;如果增加每一跳都要指定查询某SPACE下的Tag&#xff0c;或者不查询某个Tag怎么办 1. 需求 存在多跳请求&#xff0c;其中每一跳是从上一跳查询结果为基础的。但是 …

【Compose multiplatform教程06】用IDEA编译Compose Multiplatform常见问题

当我们从Kotlin Multiplatform Wizard | JetBrains 下载ComposeMultiplatform项目时 会遇到无法正常编译/运行的情况&#xff0c;一般网页和桌面是可以正常编译的&#xff0c; 我这里着重解决如下问题 1:Gradle版本不兼容或者Gradle连接超时 2:JDK版本不兼容 3:Gradle依赖库连…

如何利用无线路由器实现水泵房远程监测管理

水泵站广泛部署应用在工农业用水、防洪、排涝和抗旱减灾等方面&#xff0c;如果水泵站发生异常&#xff0c;往往会对生产生活造成诸多损失&#xff0c;甚至引发安全事故。因此&#xff0c;建立一套高效、可靠的泵站远程监测管理系统至关重要。 方案背景 目前&#xff0c;我国大…

vue3学习笔记(9)-pinia、storeToRefs、getters

1.新的集中式状态&#xff08;数据&#xff09;管理库&#xff0c;redux vuex pinia 搭建 2.ref拆包 如果在reactive里面定义ref&#xff0c;则打印c时&#xff0c;无需.value 他自动拆包&#xff0c;如果直接在外面定义的ref则需要.value,他没有拆包 3.pinia存储读取数据 存…

【Qt】容器控件、布局管理控件

目录 容器控件 QGroupBox QTabWidget 布局管理控件 QVBoxLayout 例子&#xff1a; QHBoxLayout 例子&#xff1a; QGridLayout 例子&#xff1a; 例子&#xff1a; QFormLayout 例子&#xff1a; QSpacerItem 例子&#xff1a; 容器控件 QGroupBox 表示一个带有…

计算机的错误计算(一百九十六)

摘要 用两个大模型计算 arccos(0.444). 结果保留 4位有效数字。两个大模型的计算结果相同&#xff0c;并均有误差。 例1. 计算 arccos(0.444). 结果保留 4位有效数字。 下面是与一个大模型的对话。 以上为与一大模型的对话。 下面是与另一大模型的对话。 点评&#xff1a; &…

Unity开发微信小游戏踩坑总结

前言 不记录真记不住&#xff0c;这个帖子以后不定时更新。 问题1&#xff1a;图片模糊 问题描述&#xff1a; 在Unity里什么事没有&#xff0c;进入到微信开发者工具里就已经模糊了&#xff0c;人物动画是一团马赛克&#xff0c;图片看着倒是没事。 问题原因&#xff1a;…

Python爬虫教程——7个爬虫小案例(附源码)_爬虫实例

本文介绍了7个Python爬虫小案例&#xff0c;包括爬取豆瓣电影Top250、猫眼电影Top100、全国高校名单、中国天气网、当当网图书、糗事百科段子和新浪微博信息&#xff0c;帮助读者理解并实践Python爬虫基础知识。 包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【…

kafka小实站

需要先在前面的文章里面照着下载好kafka&#xff0c;并且启动 先启动zookeeper 项目目录 package kafka; import lombok.extern.slf4j.Slf4j; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.kafka.annotation.KafkaListener; import…

【从零开始入门unity游戏开发之——C#篇39】C#反射使用——Type 类、Assembly 类、Activator 类操作程序集

文章目录 前言一、前置知识1、编译器2、程序集&#xff08;Assembly&#xff09;3、元数据&#xff08;Metadata&#xff09; 二、反射1、反射的概念2、反射的作用3、反射的核心Type 类3.1 Type 类介绍3.2 不同方法获取 Type3.3 获取type类型所在的程序集的相关信息 4、反射的常…

(桌面运维学习)通过备份C盘,进行Windows系统的软件初始化

通过PE工具备份C盘&#xff0c;进行Windows系统的软件初始化 需求场景&#xff1a;快速初始化一批型号和主板一样的电脑系统型号也要一致&#xff08;Win10专业版就最好全是WIn10专业版&#xff09;&#xff0c;初始化的内容包括已配置好的环境和已安装的软件。主要用于公司桌面…