spring cloud 入门

学习目标:

学习spring cloud项目快速搭建方法,学习nacos注册中心使用,实现两个服务间的调用

学习内容:

一、Spring Cloud介绍

在这里插入图片描述

  • Spring 以 Bean(对象) 为中心,提供 IOC、AOP 等功能。
  • Spring Boot 以 Application(应用) 为中心,提供自动配置、监控等功能。
  • Spring Cloud 以 Service(服务) 为中心,提供服务的注册与发现、服务的调用与负载均衡等功能。

Spring Cloud 官方对自己的简短介绍:基于 Spring 构建分布式系统的工具集,简称“Spring 全家桶”。
Spring Cloud 官方对功能点的介绍:
【配置中心】Distributed/versioned configuration
【注册中心】Service registration and discovery
【API 网关】Routing
【服务调用】Service-to-service calls
【负载均衡】Load balancing
【服务容错】Circuit Breakers
【分布式消息】Distributed messaging
SpringCloudAlibaba介绍:Spring Cloud 是分布式微服务架构的一站式解决方案,它提供了一套简单易用的编程模型,使我们能在 Spring Boot 的基础上轻松地实现微服务系统的构建。 Spring Cloud 提供以微服务为核心的分布式系统构建标准。
在这里插入图片描述
Spring Cloud 提供了非常强大的功能,但是它并不提供所有的实现,而是通过 Spring Cloud Common 子项目,定义了统一的抽象 API。而后,不同厂商结合其自身的中间件,提供自己的 Spring Cloud 套件,Spring Cloud 官方、Netflix、Alibaba 三者整理成如下表格
在这里插入图片描述

二、Spring Cloud项目快速搭建

2.1技术选型

SpringCloud版本与SpringBoot对应关系:Spring Cloud 官方
在这里插入图片描述
SpringCloudAlibaba对应关系:版本发布说明 | Spring Cloud Alibaba
在这里插入图片描述
由于主机jdk安装的是1.8因此选用如下技术栈:
基础版本:
<spring.boot.version>2.6.13</spring.boot.version>
<spring.cloud.version>2021.0.5</spring.cloud.version>
<spring.cloud.alibaba.version>2021.0.5.0</spring.cloud.alibaba.version>
技术选型:
注册中心:spring-cloud-starter-alibaba-nacos-discovery
配置中心:spring-cloud-starter-alibaba-nacos-config
服务调用:spring-cloud-starter-openfeign
负载均衡:spring-cloud-loadbalancer
API网关:spring-cloud-starter-gateway

2.2创建SpringCloud父工程

2.2.1 创建maven工程

在这里插入图片描述

2.2.2 修改pom文件,指定依赖版本
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>cloudDemo</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>gatewey</module>
        <module>feignconsumer</module>
        <module>feignprovide</module>
    </modules>
    <name>cloudDemo Maven Webapp</name>
    <url>http://maven.apache.org</url>

    <!-- 统一管理jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>

        <spring.boot.version>2.6.13</spring.boot.version>
        <spring.cloud.version>2021.0.5</spring.cloud.version>
        <spring.cloud.alibaba.version>2021.0.5.0</spring.cloud.alibaba.version>
        <lombok.version>1.18.28</lombok.version>
    </properties>

    <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写groupId和version  -->
    <dependencyManagement>
        <dependencies>

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring.boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <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>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <optional>true</optional>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

            </plugin>
        </plugins>
    </build>
</project>

2.3创建网关demo

2.3.1 网关的功能

性能:API高可用,负载均衡,容错机制。
安全:权限身份认证、脱敏,流量清洗,后端签名(保证全链路可信调用),黑名单(非法调用的限制)。
日志:日志记录(spainid,traceid)一旦涉及分布式,全链路跟踪必不可少。
缓存:数据缓存。
监控:记录请求响应数据,api耗时分析,性能监控。
限流:流量控制,错峰流控,可以定义多种限流规则。
灰度:线上灰度部署,可以减小风险。
路由:动态路由规则

2.3.2 新建gateway子模块

1、创建maven项目,修改pom.xml文件

<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/maven-v4_0_0.xsd">
    <parent>
        <artifactId>cloudDemo</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>gatewey</artifactId>
    <packaging>war</packaging>
    <name>gatewey Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <exclusions>
                <!-- 排除web依赖-->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

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

        <!-- nacos 客户端 作为 注册与发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!-- nacos 配置中心 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

    </dependencies>
    <build>
        <finalName>gatewey</finalName>
    </build>
</project>

2、添加启动类GatewayApplication.java

