【Spring Cloud 五】OpenFeign负载均衡

news2024/9/21 0:31:21

这里写目录标题

  • 系列文章目录
  • 背景
  • 一、OpenFeign是什么
    • Feign是什么
      • Feign的局限性
    • OpenFeign是什么
  • 二、为什么要有OpenFeign
  • 三、如何使用OpenFeign
    • 服务提供者order-service
      • pom文件
      • yml配置文件
      • 启动类
      • 实体
      • ParamController
    • 服务消费者user-service
      • pom文件
      • yml配置文件
      • 启动类
      • 接口类
      • UserController
    • 运行效果
  • 调用超时配置
  • 五、OpenFeign调用参数的处理
  • 六、OpenFeign日志打印功能
  • 总结

系列文章目录

【Spring Cloud一】微服务基本知识
【Spring Cloud 三】Eureka服务注册与服务发现
【Spring Cloud 四】Ribbon负载均衡

背景

目前开发的项目其微服务之间的调用方式使用的就是OpenFeign的方式,为了更加的体会到它代码的便捷和高效,所以博主对OpenFeign进行了再次学习和实践,加强对OpenFeign的整体理解。

一、OpenFeign是什么

在了解OpenFeign之前我们先来了解Feign,因为OpenFeign和Feign之间是一种继承关系。

Feign是什么

Feign是一个声明式的模块化的HTTP客户端工具,他是由Netflix开发。它简化了在Java应用中编写HTTP请求的方式,能够让开发者可以通过简单的注解来定义对其他服务的RESTFul调用,从而避免编写繁琐的HTTP请求。

在传统的HTTP客户端中,我们通常需要手动构建HTTP请求,包括设置请求的URL,方法、请求头、请求体等。而使用Feign,你只需要定义一个接口,并在接口的方法上添加注解,就可以实现对其他服务的调用。Feign在运行时会根据接口定义自动创建代理实现,帮助你处理底层的HTTP请求细节。

Netflix的Feign默认集成了Eureka和Ribbon。

Feign的局限性

  1. NetFlix Feign不支持Spring MVC注解,如果在Spring Cloud使用Spring MVC注解的话,可以考虑使用Spring Cloud OpenFeign。
  2. NetFlix Feign在2018年宣布不再对其进行积极开发,虽然设计任然在维护和改进Feign但是毕竟不那么积极了。

OpenFeign是什么

OpenFeign也是一个HTTP客户端工具,它是基于Feign的封装和增强,使得在Spring Cloud环境中使用Feign更加强大和灵活。

  1. OpenFeign继承了Feign的声明式HTTP客户端的特性,允许开发者使用接口和注解来定义对其他服务的RESTful调用,从而简化了服务间通信的代码。

  2. OpenFeign还增加了一些功能,如自动负载均衡、而在Feign中,你需要手动使用Ribbon的相关注解来实现负载均衡。

  3. 支持熔断器:OpenFeign整合了Hystrix,提供了熔断器的功能,可以在服务不可用时快速失败,防止级联故障。这使得系统在面对服务故障时更加稳健。

在Spring Cloud项目中推荐使用OpenFeign来实现服务间通信,以获得更好的功能和集成性能。

二、为什么要有OpenFeign

为什么要有OpenFeign,它解决了什么问题。

  1. 相比较于传动发送HTTP请求,使用OpenFeign发送跨服务请求更加方便、灵活和高效。
  2. 更好的与Spring Cloud集成与其他组件(Eureka、Ribbon、Hystrix等)无缝集成,更加方便和高效。
  3. 自动负载均衡:OpenFeign整合了Ribbon,可以自动实现负载均衡,将请求分发给多个服务实例,提高了系统的可用性和性能。

三、如何使用OpenFeign

整个系统中有三个服务,Eurka服务,一个服务提供者,一个服务消费者。
在这里插入图片描述