package cloud.demo.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;

/**
 * @ClassName GatewayApplication
 * @Description TODO
 * @Author c_see
 * @Date 2024/2/29 11:22
 * @Version 1.0
 **/
@SpringBootApplication
@EnableDiscoveryClient
@ComponentScan(basePackages = {"cloud.demo"})
public class GatewayApplication {


    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
        System.out.println("网关启动成功");
    }
}

3、添加配置文件application.yaml

server:
  port: 8081
spring:
  profiles:
    active: dev
  application:
    name: gateway-demo
  cloud:
    gateway:
      discovery:
        locator:
          # 是否与服务发现组件进行结合,通过 serviceId 转发到具体的服务实例。默认为false
          enabled: true
          lower-case-service-id: true #使用小写service-id
    nacos:
      username: nacos
      password: nacos
      config:
        server-addr: 127.0.0.1:8848
        namespace: public
  
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public

  config:
    import:
      - optional:nacos:gateway-demo.yml?refreshEnabled=true

4、在nacos中添加配置gateway-demo.yml,配置动态路由


spring:
  cloud:
    gateway:
      routes: # 网关路由配置
        # 路由id,自定义,只要唯一即可
        - id: feignconsumer 
          # 目标服务地址(uri:地址,请求转发后的地址)
          # uri: http://127.0.0.1:8081 路由的目标地址http 就是固定地址,uri的协议为lb,表示启用Gateway的负载均衡功能。
          # 路由的目标地址lb就是负载均衡,后面跟服务名称
          uri: lb://feign-consumer
          # 路由断言,也就是判断请求是否符合路由规则的条件;转发地址格式uri/archive
          predicates: 
          # 这个是按照路径匹配,只要以 /user/ 开头就符合要求
            - Path=/user/** 
          #fitters:
          #  - RewritePath=/user/?(?<segment>.*),/$\{segment}
        - id: feignprovide
          uri: lb://feign-provide
          predicates:
            - Path=/provide/**
            # 在这个时间之后的请求才会被转发
            #- After=2031-04-13T15:14:47.433+08:00[Asia/Shanghai]
      

2.4 创建服务提供者

1、创建feign-provide子模块,修改pom.xml
<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/maven-v4_0_0.xsd">
    <parent>
        <artifactId>cloudDemo</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>feignprovide</artifactId>
    <packaging>war</packaging>
    <name>feignprovide Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <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>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- feign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>
    </dependencies>
    <build>
        <finalName>feignprovide</finalName>
    </build>
</project>

2.创建启动类ProvideApplication
package cloud.demo.provide;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

/**
 * @ClassName ProvideApplication
 * @Description TODO
 * @Author c_see
 * @Date 2024/2/29 14:28
 * @Version 1.0
 **/
@EnableDiscoveryClient
@SpringBootApplication
public class ProvideApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProvideApplication.class, args);
        System.out.println("ProvideApplication 启动成功");
    }
}

3.创建配置文件application.yaml
server:
  port: 8082
spring:
  profiles:
    active: dev
  application:
    name: feign-provide
  cloud:
    nacos:
      username: nacos
      password: nacos
      config:
        server-addr: 127.0.0.1:8848
        namespace: public

      discovery:
        server-addr: 127.0.0.1:8848
        namespace: public



4、创建测试接口类UserProvideController
package cloud.demo.provide.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("user")
public class UserProvideController {

    @Value("${server.port}")
    private String port;

    /**
     * 通过用户ID获取用户
     * @param userId
     * @return
     */
    @GetMapping("/getUser/{userId}")
    public String getUser(@PathVariable("userId") String userId){

        return String.format("【%s-服务提供者】:%s", port, userId);
    }


}


2.5 创建消费者子模块

1.创建feign-consumer子模块,修改pom.xml
<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/maven-v4_0_0.xsd">
    <parent>
        <artifactId>cloudDemo</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>feignconsumer</artifactId>
    <packaging>war</packaging>
    <name>feignconsumer Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
        </dependency>
        <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>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <!-- feign -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

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

    </dependencies>
    <build>
        <finalName>feignconsumer</finalName>
    </build>
</project>

2. 创建feign客户端UserClient
package cloud.demo.consumer.client;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * 有关消费者client,配置需要调用服务者的名字
 */
@FeignClient(name = "feign-provide") //对应的要调用提供者服务名spring.application.name
public interface UserClient {

    /**
     * 通过用户id获取用户
     * @param userId
     * @return
     */
    @GetMapping("/user/getUser/{userId}")//对应要调用提供者的controller
    String getUser(@PathVariable("userId") String userId);
}