如何搭建Eurka服务可以访问这篇博客【Spring Cloud 三】Eureka服务注册与服务发现

服务提供者order-service

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wangwei</groupId>
    <artifactId>order-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>order-service</name>
    <description>order-service</description>
    <properties>
        <java.version>8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

yml配置文件

server:
    port: 8080

spring:
    application:
        name: order-service

eureka:
    client:
        service-url: 
            defaultZone: http://localhost:8761/eureka
        register-with-eureka: true #设置为fasle 不往eureka-server注册
        fetch-registry: true #应用是否拉取服务列表到本地
        registry-fetch-interval-seconds: 10 #为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消耗回答

    instance: #实例的配置
        instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
        hostname: localhost #主机名称或者服务ip
        prefer-ip-address: true #以ip的形式显示具体的服务信息
        lease-renewal-interval-in-seconds: 10 #服务实例的续约时间间隔

启动类

@SpringBootApplication
@EnableEurekaClient
public class OrderServiceApplication {

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

}

实体

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Order {

    private Integer id;
    private String name;
    private Double price;
    private Date time;

}

ParamController

@RestController
public class ParamController {

    @GetMapping("testUrl/{name}/and/{age}")
    public String testUrl(@PathVariable("name")String name ,@PathVariable("age")Integer age){
        System.out.println(name+":"+age);
        return "ok";
    }

    @GetMapping("oneParam")
    public String oneParam(@RequestParam(required = false)String name){
        System.out.println(name);
        return "ok";
    }

    @GetMapping("twoParam")
    public String twoParam(@RequestParam(required = false)String name,@RequestParam(required = false)Integer age){
        System.out.println(name+":"+age);
        return "ok";
    }

    @PostMapping("oneObj")
    public String oneObj(@RequestBody Order order){
        System.out.println(order);
        return "ok";
    }

    @PostMapping("oneObjOneParam")
    public String twoParam(@RequestBody Order order,@RequestParam("name")String name){
        System.out.println(order+":"+name);

        return "ok";
    }
}

服务消费者user-service

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.wangwei</groupId>
    <artifactId>user-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user-service</name>
    <description>user-service</description>
    <properties>
        <java.version>8</java.version>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

yml配置文件

server:
    port: 8081

spring:
    application:
        name: user-service

eureka:
  client:
    service-url: 
      defaultZone: http://localhost:8761/eureka
    register-with-eureka: true #设置为fasle 不往eureka-server注册
    fetch-registry: true #应用是否拉取服务列表到本地
    registry-fetch-interval-seconds: 10 #为了缓解服务列表的脏读问题,时间越短脏读越少 性能相应的消耗回答


  instance: #实例的配置
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    hostname: localhost #主机名称或者服务ip
    prefer-ip-address: true #以ip的形式显示具体的服务信息
    lease-renewal-interval-in-seconds: 10 #服务实例的续约时间间隔

启动类

package com.wangwei.userservice;

import feign.Logger;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients //开启feign的客户端,才可以帮助我们发送调用
public class UserServiceApplication {

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

接口类

package com.wangwei.userservice.feign;

import com.wangwei.userservice.domain.Order;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.*;


/**
 * @FeignClient(value = "order-service")
 * value就是提供者的应用名称
 */
@FeignClient(value = "order-service")
public interface UserOrderFeign {

    /**
     * 你需要调用哪个controller 就写它的方法签名(除了方法体的一个方法的所有属性
     * @return
     */
    @GetMapping("doOrder")
     String doOrder();

    @GetMapping("testUrl/{name}/and/{age}")
    public String testUrl(@PathVariable("name")String name , @PathVariable("age")Integer age);

    @GetMapping("oneParam")
    public String oneParam(@RequestParam(required = false)String name);

    @GetMapping("twoParam")
    public String twoParam(@RequestParam(required = false)String name,@RequestParam(required = false)Integer age);