3.创建启动类ConsumerApplication
package cloud.demo.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * @ClassName ConsumerApplication
 * @Description TODO
 * @Author c_see
 * @Date 2024/2/29 14:10
 * @Version 1.0
 **/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "cloud.demo.consumer.client")
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
        System.out.println("ConsumerApplication 启动成功");
    }
}

4.创建配置文件application.yaml
server:
  port: 8083
spring:
  profiles:
    active: dev
  application:
    name: feign-consumer
  cloud:
    nacos:
      username: nacos
      password: nacos
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yml
      discovery:
        server-addr: 127.0.0.1:8848

4.创建测试接口类FeignConsumerController
package cloud.demo.consumer.controller;

import cloud.demo.consumer.client.UserClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * 平台controller业务逻辑,引入client出发消费者调用提供者
 */
@RestController
@RequestMapping("user")
public class FeignConsumerController {

    @Value("${server.port}")
    private String port;

    @Resource
    private UserClient userClient;

    /**
     * 通过用户ID获取用户
     * @param userId
     * @return
     */
    @GetMapping("/getUserInfo/{userId}")
    public String getUserInfo(@PathVariable("userId") String userId){

        String user = userClient.getUser(userId);
        return String.format("【%s-Demo消费者】:调用Feign接口返回值 %s", port, user);
    }

}


2.5 测试结果

1、启动gateway、feign-provide、feign-consumer 3个模块,启动成功后在nacos可以看到服务注册成功
在这里插入图片描述
2、测试服务间调用
在这里插入图片描述
3、测试通过网关调用微服务
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用链表和数组输出A~Z的ASCII码

输出结果 26个字母以及其对应的ASCII码 一、使用链表创建&#xff0c;注意&#xff1a; 节点需要有next指针初始化时head需要new一下 cur指针代表当前指针&#xff0c;每次不断的New新的节点&#xff0c;pre指针代表当前指针的前一个指针&#xff0c;每次pre的next指针指向cur…

Unity将4个纹理图拼接成1个纹理

需要的效果 最终实现的效果大概如下: 4个贴图上去 这里随便放一个切分的图。 Shader代码如下 直接上代码: // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)// Unlit shader. Simplest possible textured shad…

基础小白快速入门Python------>模块的作用和意义

模块&#xff0c; 这个词听起来是如此的高大威猛&#xff0c;以至于萌新小白见了瑟瑟发抖&#xff0c;本草履虫见了都直摇头&#xff0c;好像听上去很难的样子&#xff0c;但是但是&#xff0c;年轻人&#xff0c;请听本少年细细讲述&#xff0c;他只是看起来很难&#xff0c;实…

猫毛过敏养猫人士的必备养猫好物-宠物空气净化器品牌分享

许多猫奴在与猫相处一段时间后突然对猫毛过敏&#xff0c;这真是令人难受。一些人认为对猫咪过敏是因为它们在空气中飘浮的毛发引起的&#xff0c;但实际上大部分人之所以过敏是因为对猫身上一种微小的蛋白质过敏。这种导致过敏的蛋白质附着在猫咪的一些皮屑上。我们都知道猫咪…

uniapp同步将本地图片转换为base64,支持微信、H5、APP

接上篇&#xff0c;少了一个方法的源代码。 先上代码&#xff1a; ploadFilePromiseSync (url) > { return new Promise((resolve, reject) > { // #ifdef MP-WEIXIN uni.getFileSystemManager().readFile({ filePath: url, encoding: base64, success: res > { let …

总结一下linux性能检测和调优手段

1.perf 是 Linux 系统中性能分析工具&#xff0c;用于收集性能相关的信息。它可以用于查看 CPU 使用情况、内存性能、磁盘 I/O 等&#xff0c;以帮助开发者找到性能瓶颈。 以下是一些 perf 常见用法和示例&#xff1a; 1. CPU Profiling a. 查看 CPU 使用率 perf stat -e cpu…

C++ 快速排序快速选择

目录 1、75. 颜色分类 2、912. 排序数组 3、 215. 数组中的第K个最大元素 4、LCR 159. 库存管理 III 1、75. 颜色分类 思路&#xff1a;利用快速排序思路&#xff0c;使用三指针分块进行优化。 [0,left]——小于key[left1,right-1]——等于key[right,nums.size()]——大于k…

金三银四跳槽季,你不得不知道的5个面试技巧

正式进入金三银四招聘季了&#xff0c;即将投入求职大战的小伙伴们&#xff0c;你真的准备好了吗&#xff1f; 别急&#xff0c;在参加面试前&#xff0c;请你看完这篇文章&#xff0c;相信面试成功率会提升不少。 1 “能力不如你&#xff0c;却薪资比你高” 背后隐藏的逻辑 …

前端src中图片img标签资源的几种写法?

在 Vue 项目中引用图片路径有几种不同的方法&#xff0c;具体取决于你的项目结构和配置。以下是几种常见的方式&#xff1a; 1. 静态资源目录 (Public) 如果你的图片放在了项目的 public 目录下&#xff08;例如&#xff0c;Vite 和 Create Vue App 脚手架工具通常使用这个目…

wps软件怎么压缩文件?这样操作就可以~

WPS Office是一款功能强大的办公软件套件&#xff0c;其中包括文字处理、表格编辑和演示文稿制作等功能。在本文中&#xff0c;我们将介绍如何利用WPS软件以及其他压缩工具进行文件压缩&#xff0c;让您在处理文件时更加便捷高效。 除了这些基本功能外&#xff0c;WPS Office还…

lettuce webdriver 自动化测试---玩转BDD

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

指针进阶(一)

文章目录 1:字符指针变量2:指针数组3:数组指针3.1数组指针的定义3.2:&数组名vs数组名 4:数组参数,指针参数4.1:一维数组传参的本质4.1.1:场景一4.1.2:场景二4.1.3:场景三4.1.4:场景四4.1.5:场景五 4.2:二维数组传参的本质4.2.1:场景一4.2.2:场景二4.2.3:场景三4.2.4:场景四…

光影魔术师:Photoshop 2022——你的创意无限可能

在数字艺术的广阔天地中&#xff0c;有一款软件如同魔法师般&#xff0c;以其强大的功能和无尽的可能性&#xff0c;引领着无数创意者探索未知的视觉世界。它&#xff0c;就是Adobe Photoshop 2022。 无论是Mac还是Windows系统&#xff0c;Photoshop 2022都以其卓越的兼容性&a…

mysql数据库操作小寄巧

目录 json字段查询时间相关只有日期只有时间又有时间又有日期时间比较时间运算 某字段同的取最新数据&#xff08;软性的新数据覆盖旧数据查找&#xff09;sql_modeonly_full_group_by的解决办法优化思路 json字段查询 查询某个json字段&#xff08;xx&#xff09;的某个属性下…

从http到websocket

阅读本文之前&#xff0c;你最好已经做过一些websocket的简单应用 从http到websocket HTTP101HTTP 轮询、长轮询和流化其他技术1. 服务器发送事件2. SPDY3. web实时通信 互联网简史web和httpWebsocket协议1. 简介2. 初始握手3. 计算响应健值4. 消息格式5. WebSocket关闭握手 实…

Python复合型数据避坑指南

目录 前言 列表&#xff08;Lists&#xff09; 1. 修改可变对象 2. 浅拷贝和深拷贝 元组&#xff08;Tuples&#xff09; 集合&#xff08;Sets&#xff09; 字典&#xff08;Dictionaries&#xff09; 1. 键值唯一性 2. 键的类型 实际应用场景 1. 数据分析与清洗 2. 网络…

SDR架构 (一)为什么基带有I和Q路?

我之前做过自己的RTL-SDR。一直有一个疑惑。为啥rtl2832u芯片有一对差分I路&#xff0c;还有一对差分Q路。差分很好理解是为了抗干扰&#xff0c;但为啥要I和Q呢&#xff1f;并且我也知道不少人在自己修改的时候&#xff0c;保留I路对接在r820t2&#xff08;跟原版一样&#xf…

CentOS8 同步时间chrony ntpdate已无法使用

CentOS8系统中&#xff0c;原有的时间同步服务 ntp/ntpdate服务已经无法使用&#xff0c;使用yum安装&#xff0c;提示已不存在。 [rootlocalhost ~]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) [rootlocalhost ~]# yum install ntp 上次元数据过期检查…

深入理解Linux线程(LWP):概念、结构与实现机制(2)

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;会いたい—Naomile 1:12━━━━━━️&#x1f49f;──────── 4:59 &#x1f504; ◀️ ⏸ ▶️ ☰ &a…

2024年经典【自动化面试题】附答案

一、请描述一下自动化测试流程&#xff1f; 自动化测试流程一般可以分为以下七步&#xff1a; 编写自动化测试计划&#xff1b; 设计自动化测试用例&#xff1b; 编写自动化测试框架和脚本&#xff1b; 调试并维护脚本&#xff1b; 无人值守测试&#xff1b; 后期脚本维…