    @PostMapping("oneObj")
    public String oneObj(@RequestBody Order order);
    @PostMapping("oneObjOneParam")
    public String oneObjOneParam(@RequestBody Order order,@RequestParam("name")String name);
}

UserController

package com.wangwei.userservice.controller;

import com.wangwei.userservice.domain.Order;
import com.wangwei.userservice.feign.UserOrderFeign;
import feign.Feign;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;


@RestController
public class UserController {

    @Autowired
    private UserOrderFeign userOrderFeign;
    

    /**
     * 总结:
     * feign的默认等待时间为1s
     * 超过1s就直接报错了
     *
     * @return
     */

    @GetMapping("userDoOrder")
    public String userDoOrder(){
        //这里发起远程调用
        String result = userOrderFeign.doOrder();
        return result;
    }


    @GetMapping("testParam")
    public String testParam(){
        String url = userOrderFeign.testUrl("David", 18);
        System.out.println(url);


        String david = userOrderFeign.oneParam("David");
        System.out.println(david);

        String wangwei = userOrderFeign.twoParam("wangwei", 18);
        System.out.println(wangwei);

        Order order = Order.builder()
                .name("西蓝花")
                .price(5D)
                .time(new Date())
                .id(1)
                .build();
        String s = userOrderFeign.oneObj(order);
        System.out.println(s);


        String wangwei1 = userOrderFeign.oneObjOneParam(order, "wangwei");
        System.out.println(wangwei1);
        return "ok";


    }
}

运行效果

先启动Eureka服务再启动服务提供者,最后启动服务消费者。

如下图所示已经调用成功。
在这里插入图片描述

在这里插入图片描述

调用超时配置

因为ribbon默认调用超时时长为1s,可以进行修改,可以查看DefaultClientConfigImpl。

我们在服务提供者order-service中新建一个controller,进行超时测试。

@RestController
public class OrderController {

    @GetMapping("doOrder")
    public String doOrder(){
        try{
            //模拟操作数据库等 耗时2s
            TimeUnit.SECONDS.sleep(2);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        return "牛奶-鸡蛋-麦片";
    }
}

然后我们通过服务消费者user-service进行调用测试:
可以发现出现了超时。
在这里插入图片描述
我们可以在消费者的配置文件中声明Ribbon的超时时间。

# feign只是帮你封装了远程调用的功能 底层还是ribbon 所以我们需要去修改ribbon的时间

ribbon:
    ReadTimeout: 3000 # 3s超时时间(从服务器读取到可用资源所用的时间)
    ConnectTimeout: 3000 #连接服务超时时间

添加这个配置就行了。

五、OpenFeign调用参数的处理

首先传参确保消费者和提供者的参数列表一致,包括返回值,方法签名。

  1. 通过URL传参,GET请求,参数列表使用@PathVariable
  2. 如果是GET请求,每个基本参数必须加上@RequestParam
  3. 如果是POST请求,而且是对象集合等参数,必须加上@RequestBody或者@RequestParam

六、OpenFeign日志打印功能

OpenFeign还提供了日志打印功能,通过日志打印功能,能够清晰的看到发送的HTTP请求中的细节。

总结

在Spring Cloud中是OpenCluod的步骤主要是,引入openFeign依赖;启动类添加开启openFeign客户端;声明与服务端相同的方法并添加对应注册;需要注意根据项目情况配置调用服务的超时时间。

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

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

相关文章

嵌入式该往哪个方向发展?

1. 你所在的城市嵌入式Linux岗位多吗&#xff1f;我觉得这是影响你做决定的另一个大问题。我们学嵌入式Linux这门技术&#xff0c;绝大部分人是为了从事相关的工作&#xff0c;而不是陶冶情操。但是根据火哥统计来看&#xff0c;嵌入式Linux的普遍薪资虽然高于单片机&#xff0…

【计算机视觉 | 目标检测】arxiv 计算机视觉关于目标检测的学术速递(7 月 28 日论文合集)

文章目录 一、检测相关(11篇)1.1 Adaptive Segmentation Network for Scene Text Detection1.2 EFLNet: Enhancing Feature Learning for Infrared Small Target Detection1.3 MIM-OOD: Generative Masked Image Modelling for Out-of-Distribution Detection in Medical Image…

CSS中所有选择器详解

文章目录 一、基础选择器1.标签选择器2.类选择器3.id选择器4.通配符选择器 二、复合选择器1.交集选择器2.并集选择器 三、属性选择器1.[属性]2.[属性属性值]3.[属性^属性值]4.[属性$属性值]5.[属性*属性值] 四、关系选择器1.父亲>儿子2.祖先 后代3.兄弟4.兄~弟 五、伪类选择…

NTT DATA利用相干伊辛机模拟基因组组装和疾病治疗的潜力

​ &#xff08;图片来源&#xff1a;网络&#xff09; 7月20日&#xff0c;日本领先的IT服务提供商和行业咨询公司NTT DATA宣布完成了一个使用量子计算优化基因组组装过程的项目。这是量子计算应用于医疗保健和生命科学行业中的一个里程碑。 本项目通过比较量子和非量子计算方…

Ubuntu18.04 安装opencv 4.8.0教程(亲测可用)

1. 安装准备 安装前需要下载一些必须的依赖项。 不同版本opencv依赖会有不同&#xff0c;具体见官网opencv安装 sudo apt-get install build-essential sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev sudo apt-…

Elasticsearch官方测试数据导入

一、数据准备 百度网盘链接 链接&#xff1a;https://pan.baidu.com/s/1rPZBvH-J0367yQDg9qHiwQ?pwd7n5n 提取码&#xff1a;7n5n文档格式 {"index":{"_id":"1"}} {"account_number":1,"balance":39225,"firstnam…

(附代码)视觉激光雷达信息融合与联合标定

目录 一、引言 福利&#xff1a;文末有chat-gpt纯分享&#xff0c;无魔法&#xff0c;无限制 二、联合标定转换关系 三、相机标定 四、联合标定 五、视觉与点云信息融合 5.1 image2points 5.2 points2image 六、总结 一、引言 最近在为车辆添加障碍物检测模块&#xf…

【雕爷学编程】MicroPython动手做(31)——物联网之Easy IoT

1、物联网的诞生 美国计算机巨头微软(Microsoft)创办人、世界首富比尔盖茨&#xff0c;在1995年出版的《未来之路》一书中&#xff0c;提及“物物互联”。1998年麻省理工学院提出&#xff0c;当时被称作EPC系统的物联网构想。2005年11月&#xff0c;国际电信联盟发布《ITU互联网…

Nginx源码安装

文章目录 Nginx源码安装注安装pcre库安装openssl库创建用户及用户组安装编译环境解压文件检测环境重要目录检查配置服务启动脚本查看效果&#xff1a; Nginx源码安装 注 本实验基于RHEL73.10.0-327.el7.x86_64&#xff0c;尽量使用RHEL7或CentOS7。 安装pcre库 安装 pere 库…

(自控原理)线性系统的根轨迹法

目录 一、根轨迹法的基本概念 1、根轨迹概念 2、根轨迹方程 二、根轨迹绘制的基本法则 1、绘制根轨迹基本法则 三、系统性能的分析 1、闭环零点与时间响应 一、根轨迹法的基本概念 1、根轨迹概念 三大分析矫正方法&#xff1a;时域法、复域法(根轨迹法)、频域法 2、根…

【网络】数据链路层

目录 一、以太网 二、以太网帧格式 三、 MTU 1、MTU概念 2、 MTU对IP协议的影响 3、MTU对UDP协议的影响 4、 MTU对于TCP协议的影响 四、MAC地址 五、 ARP协议 1、ARP协议的作用 2、ARP协议的工作流程 3、ARP数据报的格式 4、中间人 数据链路层解决的&#xff0c;是…

mysql使用SUBSTRING_INDEX拆分字符串,获取省、市、县和详细现住址

mysql使用SUBSTRING_INDEX拆分字符串&#xff0c;获取省、市、县和详细现住址 一、如何把"江西-上饶市-广丰县-大南镇古村村张家82号"拆分为省、市、县和详细现住址二、mysql的解决办法 一、如何把"江西-上饶市-广丰县-大南镇古村村张家82号"拆分为省、市、…

基于 Redux + TypeScript 实现强类型检查和对 Json 的数据清理

基于 Redux TypeScript 实现强类型检查和对 Json 的数据清理 突然像是打通了任督二脉一样就用了 generics 搞定了之前一直用 any 实现的类型…… 关于 Redux 的部分&#xff0c;这里不多赘述&#xff0c;基本的实现都在这里&#xff1a;Redux Toolkit 调用 API 的四种方式 和…

路桥隧施工管理平台(BIM+实景+GIS)

引言 中科图新公路工程BIMGIS可视化项目管理平台是一种高效的项目管理工具&#xff0c;通过将BIM技术与3DGIS技术融合&#xff0c;实现了宏观地理信息与微观工程模型的集成显示。 该平台为项目管理提供了直观、准确的三维工程虚拟环境&#xff0c;对主要三维空间对象&#xff…

【Java】springboot框架 粮油质量溯源MES生产加工管理系统源码

粮油质量溯源MES生产加工管理系统源码&#xff0c;实现一物一码&#xff0c;全程追溯&#xff0c;正向追踪&#xff0c;逆向溯源。技术架构&#xff1a;spring bootmybatiseasyuimysql 。 粮油生产质量追溯系统实现种植主体、种植基地、生产计划、压榨、精炼、包装、销售、物料…

智能物流千人俱乐部---正式开启!

经过半年的筹备&#xff0c;【研习社智能物流千人俱乐部】今天起正式对外开放。 会员可以直接互相对接联系。 目前已经有100多家各行业代表&#xff08;用户、甲方&#xff09;加入了千人俱乐部。 行业精英主要来自供应链管理、食品、金融供应链、铁路、精密制造、商超电商、电…

实战:k8s里通过argoCD部署jenkins-2023.7.24(测试成功)

实战&#xff1a;k8s里通过argoCD部署jenkins-2023.7.24(测试成功) 目录 实验环境 操作系统&#xff1a; CentOS8 Linux &#xff08;我本次用centos7.6&#xff09; 内存资源&#xff1a;32GB &#xff08;自己nuc机器32G内存&#xff09; 实验软件版本&#xff1a; 工具名…

MySQL 与MongoDB区别

一、什么是MongoDB呢 ? MongoDB 是由C语言编写的&#xff0c;是一个基于分布式文件存储的开源数据库系统。在高负载的情况下&#xff0c;添加更多的节点&#xff0c;可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一…

【高危】Apache NiFi 远程资源检索功能存在命令注入漏洞

漏洞描述 Apache NiFi 是一个开源的数据流处理和自动化工具。 Apache NiFi 1.23.0之前版本中包含使用 HTTP URL 进行远程资源检索的 Processors 和 Controller Services&#xff0c;但是未限制普通身份用户配置此功能。经过身份验证的攻击者可配置恶意的外部资源引用地址&…

现场直击!飞凌嵌入式亮相第13届配电技术应用论坛

2023年8月3日&#xff0c;第十三届配电技术应用论坛在杭州开幕&#xff0c;飞凌嵌入式携多款重量级产品及热门方案亮相本届论坛&#xff0c;展位号A49。 飞凌嵌入式作为专注嵌入式核心控制系统研发、设计和生产的高新技术企业&#xff0c;与来自全国各地的行业伙伴共同分享市场…